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

时间:2011-03-29 10:37:04

标签: git git-branch

要移动已签出分支的分支指针,可以使用git reset --hard命令。但是如何移动未检出分支的分支指针指向不同的提交(保留所有其他东西,如跟踪的远程分支)?

11 个答案:

答案 0 :(得分:854)

git branch -f <branch-name> <new-tip-commit>

答案 1 :(得分:476)

  

N.B。如果您只是想将分支移动到另一个提交,那么   最简单的方法是

     

git branch -f branch-name new-tip-commit

     

as detailed by Chris Johnsen's answer

你可以为任意引用做到这一点。这是移动分支指针的方法:

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

一般形式:

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

如果您愿意,可以选择有关reflog消息的尼特 - 我相信branch -freset --hard不同,这不完全是其中之一。

答案 2 :(得分:123)

您还可以传递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

答案 3 :(得分:37)

只是为了丰富讨论,如果您想将myBranch分支移动到当前提交,只需在-f之后省略第二个参数

示例:

git branch -f myBranch

我通常在处于分离的HEAD状态时rebase执行此操作:)

答案 4 :(得分:11)

gitk --all

  • 右键单击您想要的提交
  • - &GT; 创建新分支
  • 输入现有分支的名称
  • 按<=>确认替换该名称的旧分支的对话框上的返回。

请注意,重新创建而不是修改现有分支将丢失跟踪分支信息。 (对于简单的用例而言,这通常不是问题,因为只有一个远程和你的本地分支与远程中相应的分支具有相同的名称。请参阅注释以获取更多详细信息,感谢@mbdevpl指出这一点缺点。)

如果gitk具有对话框有3个选项的功能,那将会很酷:覆盖,修改现有或取消。

即使您通常是像我一样的命令行瘾君子,git guigitk也非常适合他们允许的git使用子集。我强烈建议将它们用于他们擅长的事情(即选择性地在git gui中进入/退出指数,并且还提交。(ctrl-s添加一个签名:行,ctrl-enter提交。)

gitk非常适合跟踪几个分支,同时将您的更改整理成一个很好的补丁系列以提交上游,或者您需要跟踪其中的任何其他内容。中间有多个分支。

我甚至没有打开图形文件浏览器,但我喜欢gitk / git gui。

答案 5 :(得分:5)

recommended solution git branch -f branch-pointer-to-move new-pointer中的TortoiseGit

  • &#34; Git Show log&#34;
  • 检查&#34;所有分支&#34;
  • 在你希望分支指针移动到的行上(新指针):
    • 右键单击,&#34;在此版本中创建分支&#34;
    • 在&#34; Branch&#34;旁边,输入要移动的分支的名称(branch-pointer-to-move)
    • 在&#34; Base On&#34;下,检查新指针是否正确
    • 检查&#34;强制&#34;
    • 确定

enter image description here

enter image description here

答案 6 :(得分:1)

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

git push -f . <destination>:<branch>

点(。)表示本地存储库,您可能需要-f选项,因为目标可能在“其远程副本的后面”

尽管此命令用于将更改保存到服务器中,但其结果与将远程分支(<branch>)移至与本地分支(<destination>)的提交完全相同。

答案 7 :(得分:1)

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

免责声明:可能不是建议的方法,但是可以完成工作。

答案 8 :(得分:0)

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

git merge <commit>

答案 9 :(得分:0)

如果要将未检出的分支移至另一个提交,最简单的方法是运行带有-f选项的git branch命令,该命令确定分支HEAD应该指向的位置:

git branch -f

请注意,如果您要移动的分支是当前分支,则此操作将无效。 要移动分支指针,请运行以下命令: git update-ref -m“重置:重置为” refs / heads /

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

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

答案 10 :(得分:0)

Git 2.23.0 引入了 git-switch 命令,也可用于执行此操作。

git switch -C <branch-name> [<start-point>]

-C(大写 C)选项表示如果 <branch-name> 已经存在,它会将其重置为 <start-point>

使用 -c(小写 C),它将尝试创建一个新分支,但如果已经存在则失败。

<start-point> 可以是散列、标签或其他分支名称。