我执行的步骤:
我有两个分支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步时,自动合并删除了一些代码并且更改了代码被推送,现在我想回到我的初始状态以便恢复任何更改。看一些直接的帮助?
答案 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
无法正常工作,因为它们保留了f1
和f2
之间的提交。
解决方案很简单,在正常情况下(我们之间没有提交)可以使用:
git rebase -i HEAD~6
根据要更改的过去提交次数,使用适当的数字代替6。
现在,Vim编辑器已打开,只需将不需要的提交标记为drop
并使用:wq
退出即可
验证日志:
git log --oneline
强行推入
git push -f
现在远程分支应该处于以前的状态。