Git 恢复合并时如何查找分支编号?
我的提交历史记录如下所示:Git 恢复合并时如何查找分支编号?,git,git-merge,git-revert,Git,Git Merge,Git Revert,我的提交历史记录如下所示: A - B - C - D - E \ / X - Y 分支ABCDE是master,分支XY是另一个分支(比如test),而D是合并提交头部现在位于E。我需要使用git reset--hard,仅使用git revert,将我的工作目录返回到A的状态,前提是不。据我所知,在这种情况下,这可以通过两种方式实现: 第一种方式: git revert --no-commit <SHA1(E)> git revert -m 1 -
A - B - C - D - E
\ /
X - Y
分支ABCDE
是master
,分支XY
是另一个分支(比如test
),而D
是合并提交<代码>头部现在位于E
。我需要使用git reset--hard
,仅使用git revert
,将我的工作目录返回到A
的状态,前提是不。据我所知,在这种情况下,这可以通过两种方式实现:
第一种方式:
git revert --no-commit <SHA1(E)>
git revert -m 1 --no-commit <SHA1(D)>
git revert --no-commit <SHA1(C)>
git revert --no-commit <SHA1(B)>
git commit -m "Reverted to state A"
git revert——不提交
git revert-m1——不提交
git revert——不提交
git revert——不提交
git提交-m“已恢复到状态A”
第二种方式:
git revert --no-commit <SHA1(E)>
git revert -m 2 --no-commit <SHA1(D)>
git revert --no-commit <SHA1(Y)>
git revert --no-commit <SHA1(X)>
git revert --no-commit <SHA1(B)>
git commit -m "Reverted to state A"
git revert——不提交
git revert-m2——不提交
git revert——不提交
git revert——不提交
git revert——不提交
git提交-m“已恢复到状态A”
一个绊脚石是git revert-m
。在本例中,我假设1
允许沿着分支master
,以及2
-沿着分支测试继续还原链
问题是:我如何真正知道哪个数字表示哪个分支?您可以检查合并提交以查看它的父级是谁:
git show <SHA1(D)>
更新:我在仔细阅读一些旧资料,发现我给出的答案完全不正确。如果您执行上述操作,您将不会获得状态A,但您将获得您不想要的弗兰肯斯坦:
A - C' - D' - E'
\ /
X - Y
这相当于你得到的,而这根本不是你想要的。要做到这一点并完全保存您的历史,只有一种方法:
git revert HEAD # reverts E, labeled as E' below
git revert -m 1 <SHA1(D)> # reverts D, labeled as D' below
git revert HEAD # reverts C, labeled as C' below
git revert HEAD # reverts B, labeled as B' below
这种方法会让你得到你想要的东西,并保存每一段历史@Kaz和@torek的方法效率更高,也不太冗长,如果你不想再次引入X
和Y
,那么我推荐其中一种解决方案;但是,如果您关心的是X
和Y
,那么它们可能会使重新引入主分支变得更加困难。还原每一个片段可以重新引入X
和Y
,而无需重新编写/C&P代码,如果X
和Y
是大的更改,或者如果你想保持最准确的历史记录(我倾向于这样),这是一个很有吸引力的选择
要重新引入X
和Y
,应执行以下操作:
git revert D'
这可能会产生合并冲突,特别是如果您不同时还原B'
和C'
,但这可能比手动执行X
和Y
要好。Linux Torvalds写道,这可能会对您有所帮助。您可以检查合并提交,以查看其家长是谁:
git show <SHA1(D)>
更新:我在仔细阅读一些旧资料,发现我给出的答案完全不正确。如果您执行上述操作,您将不会获得状态A,但您将获得您不想要的弗兰肯斯坦:
A - C' - D' - E'
\ /
X - Y
这相当于你得到的,而这根本不是你想要的。要做到这一点并完全保存您的历史,只有一种方法:
git revert HEAD # reverts E, labeled as E' below
git revert -m 1 <SHA1(D)> # reverts D, labeled as D' below
git revert HEAD # reverts C, labeled as C' below
git revert HEAD # reverts B, labeled as B' below
这种方法会让你得到你想要的东西,并保存每一段历史@Kaz和@torek的方法效率更高,也不太冗长,如果你不想再次引入X
和Y
,那么我推荐其中一种解决方案;但是,如果您关心的是X
和Y
,那么它们可能会使重新引入主分支变得更加困难。还原每一个片段可以重新引入X
和Y
,而无需重新编写/C&P代码,如果X
和Y
是大的更改,或者如果你想保持最准确的历史记录(我倾向于这样),这是一个很有吸引力的选择
要重新引入X
和Y
,应执行以下操作:
git revert D'
这可能会产生合并冲突,特别是如果您不同时还原B'
和C'
,但这可能比手动执行X
和Y
要好。Linux Torvalds写道,这可能会对您有所帮助。您可以检查合并提交,以查看其家长是谁:
git show <SHA1(D)>
更新:我在仔细阅读一些旧资料,发现我给出的答案完全不正确。如果您执行上述操作,您将不会获得状态A,但您将获得您不想要的弗兰肯斯坦:
A - C' - D' - E'
\ /
X - Y
这相当于你得到的,而这根本不是你想要的。要做到这一点并完全保存您的历史,只有一种方法:
git revert HEAD # reverts E, labeled as E' below
git revert -m 1 <SHA1(D)> # reverts D, labeled as D' below
git revert HEAD # reverts C, labeled as C' below
git revert HEAD # reverts B, labeled as B' below
这种方法会让你得到你想要的东西,并保存每一段历史@Kaz和@torek的方法效率更高,也不太冗长,如果你不想再次引入X
和Y
,那么我推荐其中一种解决方案;但是,如果您关心的是X
和Y
,那么它们可能会使重新引入主分支变得更加困难。还原每一个片段可以重新引入X
和Y
,而无需重新编写/C&P代码,如果X
和Y
是大的更改,或者如果你想保持最准确的历史记录(我倾向于这样),这是一个很有吸引力的选择
要重新引入X
和Y
,应执行以下操作:
git revert D'
这可能会产生合并冲突,特别是如果您不同时还原B'
和C'
,但这可能比手动执行X
和Y
要好。Linux Torvalds写道,这可能会对您有所帮助。您可以检查合并提交,以查看其家长是谁:
git show <SHA1(D)>
更新:我在仔细阅读一些旧资料,发现我给出的答案完全不正确。如果您执行上述操作,您将不会得到状态A,而是会得到F