仅使用git-restore<commit_hash>是行不通的。显然,必须指定-m。
当前回答
正如Ryan所提到的,git-restore可能会使合并变得困难,因此git-restore也许不是您想要的。我发现在这里使用git reset-hard<commit hash before merge>命令更有用。
完成硬重置部分后,可以强制推送到远程分支,即git push-f<remote name><remote branch name>,其中<remote name>通常被命名为origin。从那时起,如果您愿意,可以重新合并。
其他回答
如果您想恢复合并提交,以下是您必须执行的操作。
首先,检查git日志以查找合并提交的id。您还可以找到与合并关联的多个父id(参见下图)。
记下黄色显示的合并提交id。父ID是在下一行中作为“合并:parent1 parent2”写入的ID。现在
短篇故事:
切换到进行合并的分支。然后,只需执行git-restore<mergecommit-id>-m1,它将打开vi控制台以输入提交消息。写,保存,退出,完成!
长话短说:
切换到进行合并的分支。在我的例子中,它是测试分支,我试图从中删除feature/analytics-v3分支。git-restore是还原任何提交的命令。但在恢复合并提交时有一个令人讨厌的技巧。您需要输入-m标志,否则它将失败。从这里开始,您需要决定是否要还原分支,并通过以下方式使其看起来与parent1或parent2完全相同:
git revert<merge commit id>-m 1(还原为parent2)
git revert<merge commit id>-m 2(还原为parent1)
你可以把这些父母记录下来,看看你想走哪条路,这是所有困惑的根源。
下面是一个完整的示例:
git revert -m 1 <commit-hash>
git push -u origin master
git还原。。。提交您的更改。
-m1表示您希望在合并之前恢复到第一个父级的树,如下面的答案所述。<commit hash>是要还原的合并的提交哈希。
git推。。。将更改推送到远程分支。
接受的答案和其他一些答案演示了如何使用git-restore命令还原合并提交。然而,对于父提交存在一些混淆。这篇文章旨在通过一个图形表示和一个真实的例子来阐明这一点。
还原合并提交不像git revert<commit hash>那样简单,因为git在从合并提交返回时会因为两个父提交而感到困惑。要指定所需的父级,请使用-m标志。由于git无法确定哪个父级是主线,哪个分支是要自动取消合并的分支,因此必须指定此项。
iss53分支被合并到master中,创建了一个合并提交C6。C6有两个父母C5和C4。
需要恢复C6并将存储库恢复到C4的状态。因此,它必须指定要用于revert命令的父级。
为此,请检查git日志(此处表示实际的提交哈希值和图中的代码名称)>git日志提交C6合并:C4 C5作者:Mozz<mozz@example.com>日期:2月29日星期三23:59:59 2020+0100将分支“iss53”合并到主分支...从git日志输出中,记下Merge:--附带的父ID。它的格式为Merge:parent1 parent2,此处为Merge:C4 C5。C4提交在主分支中,我们需要恢复到它,即父1,这里需要-m1(使用gitlogC4验证先前的提交以确认父分支)。切换到进行合并的分支(这里是主分支,我们的目标是从中删除iss53分支)使用-m 1标志执行git还原。#在主分支中恢复到C4数字还原C6-m 1#C6-是合并提交哈希
对于一些其他情况,
# revert to C5 in iss53 branch
git revert C6 -m 2
# General
git revert <merge commit id> -m 1 (reverts to parent1)
git revert <merge commit id> -m 2 (reverts to parent2)
# remember to check and verify the parent1 and parent2 with git log command.
实际示例
在只有主分支的现有项目上创建了一个新的分支还原测试,提交图现在看起来像这样。
(对于提交的图形化视图,请使用带有git-log[SO ans-ref]的-graph或这个更具交互性的VS代码扩展-git-grraph)
现在,我已经添加了一些新文件,修改了现有文件,并在每个分支上创建了单独的提交,然后将它们推送到源。图形现在看起来如下:
然后,从GitHub创建一个拉取请求,并将恢复测试分支合并到main。
我想撤消合并提交并返回到主分支中的最后一次提交,即12a7327
注意,合并提交-2ec06d9现在有两个父级-12a7327(在主级)和15bde47(在还原测试中),现在检查gitlog,
> git log
commit 2ec06d9d315a3f7919ffe4ad2c2d7cec8c8f9aa3 (HEAD -> main, origin/main, origin/HEAD)
Merge: 12a7327 15bde47
Author: Akshay <63786863+akshay@users.noreply.github.com>
Date: Sun Feb 5 00:41:13 2023 +0530
Merge pull request #1 from Akshay/revert-test
Revert test
要恢复合并提交并返回到12a7327需要执行的操作,
# To the First parent
git revert 2ec06d9 -m 1
现在,编辑器中将显示一条提交消息,指定详细信息、检查和验证。
因此,这将创建一个Revert提交,该提交执行合并提交的反向更改。
最后推送更改,现在合并提交更改消失,日志将如下所示:,
有时,回滚的最有效方法是后退并替换。
git日志
使用第二个提交哈希(完整哈希,在列出错误之前要恢复到的哈希),然后从那里重新广播。
git checkout-b newbranch<HASH>
然后删除旧分支,将新分支复制到原来的位置,然后从那里重新启动。
git branch -D oldbranch
git checkout -b oldbranch newbranch
如果已广播,则从所有存储库中删除旧分支,将重做的分支推到最中心,然后将其拉回到所有存储库。
-m1是被修复的当前分支的最后一个父级,-m2是合并到其中的分支的原始父级。
如果命令行令人困惑,Tortoise Git也可以在这里提供帮助。
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别