git推到错误的分支


97

在进行一些“提交”和几次“推送”之后,使用git进行工作,我意识到使用了错误的分支!

现在,我必须以某种方式删除对rong_branch的更改,并提交并推送对right_branch的更改

最好(最简单)的方法是什么?

谢谢



好问题@tokland:99%的ruby开发人员使用git,而我正在从事的项目在RoR中……但是我知道这可能不是一个好动机
Alessandro De Simone

3
从我的角度来看,这不是Halfdan所说的重复,因为它还涉及将提交移动到另一个分支,而不仅仅是删除它们。
olenz 2011年

Answers:


140

切换到该分支,分别检查git loggit revert那些提交。完成此操作后,切换回所需的分支,然后可以在其中使用git cherry-pickgit refs选择特定的提交并将其合并到正确的分支中。

git checkout wrong_branch
git revert commitsha1
git revert commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

如果提交被分组在一起,并且在脏提交之后没有提交被推送,那么您甚至可以使用git reset将错误的分支返回到提交之前的状态,然后再次使用git cherry-pick,将提交带入正确的分支。

git checkout wrong_branch
git reset commitsha3 #commit just before commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

与其他涉及重置头和/或重新设置基准的可能方法相比,“还原+摘樱桃”似乎简单得多。
克里斯夫

2
对于git cherry-pick,您可以将多个阴影放在一行中,即git cherry-pick commitsha1 commitsha2
ThomasW

救命!而且并不复杂。谢谢!
克雷格·希尔弗

当您想将rong_branch(例如开发)合并到right_branch(例如feature / X)时会发生什么,然后您获得还原操作撤消您樱桃选择的更改
。– timB33

3

最简单的方法是使用git rebase。假设您具有以下设置:

A -- B -- C -- C1 -- C2 # right branch
          \
           \-- D -- C3 -- C4 # wrong branch

您想要将更改C3,C4移动到右侧分支。

git checkout -b new_wrong_branch D
git checkout wrong_branch
git rebase D --onto right_branch
git checkout right_branch
git merge right_branch wrong_branch
git branch -d wrong_branch
git branch rename new_wrong_branch wrong_branch

现在的设置是

A -- B -- C -- C1 -- C2 -- C3 -- C4 # right_branch
          \
           \ -- D # wrong_branch

然后,您必须用力推动结果(如果尚未有人与您的远程仓库同步):

git push -f remote:right_branch

我没有尝试过这种解决方案,我已经在第一个答案中进行了尝试(并且有效)。我不认为在底垫中,它看起来像一个很好的选择,谢谢
亚历山德罗德西蒙

1
而不是git push -f更好地使用git push --force-with-lease。至少,它确保仅当没有人将其他提交推到提交之上时,远程引用才会被更新。
皮埃尔·奥利维尔·瓦雷斯

2

Dhruva的答案有点捷径

git checkout wrong_branch
git revert commitsha1

git checkout right_branch
git push right_branch

git checkout wrong_branch
git reset commitsha2 #commit just before commitsha1
git push wrong_branch -f
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.