107

我执行的步骤:

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

5 回答 5

124

您可以按照官方指南恢复合并,但这会使 Git 错误地认为合并的提交仍在目标分支上。

基本上你必须:

git revert -m 1 (Commit id of the merge commit)
于 2012-09-23T17:28:04.770 回答
48

尝试使用git reflog <branch>找出合并之前您的分支在哪里并git reset --hard <commit number>恢复旧版本。

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

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

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

于 2012-09-21T16:33:19.883 回答
19

第一个选项是使用git revert.

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

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

git reset --hard [sha-commit-before-merge]
git push [origin] [branch] --force
于 2018-12-07T11:03:41.670 回答
1

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

my-branch (before merge)

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

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

my-branch (after merge)

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

这可能是因为在我的分支上工作时,我在 2 次提交后从 master 进行了合并,或者 2 个分支之一可能没有与 master 保持同步。因此,在这种情况下git revert -m 1,它不起作用,因为它在两者之间留下了那些f1f2提交。

解决方案很简单,适用于正常情况下,我们没有中间提交:

git rebase -i HEAD~6

根据您想要更改的过去提交的数量,而不是 6 使用适当的数字。现在 Vim 编辑器已打开,只需将不需要的提交标记为drop相同并使用:wq 验证日志退出:

git log --oneline 

力推

git push -f

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

于 2020-06-24T18:46:04.923 回答
0

正如另一个答案中提到的,在git revert合并时执行 a 的主要问题是 git 仍然认为所有以前的提交都已合并(它只更改代码)。如果您稍后尝试合并该分支,您会发现之前的提交丢失了。

更好的方法(显然是在与您的团队协商后,以免他们继续在有问题的分支上工作)是git reset更早的提交。它不必是硬重置,因为它只涉及如何处理您当前的工作更改,因此这部分取决于您。

如果您想在重置之前先在那里进行更改,您还可以从先前的提交创建一个临时分支。在这种情况下,您将重置为临时分支上的提交。

如果不从上游拉动,您将无法推动,但显然您不想拉动您试图恢复的更改。因此,您需要执行强制推送(如果在此期间推送了任何更改,则需要强制推送以停止)。

旁注:作为 VS Code 和 Git Graph 的粉丝,我发现通过右键单击本地分支标记名称并选择“Push Branch...”,选择 Force 或 Force With Lease,即可轻松执行强制推送,然后离开选中设置上游框。

于 2021-12-07T17:19:37.173 回答