Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 将分支指针移动到不同的提交而不签出_Git_Git Branch - Fatal编程技术网

Git 将分支指针移动到不同的提交而不签出

Git 将分支指针移动到不同的提交而不签出,git,git-branch,Git,Git Branch,要移动签出分支的分支指针,可以使用git reset--hard命令。但是如何将未签出分支的分支指针移动到另一个提交点(保持所有其他内容,如跟踪远程分支)?git branch-f[] 如果省略了新提示提交,则默认为当前提交。您可以对任意引用执行此操作。以下是如何移动分支指针: git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <

要移动签出分支的分支指针,可以使用
git reset--hard
命令。但是如何将未签出分支的分支指针移动到另一个提交点(保持所有其他内容,如跟踪远程分支)?

git branch-f[]

如果省略了
新提示提交
,则默认为当前提交。

您可以对任意引用执行此操作。以下是如何移动分支指针:

git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>

如果您愿意,您可以对reflog消息进行挑剔-我相信
分支-f
重置--hard
不同,这两者都不完全相同。

您还可以传递
git reset--hard
提交引用

例如:

git checkout branch-name
git reset --hard new-tip-commit
我发现我半频繁地做这样的事情:

假设这段历史

$ git log --decorate --oneline --graph
* 3daed46 (HEAD, master) New thing I shouldn't have committed to master
* a0d9687 This is the commit that I actually want to be master

# Backup my latest commit to a wip branch
$ git branch wip_doing_stuff

# Ditch that commit on this branch
$ git reset --hard HEAD^

# Now my changes are in a new branch
$ git log --decorate --oneline --graph
* 3daed46 (wip_doing_stuff) New thing I shouldn't have committed to master
* a0d9687 (HEAD, master) This is the commit that I actually want to be master
在gitk中--all:

  • 右键单击所需的提交
  • ->创建新分支机构
  • 输入现有分支机构的名称
  • 在对话框上按return键,确认替换该名称的旧分支
请注意,重新创建而不是修改现有分支将丢失跟踪分支信息。(对于只有一个远程分支且您的本地分支与远程中的相应分支同名的简单用例,这通常不是问题。有关更多详细信息,请参阅注释,感谢@mbdevpl指出这一缺点。)

如果
gitk
有一个对话框有3个选项的功能,那就太酷了:覆盖、修改现有或取消


即使你像我一样是一个命令行迷,
git-gui
gitk
都是针对git使用的子集而设计的。我强烈建议您根据自己的专长使用它们(例如,在git gui中有选择地将大块头放入/移出索引,也只是提交)

<>代码> GITK/<代码>对于跟踪几个分支是很好的,同时你把你的变化整理成一个很好的补丁序列来提交上游,或者任何你需要跟踪你在多个分支中间的东西。 我甚至没有打开图形文件浏览器,但我喜欢gitk/git gui。

在:

  • “Git显示日志”
  • 选中“所有分支”
  • 在希望分支指针移动到的行上(新指针):
    • 右键单击“在此版本创建分支”
    • 在“分支”旁,输入要移动的分支的名称(要移动的分支指针)
    • 在“基于”下,检查新指针是否正确
    • 检查“力”


为了丰富讨论内容,如果要将
myBranch
分支移动到当前的提交,只需省略
-f

例如:

git分行-f myBranch



我通常在头处于分离状态时重新设置基础时这样做:)

老实说,我很惊讶没有人想到git push命令:

git push -f . <destination>:<branch>
git推送-f.:
点(.)表示本地存储库,您可能需要-f选项,因为目标可能“位于其远程对应的后面”


尽管此命令用于保存服务器中的更改,但结果与将远程分支(
)移动到与签出分支的本地分支(

相同的提交(如果要指向的提交在当前分支之前)完全相同(除非您希望撤消当前分支的最后一次提交,否则应该是这样),您只需执行以下操作:

git merge --ff-only <commit>

打开文件
.git/refs/heads/
,将其中存储的哈希更改为要移动分支头的哈希。只需使用任何文本编辑器编辑并保存文件。只需确保要修改的分支不是当前活动的分支


免责声明:可能不是一种可取的方法,但可以完成任务。

如果要将未签出的分支移动到另一个提交,最简单的方法是使用-f选项运行git branch命令,该命令确定分支头应指向的位置:

吉特分行-f

请小心,如果您尝试移动的分支是当前分支,则此操作将不起作用。 要移动分支指针,请运行以下命令: git更新参考-m“重置:重置为”参考/heads/

git update ref命令安全地更新ref中存储的对象名


希望,我的回答对您有所帮助。信息来源是。

或者对于任意引用,
git update ref-m“reset:reset to”
(如果您愿意,您可以选择有关reflog消息的细节-我相信
分支-f
reset--hard
不同,这两者都不是。)Jefromi,请写一个单独的答案,这样你就可以得到选票了。:)这是一个更好的答案,因为它处理了99%的情况,并且实际上符合文档
git help branch
说“-f,-force Reset to if已经存在。如果没有-f,git branch拒绝更改现有分支。“我正在做
git branch-f master
,它告诉我
致命:无法强制更新当前分支。
嗯,我现在必须做什么,在允许我使用此命令之前,请查看其他随机分支?如果您尝试移动的分支是您当前的分支(
HEAD
指向它),则此操作将不起作用。听起来您想要做的只是从一个不同的提交中创建一个分支,而不是从现在开始创建。如果我的理解是正确的,那么为什么不直接从commit创建一个新的分支呢?您想使用
git-br创建它
git push -f . <destination>:<branch>
git merge --ff-only <commit>
git push . <commit>:<branch>