Git 如何在发生合并(使用不同的分支)之前找到基本分支上的最后一次提交?
我想将推式合并还原为基本分支,恢复到合并之前的状态。如何执行此操作?假设您知道要还原的合并提交,并且只需要找到合并的基础,正如我从您的评论中了解到的: 首先,有一种显示父提交的可视化方式。这可能有助于理解并确保您获得正确的提交:Git 如何在发生合并(使用不同的分支)之前找到基本分支上的最后一次提交?,git,Git,我想将推式合并还原为基本分支,恢复到合并之前的状态。如何执行此操作?假设您知道要还原的合并提交,并且只需要找到合并的基础,正如我从您的评论中了解到的: 首先,有一种显示父提交的可视化方式。这可能有助于理解并确保您获得正确的提交: git show[commit](还有git log)将以以下形式打印有关合并提交的信息: commit [commit] Merge: [parent1] [parent2] Author: [author] Date: Tue Jul 19 12:00:00 201
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
在本例中显示了给定分支的哈希):
将导致像这样的提交:
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^
来查看以这种方式找到的提交。假设您知道要还原的合并提交,并且只需要找到合并的基础,正如我从您的评论中所理解的:
首先,有一种显示父提交的可视化方式。这可能有助于理解并确保您获得正确的提交:
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
在本例中显示了给定分支的哈希):
将导致像这样的提交:
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^来观察这样找到的提交。此外(这是正确的,我已经投票了),如果您确实想识别合并基提交,您可以在父提交上使用
例如,假设所讨论的合并是commita123456
(缩短为7个字符后)。正如lucash所说,这两个双亲分别是a123456^1
和a123456^2
(假设章鱼合并只有两个双亲,其中有三个或更多双亲,只需不断添加更多的双亲说明符,例如,a123456^3
通过a123456^99
或其他方式)。注意,如上所述,如果存在多个合并基,则需要使用--all
标志来显示所有合并基
(如果有多个合并基,默认的递归合并策略将合并它们以生成单个“虚拟合并基”,它实际上不包含在存储库中。如果您希望通过将虚拟合并基础结果创建为实际的物理合并来查看虚拟合并基础结果,则需要合并的参数以重复此过程。虽然总体思路应该非常明显,但详细信息超出了此答案的范围。)
请注意,列出“合并的所有父项”有一个特定的条件:a123456^@
相当于列出a123456^1 a123456^2。。。a123456^99
在我们的99个父合并提交的假设情况下a123456
。因此,如果名称master
当前指向您刚刚进行的合并提交,您只需运行:
git merge-base --all master^@
查看当前合并提交的合并基的哈希值
综上所述,如果您确实想要恢复合并,通常只需要使用
git revert-m
;如果你想回顾一下双方的观点,你通常需要这样的东西:
git rev-list --left-right --cherry-mark --boundary master^1...master^2
(注意这三个点),或者用rev list
替换为log
或log--oneline
或类似的命令(顺便注意,git log
和git rev list
实际上几乎是相同的命令,只是输出格式不同)。--boundary
选项告诉Git包含合并基本身(而不是它们的父基),用前导的-
标记它们(这与--left-right
和--cherry-mark
选项配合得很好)。如果要排除合并基,请省略--boundary
标志。有关更多详细信息,请参阅。此外(这是正确的,我已投票赞成),如果确实要标识合并基提交,可以在父提交上使用
例如,假设所讨论的合并是commita123456
(缩短为7个字符后)。正如lucash所说,这两个双亲分别是a123456^1
和a123456^2
(假设章鱼合并只有两个双亲,其中有三个或更多双亲,只需不断添加更多的双亲说明符,例如,a123456^3
通过a123456^99
或其他方式)。注意,如上所述,如果存在多个合并基,则需要使用--all
标志来显示所有合并基
(如果有多个合并基,默认的递归合并策略将合并它们以生成一个“虚拟合并基”,该“虚拟合并基”实际上不包含在存储库中。如果希望通过创建虚拟合并基来查看虚拟合并基结果,则需要合并的参数以重复此过程