git 如何跟踪标有 fixup/squash 标志的提交散列?
How does git keep track of the commit hash marked with a fixup/squash flag?
我知道 git commit --fixup <commit A's hash>
可以在执行 git rebase -i --autosquash
时创建一个将与提交 A 合并的提交 B。
当我 运行 git log
时,我的提交日志看起来像
commit <commit B's hash>
Author: xxx
Date: xxx
fixup! commit A's comment
commit <commit A's hash>
Author: xxx
Date: xxx
commit A's comment
对我来说,修复提交看起来与普通提交没有什么不同,除了评论前面有一个 "fixup!".
我想知道 git 如何以及在何处跟踪 commit B
是一个标记为 <commit A's hash>
的修复提交,如果它根本没有;如果是这样,是否有一个 git log
等价物允许我访问 <commit A's hash>
和 commit B
?
谢谢!
(免责声明:此答案基于观察)
它不会跟踪要修复的提交,它会在您进行变基时查找它并使用提交消息找到正确的提交。
我尝试了以下方法:
- 创建了一个新的存储库
- 做了一些提交
- 进行了 2 次提交,均带有消息 "initial"
然后我进行了修复提交,修复了这两个中的最后一个
git commit --fixup bb4adbd
日志现在看起来像这样:
λ git lg
* 21e0572: (5 minutes ago) fixup! initial (HEAD -> master)
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:32:51 +0100)
|
* bb4adbd: (5 minutes ago) initial
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:32:38 +0100)
|
* e6549e4: (9 minutes ago) initial
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:28:59 +0100)
|
* a311a82: (9 minutes ago) second
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:28:12 +0100)
|
* 2a5ca27: (10 minutes ago) initial
Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:27:12 +0100)
如果我这样做:
git rebase -i HEAD~3
然后 git 建议:
pick e6549e4 initial
fixup 21e0572 fixup! initial
pick bb4adbd initial
这里 git 正在尝试修复我的第一个 "initial" 提交,这不是我之前告诉它修复的那个。
但是,如果我只是 HEAD~2
,它会提示:
pick bb4adbd initial
fixup 21e0572 fixup! initial
这意味着 git 根本不跟踪这是关于哪个提交,它只是在修复提交的提交消息末尾记录一个 fixup! <commit message>
。
关于它为什么这样做而不是记录 SHA 的猜测是,这将在 rebase、cherry-pick 等情况下幸存下来。此外,这可能是在没有真正记录方式的情况下添加的这个 sha 以正确的方式,因为如果它确实记录了它修复的提交的 sha,那么该记录要么会阻止变基,要么也必须被修改。
我知道 git commit --fixup <commit A's hash>
可以在执行 git rebase -i --autosquash
时创建一个将与提交 A 合并的提交 B。
当我 运行 git log
时,我的提交日志看起来像
commit <commit B's hash>
Author: xxx
Date: xxx
fixup! commit A's comment
commit <commit A's hash>
Author: xxx
Date: xxx
commit A's comment
对我来说,修复提交看起来与普通提交没有什么不同,除了评论前面有一个 "fixup!".
我想知道 git 如何以及在何处跟踪 commit B
是一个标记为 <commit A's hash>
的修复提交,如果它根本没有;如果是这样,是否有一个 git log
等价物允许我访问 <commit A's hash>
和 commit B
?
谢谢!
(免责声明:此答案基于观察)
它不会跟踪要修复的提交,它会在您进行变基时查找它并使用提交消息找到正确的提交。
我尝试了以下方法:
- 创建了一个新的存储库
- 做了一些提交
- 进行了 2 次提交,均带有消息 "initial"
然后我进行了修复提交,修复了这两个中的最后一个
git commit --fixup bb4adbd
日志现在看起来像这样:
λ git lg
* 21e0572: (5 minutes ago) fixup! initial (HEAD -> master)
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:32:51 +0100)
|
* bb4adbd: (5 minutes ago) initial
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:32:38 +0100)
|
* e6549e4: (9 minutes ago) initial
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:28:59 +0100)
|
* a311a82: (9 minutes ago) second
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:28:12 +0100)
|
* 2a5ca27: (10 minutes ago) initial
Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:27:12 +0100)
如果我这样做:
git rebase -i HEAD~3
然后 git 建议:
pick e6549e4 initial
fixup 21e0572 fixup! initial
pick bb4adbd initial
这里 git 正在尝试修复我的第一个 "initial" 提交,这不是我之前告诉它修复的那个。
但是,如果我只是 HEAD~2
,它会提示:
pick bb4adbd initial
fixup 21e0572 fixup! initial
这意味着 git 根本不跟踪这是关于哪个提交,它只是在修复提交的提交消息末尾记录一个 fixup! <commit message>
。
关于它为什么这样做而不是记录 SHA 的猜测是,这将在 rebase、cherry-pick 等情况下幸存下来。此外,这可能是在没有真正记录方式的情况下添加的这个 sha 以正确的方式,因为如果它确实记录了它修复的提交的 sha,那么该记录要么会阻止变基,要么也必须被修改。