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

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

482362 次浏览
git branch --force <branch-name> [<new-tip-commit>]

如果省略new-tip-commit,则默认为当前提交。

new-tip-commit可以是分支名称(例如,主、起源/主)。

您可以对任意引用执行此操作。这是移动分支指针的方法:

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

其中-m将消息添加到分支的reflg。

一般形式是

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

如果你愿意,你可以选择关于reflg消息的尼特——我相信branch -freset --hard是不同的,这并不完全是它们中的任何一个。

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

例如:

git checkout branch-namegit 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

  • 右键单击您想要的提交
  • ->创建新的分支
  • 输入现有分支的名称
  • 确认替换了这个名字的旧分支的对话框上按回车键。

注意重新创建而不是修改现有分支将丢失跟踪分支信息。(对于只有一个远程并且您的本地分支与远程中的相应分支同名的简单用例,这通常不是问题。有关更多详细信息,请参阅评论,感谢@mbdevpl指出这个缺点。)

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


即使你通常像我一样是一个命令行迷,git guigitk也非常适合他们允许的git使用子集。我强烈建议使用它们来做他们擅长的事情(即有选择地在git gui中的索引中暂存大块,并且只是提交。(ctrl-s添加签名:行,ctrl-enter提交。)

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

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

TortoiseGit中的推荐的解决方案#0

  • "git显示日志"
  • 检查“所有分支”
  • 在您希望分支指针移动到的行(新指针):
    • 右键单击,“在此版本创建分支”
    • 在“分支”旁边,输入要移动的分支的名称(分支指针移动)
    • 在“Base On”下,检查新指针是否正确
    • 检查“力”
    • 好的

在此处输入图片描述

在此处输入图片描述

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

示例:

git branch -f myBranch


我通常这样做时,我rebase,而在一个分离的头状态:)

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

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

点 ( . ) 引用本地存储库,您可能需要-f选项,因为目标可能是"在遥远的对手身后"

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

对于签出分支,如果您要指向的提交在当前分支之前(除非您想撤消当前分支的最后一次提交,否则应该是这种情况),您可以简单地执行:

git merge --ff-only <commit>

这是git reset --hard的一个更软的替代方案,如果您不在上述情况下,将失败。

要对未签出的分支执行同样的事情,等效的结果是:

git push . <commit>:<branch>

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

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

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

git branch -f <branch-name> (<sha1-commit-hash> or <branch-name>)

例如,如果您希望您的本地开发分支跟踪远程(原始)开发分支:

git branch -f develop origin/develop

请注意,如果您尝试移动的分支是您当前的分支,这将不起作用。要移动分支指针,请运行以下命令:git update-ref-m"重置:重置为"refs/头/

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

希望,我的回答对你有所帮助。信息来源是这个片段

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

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

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

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

<start-point>可以是哈希、标记或其他分支名称。