我经常发现自己想压缩本地存储库中的两个或两个以上的提交。我这样做的策略是从软重置开始,然后提交所有经过重新审查的更改。
对于软重置,我使用以下命令:
git reset --soft HEAD~n
其中n是我要重置的提交数。如果我没有将合并提交包含在我想要重置的提交数量中--例如,如果我在当前分支上提交了四次,并且希望软重置头~4,这就可以很好地工作。
但是,假设在我的4次提交之后,我将另一个分支合并到我的当前分支中。Git隐式提交合并更改,并在我执行git日志时显示。现在,如果我想做一个软复位返回到头部~5 (4提交+合并提交),git将忽略合并提交并重置下一次非合并提交,以及我打算重置的4提交。本质上,我应该重新设置头~4- git似乎忽略合并提交时,进行重置。
为什么吉特会这样做?如何将这些合并提交包含在软重置中?
(让我们举一个例子:我已经按时间顺序提交了a,F是一个合并提交。git重置--软头~4将分支重置为A:提交BCDE被重置,提交F不包括在4中。
发布于 2018-07-30 11:46:41
这并不是因为git忽略了合并提交。这是因为~
和^
在Git中的工作方式。
~n
的意思是通过第一个parent.If (您将其命名为^n
)在层次结构中向上,它意味着从左开始到n th
父节点。
如果我们在git存储库中运行git log --graph --pretty=oneline
(您给出的示例),可能会有以下内容:
* da497fa213169e75b9cec382e28561d5e56f6daf (HEAD -> master) f (merge)
|\
| * aaa519bce409d0fb5e187dff6ed82d73d7cd437b (Dev) e
|/
* f537237e48fc7218af288ddc91a02c1e24ea1887 d
* 2c41ee71ee7b9b450cd10eab685e0007fe92b688 c
* 411c96c85a2e34bf798cab5c0e6f4532a5ebfe35 b
* c9d38077a5704df382b0fd0d83d4fcdf7c408f23 a
注意,提交f
有两个父级(由于合并提交)。现在,当您说HEAD~4时,它将从左开始在其层次结构中查找4个提交,这将是b
。(它不会使用e
,因为它在second parent
of f
中。)
您可以使用git rev-parse
命令解析和获取特定的提交id。
例如:如果您运行git rev-parse HEAD~4
,您将看到它返回a
的提交id。
在我看来,您不需要担心这一点,因为git最终会将您的分支重置为给定的提交id。但是,如果您想要重置您的分支来提交e
,那么现在需要告诉它访问它的正确方式。
所以你可以告诉它,选择第二个家长的头,并重置为。
等于:头^2
您还可以将其扩展到通过a
通过e
,如果您将重置命令设置为:
git reset --soft HEAD^2~3
。
但在我看来,这在你的情况下并不是必需的。
下面是上面的一个很好的表示,摘自git rev-parse
文档。
G H I J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A
A = = A^0
B = A^ = A^1 = A~1
C = A^2 = A^2
D = A^^ = A^1^1 = A~2
E = B^2 = A^^2
F = B^3 = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2 = B^^2 = A^^^2 = A~2^2
I = F^ = B^3^ = A^^3^
J = F^2 = B^3^2 = A^^3^2
希望它有帮助:)
https://stackoverflow.com/questions/51591873
复制相似问题