我想将推送合并恢复到基本分支到合并之前的状态。我怎么能这样做?
答案 0 :(得分:4)
假设您知道要还原的合并提交,并且只需要找到合并的基础,正如我从您的评论中所理解的那样:
首先,有一种显示父提交的可视方式。这可能有助于理解并确保您获得正确的提交:
git show [commit]
(以及git log
也会)以这种形式打印有关合并提交的信息:
commit [commit]
Merge: [parent1] [parent2]
Author: [author]
Date: Tue Jul 19 12:00:00 2016
其中parent2是合并提交,而parent1是已合并的提交。
因此,此示例(在这种情况下git rev-parse
显示给定分支的哈希值):
$ git branch
master
$ git rev-parse master
hasha
$ git rev-parse develop
hashb
$ git merge develop
会导致像这样的提交:
commit newhash
Merge: hasha hashb
Author: [author]
Date: Tue Jul 19 12:00:00 2016
您还可以使用^快捷方式获取相应的提交。 master^1
(与master^
相同)将获得第一个父项(上例中的hasha),而master^2
将为您提供第二个父项(hashb)。因此,您也可以将这些用于您的恢复(在您的情况下,如果您的分支是主要的,您将希望恢复为主^ 1)。您可能希望尝试调用git show master^
来查看以这种方式找到哪个提交。
答案 1 :(得分:1)
除了lucash's answer(这是正确的,我已经投票),如果你真的想要识别合并基础提交,你可以使用git merge-base
父提交。
例如,假设有问题的合并是提交a123456
(缩写为7个字符后)。正如卢卡什所说,这两个父母是a123456^1
和a123456^2
(假设只有两个父母 - 对于章鱼合并,有三个或更多父母,只需继续添加更多父指定符,例如{{ 1}}通过a123456^3
或其他)。请注意,正如the git merge-base
documentation所述,如果有多个合并库,则需要a123456^99
标志来显示所有合并基础。
(如果是多个合并库,默认的递归合并策略将合并它们以生成单个“虚拟合并基础”,实际上并未包含如果您希望通过将虚拟合并基础结果创建为实际的物理合并来查看虚拟合并基础结果,那么您将需要合并的参数以重复此过程。虽然一般的想法应该非常明显,但细节超出了这个答案的范围。)
请注意,有一个特定的gitrevisions
syntax用于列出“合并的所有父级”:--all
相当于在我们的99个父合并提交的假设情况下列出a123456^@
{ {1}}。因此,如果名称a123456^1 a123456^2 ... a123456^99
当前指向您刚刚进行的合并提交,则只需运行:
a123456
查看当前合并提交的合并基础的哈希值。
所有这一切,如果你真的想要恢复合并,你通常只想使用master
;如果你想回顾一下进入的双方,你通常会想要这样的东西:
git merge-base --all master^@
(请注意三个点),或git revert -m <number> <mergecommit>
替换为git rev-list --left-right --cherry-mark --boundary master^1...master^2
或rev-list
或类似情况(顺便提一下,注意log
和log --oneline
几乎是相同的命令,只是使用不同的输出格式)。 git log
选项告诉Git自己包含合并基础(但不包括其父项),用前导git rev-list
标记它们(与--boundary
和-
选项配合得很好)。如果要排除合并基数,请省略--left-right
标志。有关详细信息,请参阅the (very long) git rev-list
documentation。