推送后还原合并

时间:2012-09-21 16:20:10

标签: git git-revert

我执行的步骤:

我有两个分支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

现在我意识到,当处于第1步时,自动合并删除了一些代码并且更改了代码被推送,现在我想回到我的初始状态以便恢复任何更改。看一些直接的帮助?

4 个答案:

答案 0 :(得分:67)

您可以在official guide之后恢复合并,但这会让Git误以为合并的提交仍在目标分支上。

基本上你必须:

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

答案 1 :(得分:19)

尝试使用git reflog <branch>查找合并前分支的位置,并git reset --hard <commit number>恢复旧版本。

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

使用git reset时确保您处于正确的分支

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

答案 2 :(得分:2)

第一种选择是使用git revert

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

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

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

答案 3 :(得分:1)

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

my-branch (before merge)

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

将它与另一个feature-branch并在主目录上提交了f1, f2的{​​{1}}合并之后,它变成这样:

my-branch (after merge)

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

这可能是因为在分支上工作时,我在两次提交后从master进行了合并,或者2个分支之一可能不是master的最新版本。 因此,在这种情况下,git revert -m 1无法正常工作,因为它们保留了f1f2之间的提交。

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

git rebase -i HEAD~6

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

git log --oneline 

强行推入

git push -f

现在远程分支应该处于以前的状态。