将分支指针移到不同的提交而不结账

要移动签出分支的分支指针,可以使用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 -freset --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 guigitk也可以很好地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”下,检查新指针是否正确
    • 检查“强制”

在这里输入图像描述

在这里输入图像描述