推送后还原合并


79

我执行的步骤:

我有两个分支branch1和branch2,

$git branch --Initial state
$branch1

$git checkout branch2
$git pull origin branch1 --Step1

我解决了冲突,并做了

$git commit -m "Merge resolved"

然后

$git checkout branch1
$git merge branch2
$git push origin branch1

现在我意识到在第一步时,自动合并删除了一些代码并推送了更改代码,现在我想回到我的初始状态以还原任何更改。寻找一些即时帮助吗?


git revert不做你想要的吗?
张敬轩

1
它给出的消息为:致命:Commit b4a758b36a5bde9311061fe7b56e4f47859de052是合并,但未提供-m选项。@FrederickCheung
Bijendra 2012年

查看有关-m选项的手册。 kernel.org/pub/software/scm/git/docs/git-revert.html不久之后,您可以使用-m 1或-m2。这会选择要还原到两个父修订版中的哪个。
伊利亚·伊万诺夫

yaa我使用了git revert -m 1 SHA,现在所有更改都在我本地进行更改,
Bijendra 2012年

vim发生错误,在还原操作时退出该错误,我运行了git config --global core.editor / usr / bin / vim,它解决了该问题,然后还原成功运行以解决了该问题
谢谢

Answers:


94

您可以按照官方指南还原合并,但是这使Git误认为合并的提交仍在目标分支上。

基本上,您必须:

git revert -m 1 (Commit id of the merge commit)

26
一个人应该小心1。这意味着first合并提交的父级。但是,如果一个(假设地)“偶然地”将主服务器合并到分支,则将快进的主服务器转移到合并的提交-应该使用它-m 2来还原主服务器上的合并。
KrzysztofJabłoński2014年

1
小心点1。它通过部分还原合并来弄乱我的存储库,而我想完全还原合并。我最终还原了还原!
Javad Sadeqzadeh '16

1
@JavadSadeqzadeh,或者,您通过从SO复制粘贴而弄乱了存储库,而没有完全检查答案的作用
joel

32

尝试使用git reflog <branch>来找出分支在合并之前的位置,并git reset --hard <commit number>还原旧版本。

Reflog将显示分支的较旧状态,因此您可以将其返回到您喜欢的任何更改集。

使用git reset时,请确保您在正确的分支中

要更改远程存储库历史记录,可以执行git push -f,但是不建议这样做,因为有人可能已经下载了由您推送的更改。


1
我只好推着代码远程分支,这将如何复归从那里的代码..
Bijendra

3
如果您已经推送过,则不希望重写本地历史记录,如Ilya所述
ms-tg 2012年

2
抱歉,我错过了那件事...有时您可以使用git push -f重写远程历史记录。这取决于您的远程存储库配置和其他团队成员(如果他们不会因为强制推送而杀死您)。
伊利亚·伊万诺夫

8

第一种选择是使用git revert

git revert -m 1 [sha-commit-before-merge]

git revert将恢复的变化,但将保持历史。因此,您将无法继续在同一个分支中工作,因为您再也看不到合并分支与功能分支之间的实际差异。也可以使用以下方式删除历史记录。当且仅当您是当前唯一推动更改的分支时,请非常小心地执行此操作。

git reset --hard [sha-commit-before-merge]
git push [origin] [branch] --force

1

就我而言,我将分支(例如:my-branch)与另一个功能分支(feature-branch)合并了,但没有合并。所以我的分支历史是这样的:

my-branch (before merge)

---master----m1----m2----m3---m4

在将它与另一个在master之上feature-branch提交的文件合并之后f1, f2,它变成这样:

my-branch (after merge)

---master----m1----m2----f1----f2----m3---m4----mergecommit

发生这种情况的原因是,在我的分支机构上工作时,我在进行2次提交后从master进行了合并,或者2个分支之一可能与master无关。因此,在这种情况下git revert -m 1无法正常工作,因为它们介于两者之间f1并且f2在两者之间提交。

该解决方案很简单,在正常情况下(在我们之间没有提交的情况下)可以使用:

git rebase -i HEAD~6

根据要更改的过去提交次数,使用适当的数字代替6。现在,Vim编辑器已打开,只需将不需要的提交标记为drop和相同,然后使用:wq 验证日志退出:

git log --oneline 

推力

git push -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.