使git master HEAD指向当前分支的HEAD

时间:2010-11-24 22:03:37

标签: git branch revert head

我必须承认,我没有使用gits高级功能,但我必须使用当前项目。

情况: 有人试图实现一些功能并将它们交给主人,现在我被叫去做其他人试图做的事情(但失败了),因此,我做的第一件事就是

git checkout -b clean_start HASH

Hash是一个正确的SHA1哈希,在当前主服务器之前大约有20个提交,并且有效。我现在对这个分支进行了一些更改,现在我想将远程存储库的当前主分支(具有其他人所做的更改)更改为我的本地分支。

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

这正是我必须做的吗?通过恢复HEAD~20等,还是有一个命令可以完全移动?

3 个答案:

答案 0 :(得分: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

这将创建一个包含两个分支(您的主服务器和原始主服务器)作为其父服务器的合并提交,但该树将与您当前的分支提示相同。换句话说,它将创建一个符号合并,而不会发生实际的代码合并。

如果你不介意在回购中工作的其他人会被打断,你可以使用第一种方法。但是,如果你与已经拥有这些提交的其他人一起工作,第二种方法将更加万无一失,并将保留历史。

答案 1 :(得分:26)

  1. 您可以专门将master指向您希望的位置:

    git update-ref refs/heads/master clean_start
    

    (如果您要跟踪clean_start中的新更改并希望主人指向那里)

    请注意,无论高手指向什么(大约20个提交值)都会“丢失”。

    由于这个原因,你需要强制推动主人:

    git push origin master -f
    
  2. 如果您希望将本地主人员留在原地,并将clean_start的位置推送到远程主人,请执行以下操作:

    git push origin clean_start:master -f

    希望这会有所帮助。

    PS。首先运行gitk --all &,这样您就可以在视觉上看到正在发生的事情。

答案 2 :(得分: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