受污染的远程主分支或反樱桃挑选

时间:2011-01-22 19:40:13

标签: git master repair

我遇到远程存储库有一些“错误”提交的情况。 e.g。

... o ---- C ---- A ---- B  origin/master 

哪里A不好(但B很好) 我希望遥控器变成......

... o ---- C ---- B  origin/master 
                   \
                    A  origin/dev 

对我来说,如何做到这一点并不明显。

如果不适合使用rebase,则需要不同的结果。

... o ---- C ---- A ---- B ---- ~A origin/master 
                          \
                           -  origin/dev 

这会导致包含A提交的dev分支和不包含A提交的master。 修订后的问题是: 怎么做反樱桃挑选? 因此,不是生成将存储库从状态C更改为A的补丁,而是应用将B更改为A的补丁。

2 个答案:

答案 0 :(得分:3)

拉,以便您在本地拥有相同的存储库。

使用git rebase --interactive(如果您不熟悉交互式rebase,请参阅this rundown)重新排序A和B提交,以便您现在拥有

... o ---- o ---- B ---- A  master 

从那个地点结帐新的分支机构,以便获得

... o ---- o ---- B ---- A  master, dev

切换到主分支,执行git reset --hard HEAD^以回退该分支一个提交。你现在有了

... o ---- o ---- B  master 
                   \
                    A  dev 

现在git push --force --all你应该是金色的。 (您需要--force,因为您正在重写远程存储库中的历史记录,这很危险,如果其他开发人员已经从中撤出,则不推荐使用。)

答案 1 :(得分:0)

git revert -n <git commit hash>

还原特定更改,但将提交更改保留在本地-如果您不想还原所有内容,而只是还原某些内容(这也是Tortoise Git的行为),则很有用。

git revert --no-edit <git commit hash>

还原特定更改,并将更改提交到git(但不将其推送到服务器)-以防万一您想返回旧版本以了解做错了什么。

git revert --no-edit <git commit hash>
git cherry-pick -n  <git commit hash>

将更改还原到旧版本并选择对本地文件的提交更改,因此您可以从以前的相同位置继续。对于重新开始解决问题很有用,以前的提交更改为“工作草案”。

如果您决定以后再提交更改,则最终将提交两次而不是一次。 (一次还原提交,一次向前提交)-或者您也可以还原所有本地更改,最后一次还原提交使用:

git reset --hard HEAD~1

删除本地更改并完全上一次提交(从git历史记录和文件系统中,警告:无法恢复更改),如果您设法了解出了什么问题以及如何修复当前版本,以及想退回一次提交。