将Git推送到错误的分支

134
在使用git时,经过一些'commit'和几次'push'之后,我意识到我正在使用错误的分支!现在我必须以某种方式删除在'wrong_branch'中的更改,并将更改提交并推送到'right_branch'中。有什么最好(又简单)的方法可以做到这一点?

可能是Git:从存储库中删除选定的提交的重复问题。 - halfdan
好问题@tokland:99%的Ruby开发者使用Git,而我正在工作的项目是基于RoR...但我知道这可能不是一个好的动机。 - Alessandro De Simone
3
在我看来,这不是halfdan所说的重复问题,因为它还涉及将提交移动到另一个分支,而不仅仅是删除它们。 - olenz
4个回答

200

切换到该分支,检查git log并逐个使用git revert撤销提交。完成后,切换回目标分支,然后可以使用git cherry-pick从git引用中选择特定的提交并将其合并到正确的分支中。

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

回滚+精选似乎比其他可能涉及重置头部和/或变基的方法要简单得多。 - ChrisV
3
对于git cherry-pick命令,您可以在单行中放置多个提交记录的sha码,即 git cherry-pick commitsha1 commitsha2 - ThomasW
当您想将错误分支(例如develop)合并到正确的分支(例如feature/X)时,会发生什么情况?然后您会得到撤销您挑选的更改的还原。 - timB33
“revert”比“reset”更加简洁、不那么夸张,除非你真的想删除一些敏感的东西(凭证?)。 - Qumber

4
最简单的方法是使用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

我还没有尝试过这个解决方案,因为我已经在第一个答案中找到了解决方法(而且它有效)。我没有想到使用rebase,这似乎是一个不错的替代方案,谢谢。 - Alessandro De Simone
1
与其使用 git push -f,最好使用 git push --force-with-lease。这样可以确保只有在没有其他人在你的提交之上推送其他提交时,远程引用才会被更新。 - Pierre-Olivier Vares

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

-1

如果正确的分支尚未创建或没有新提交并且是错误分支的直接子级,我发现这更容易:

  • 首先删除 right-branch(如果已存在),
  • git checkout right-branch
  • git push right-branch
  • git checkout wrong-branch
  • git revert commitsha2(或错误提交之前的提交)
  • 在错误分支上使用 git push -f

这样,您就可以像从未犯过任何错误提交一样拥有所有内容。


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