将git主分支的HEAD指向当前分支的HEAD

32

我必须承认我还没有玩过git的高级功能,但在我的当前项目中我不得不使用。

情况是这样的: 有人尝试实现一些功能并将它们提交到主分支,现在我被叫去完成这个人试图做的事情(但失败了),因此,我所做的第一件事是

git checkout -b clean_start HASH

哈希值是当前主分支之前约20个提交的正确SHA1哈希值。现在我对这个分支进行了一些更改,现在我想要将远程存储库的当前主分支(由其他人所做的更改)更改为我的本地分支。

换句话说,我想将主分支的头部向后移动20个提交,然后将我的新干净分支合并到其中。

这是否正是我要做的?使用“revert HEAD~20”等还是有一个命令可以实现这种头部移动?

3个回答

29

如果远程仓库接受强制推送,你可以这样做:

git push --force origin clean_start:master

请注意,如果其他人也克隆了该仓库,他们的推送可能会撤销此操作。如果您想将本地主分支和远程主分支合并,但保留您分支的文件树(舍弃原始主分支的文件树),可以按照以下方法进行:

git merge -s ours --no-commit origin/master
git commit  # Separate step so that you can use your own commit message.
git checkout master
git merge clean_start  # Fast-forward
git push origin master

使用这个命令会创建一个合并提交,它的父节点是你的"master"分支和"origin/master"分支,但是树对象将与你当前分支的末端相同。换句话说,它将创建一个符号合并,其中没有实际的代码合并发生。

如果你不介意打断其他人在仓库中的工作,可以使用第一个方法。但如果你与其他已经拥有这些提交的人一起工作,第二个方法将更加可靠,并且会保留历史记录。


是的,我忘记他是从第二个分支而不是主分支进行开发。我也更新了我的其他命令列表以弥补这个疏忽。 - cdhowie

26
  1. 你可以使用以下命令将主分支指定为特定位置:

    git update-ref refs/heads/master clean_start
    

    (如果你正在跟踪clean_start的新更改并希望将master指向那里)

    请注意,无论master最初指向什么(大约20次提交),都将被“丢失”。

    由于这个原因,你需要强制推送master:

    git push origin master -f
    
  2. 如果你想保留本地的主分支不变,而是将clean_start的内容推送到远程主分支,只需执行以下操作:

    git push origin clean_start:master -f

    希望这可以帮助你。

    PS. 首先运行gitk --all &,这样你可以在执行此操作时以可视化方式查看发生了什么。


17

git reset 命令可用于更改 HEAD 所指向的内容。

在你的情况下,你可以这样做:

git checkout master              # switch to the master branch
git reset --hard clean_start     # point HEAD to the clean_start branch
git push -f origin master:master # force push the new HEAD to server

我认为这是最好的答案,因为它还解决了本地问题:您肯定希望最终将local/master指向新的HEAD。 - Titou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接