将分支指针移到不同的提交而不结账
要移动签出分支的分支指针,可以使用git reset --hard
命令。 但是如何移动未检出分支的分支指针指向不同的提交(保留所有其他东西,像跟踪远程分支)?
NB如果你只是想把一个分支移动到另一个提交,最简单的方法是
git branch -f branch-name new-tip-commit
如Chris Johnsen所详述。
你可以做任意裁判。 这是如何移动分支指针的:
git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>
一般forms:
git update-ref -m "reset: Reset <branch> to <new commit>" <ref> <commit>
如果你愿意的话,你可以select关于reflog消息的nits – 我相信这个branch -f
与reset --hard
不同reset --hard
这个branch -f
,这不完全是其中之一。
git branch -f branch-name new-tip-commit
你也可以通过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
:
- 右键点击你想要的提交
- – > 创build新的分支
- input现有分支的名称
- 按回车确认replace该名称的旧分支的对话框。
请注意,重新创build而不是修改现有分支将会丢失跟踪分支信息 。 (对于只有一个远程的简单用例,这个通常不是问题,你的本地分支与远程的相应分支具有相同的名字。请参阅评论的更多细节,感谢@mbdevpl指出了这个缺点。
这将是很酷,如果gitk
有一个function,对话框有3个选项:覆盖,修改现有,或取消。
即使你通常是像我这样的命令行迷, git gui
和gitk
也可以很好地devise它们允许的git用法的子集。 我强烈build议使用它们,他们擅长什么(即有select地进入/离开索引在git gui中,也只是提交(ctrl-s添加签名:行,按Ctrl – input提交。)
gitk
非常适合跟踪一些分支,而你把你的修改整理成一个很好的修补程序系列来提交上游,或者其他你需要跟踪你在多个分支中间的东西。
我甚至没有打开graphics文件浏览器,但我喜欢gitk / git gui。
只是为了丰富讨论,如果你想移动myBranch
分支到你当前的提交,只是省略-f
后的第二个参数
例:
git branch -f myBranch
我一般这样做,当我rebase
在一个独立的头状态:)
推荐的解决schemegit branch -f branch-pointer-to-move new-pointer
在TortoiseGit中 :
- “Git显示日志”
- 选中“所有分支”
- 在你想要分支指针移动到(新指针)的行上:
- 右键单击“在此版本创build分支”
- 在“分支”旁边,input要移动的分支的名称(分支指针移动)
- 在“Base On”下,检查新指针是否正确
- 检查“强制”
- 好