在 Git 中恢复合并提交
有时,我们需要合并两个或多个分支,然后将提交推送到所需的分支。但是后来我们意识到我们不需要在那个仓库中进行合并,所以这里的问题是如何撤消或恢复已经推送的合并提交。没什么可担心的。对于这个问题,Git 有一个很好的解决方案,我们将在下面讨论。
根据问题的不同,有两种处理这种情况的方法;一种是它尚未推送到仓库但已提交。另一个是它被提交并推送到仓库中。下面讨论了这两种情况:
撤销未推送的 Git 提交
直接在 Git 中恢复提交是不可能的。尽管如此,我们需要在恢复之前检查提交。还原后,现在工作目录的位置与我们推送提交之前的工作目录位置相同。
我们现在可以应用 git reset
命令将索引指针移回它的位置,即提交之前的位置。例如,如果我们想保留提交 Commit1
和 Commite3
的更改,但恢复提交 Commit2
的更改,请执行此命令。
git reset HEAD~3
此命令会将索引指针返回到提交 Commit2
之前的位置。还原提交后,我们需要再次将更改的文件添加到工作目录。例如,执行以下命令:
git checkout Commit1
git add Commit1
git checkout Commit3
git add Commit3
git commit
之后,我们可以将提交 Commit1
和 Commit3
推送到远程仓库。
git push
如果我们想合并两个分支,然后恢复一个分支的更改,我们可以使用以下命令:
git merge --abort
该命令用于取消合并过程。之后,我们可以将更改还原到分支。如果我们想撤销最后一次提交或多次提交的影响,本节讨论的命令很有用。
但是,如果我们想撤销最后两次或更多次提交的影响,我们需要将工作目录重置为最后一次提交之前的状态。这是因为不可能直接恢复一个或多个提交。
恢复已推送的 Git 提交
在另一种情况下,如果我们已经将合并提交推送到远程分支并且也推送了它,我们必须进行一个新的提交来恢复更改。我们将执行以下命令:
git revert -m 1 <merge-commit-hash>
这将开发一个新的提交,它将逆转先前合并提交的更改。但是,这个新提交也将包含原始合并提交的所有更改,因此我们需要编辑提交消息以表明这是一个还原提交。而我们提到的选项,-m 1
将告诉 Git 我们想要保留合并的分支。
revert command
不会改变工作树。它只修改索引。revert command
还具有恢复提交的原始消息的选项。在上面给出的示例中,-m
选项用于恢复提交的原始消息。revert 命令还可用于从集成提交中恢复特定文件。
当我们进行更改并决定不再希望保留该更改时,Git revert
是一个有用的工具,可以在我们的本地分支上使用。不建议在公共分支上使用。
众所周知,git revert 是完全可逆的,不可能撤销它的改变。如果我们在其分支上不是当前提交的提交上执行 git revert,我们必须非常小心,因为 git revert 将开发具有新提交 ID 的新提交。
如果我们稍后执行 git reset –hard 来恢复 git revert 所做的更改,我们还将删除创建 git revert 撤消提交的开发人员所做的更改。可以在公共分支上使用 git revert,但根据我的观点,这样做不是一个好主意。最好开发一个新分支来进行更改,然后在完成后将其合并到 master
分支中。
如果我们想在公共分支上使用 git revert,请确保我们是唯一在该分支上工作的人,否则我们将撤消其他人的工作。
Abdul is a software engineer with an architect background and a passion for full-stack web development with eight years of professional experience in analysis, design, development, implementation, performance tuning, and implementation of business applications.
LinkedIn