我必须承认,我没有使用gits高级功能,但我必须使用当前项目。
情况: 有人试图实现一些功能并将它们交给主人,现在我被叫去做其他人试图做的事情(但失败了),因此,我做的第一件事就是
git checkout -b clean_start HASH
Hash是一个正确的SHA1哈希,在当前主服务器之前大约有20个提交,并且有效。我现在对这个分支进行了一些更改,现在我想将远程存储库的当前主分支(具有其他人所做的更改)更改为我的本地分支。
换句话说,我想移动主人20的头部提交,然后将我的新干净分支合并到其中。
这正是我必须做的吗?通过恢复HEAD~20等,还是有一个命令可以完全移动?
答案 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)
您可以专门将master指向您希望的位置:
git update-ref refs/heads/master clean_start
(如果您要跟踪clean_start
中的新更改并希望主人指向那里)
请注意,无论高手指向什么(大约20个提交值)都会“丢失”。
由于这个原因,你需要强制推动主人:
git push origin master -f
如果您希望将本地主人员留在原地,并将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