有没有办法让 Git 打印出两次提交之间的 "fast forward" 任务?

Is there a way to get Git to print out the "fast forward" tasks between two commits?

当您从远程仓库 运行 git pull 时,您会看到所有已更新文件的列表和更改的行数,以及 insertions/deletions 的近似比率.您还会看到任何已创建、重命名、删除和模式更改的文件。例如:

Updating 5524541..cff1e7a
Fast-forward
 .gitignore                                 |   4 +-
 .vscode/settings.json                      |   7 ++
 README.md                                  |  40 ++++++-
 clean.sh => dev_scripts/clean.sh           |   0
 dev_scripts/main.sh                        |   2 +-
 ... many more files here ...
 41 files changed, 1044 insertions(+), 502 deletions(-)
 create mode 100644 .vscode/settings.json
 rename clean.sh => dev_scripts/clean.sh (100%)
 delete mode 100644 dev_scripts/test_old.py
 create mode 100644 postinstall/2.0.7_00_fix_missing_models.py
 create mode 100644 test/csv_test.py

有没有一种方法可以通过在本地存储库上指定开始和结束提交来获得与此类似的输出?我基本上想要与 git pull 快进输出相同的输出,但实际上没有执行任何操作,只是显示如果我在我的本地回购的场景中 发生什么在提交 A 上,远程在提交 B 上,我做了一个拉动(即使两个提交都已经在我的本地仓库中)。或者,更简洁地说,我想查看如果我从提交 A 开始并检出提交 B 会发生什么的摘要列表。

我知道 git diff 它基本上执行了所需的功能(向我展示了两次提交之间的变化),但它打印出了两次提交之间的整个差异(我相信它会出现在某些东西中suitable for patch?), 而我只是在寻找像快进报告这样的摘要报告。

作为,这里需要git diff --stat --summary。棘手的部分是找到正确的提交(或哈希 ID)作为此 git diff 的两个输入。但是,它们就在您的屏幕上:

Updating 5524541..cff1e7a

您也可以在 HEAD@{1}HEAD(或 HEAD@{0})中找到它们一段时间,尽管最终这些数字会增加,因此它们在 HEAD@{2}HEAD@{1},然后是 HEAD@{3}HEAD@{2},依此类推。您可以使用您所在的 b运行ch 的 reflog,因为这些数字通常增加得更慢一些。例如,如果你在 b运行ch dev 上,这些将是 dev@{1}dev@{0},等等

(请注意,这两个提交哈希 ID 不太可能对其他任何人重复出现,因此没有必要将它们从这个答案中保存下来。因为它们是 缩短的 哈希ID,它们比任何一个完整哈希 ID 的 1 合 2160 机会更有可能,但它们仍然非常不可能。)

为什么这有效

When you run git pull ...

...你实际上是 运行ning git fetch 然后是第二个 Git 命令。在你的例子中,第二个 Git 命令是 git merge.

git fetch 操作从其他 Git 存储库获得了一些新的提交。在这种情况下:

Updating 5524541..cff1e7a

它获得了一些以提交 cff1e7a.

结尾的提交系列

此时,当前 提交,HEAD 连接到某个 b运行ch 名称发现,是 5524541。也就是说,如果你在 b运行ch devname dev meant 5524541.

新手提交 cff1e7a 是“严格领先于”提交 5524541,因此当您的 git pull 运行 git merge 允许快进操作而不是合并——你的git merge做了快进操作,改变你当前的b运行ch name 以便它引用 cff1e7a.1 这很正常,但它移动得非常快,您可能没有看到它发生。

最后,无论 git merge 做了什么,Git 都会从旧提交(即 5524541)生成一个 git diff --stat --summary 到新提交,cff1e7a.那就是你看到的输出。因此,如果您想重现该输出,运行 git diff --stat --summary 5524541 cff1e7a.

请注意,无需使用双点语法:

git diff --stat --summary 5524541 cff1e7a

和:

git diff --stat --summary 5524541..cff1e7a

完全一样的事情。输入一个 space 比输入两个点更容易,考虑到 git diff 的工作方式,一个 space 版本比两个点版本更合乎逻辑,所以这是我推荐的.

如果愿意,您可以只使用 --stat--summary 之一。 --stat 部分包括以下所有内容:

 41 files changed, 1044 insertions(+), 502 deletions(-)

--summary 部分是其余部分。


1并非所有合并都可以快进,但如果您愿意,所有快进都可以作为真正的合并来完成。当要存储在某个引用中的新值是现在存储在该引用中的哈希 ID 的后代时,就会发生快进。 b运行ch 名称是一种特殊的引用形式,因此 b运行ch 名称 可以 快进。允许 git merge 快进是默认设置。所以当git pull运行sgit merge时,快进操作很常见

虽然这是一个见仁见智的问题,但我们中的一些人(包括我自己)认为 只有 快进操作在使用 git pull 时才真正合适。所以这是一件好事。当 git pull 导致真正的合并时,它会产生一些所谓的 foxtrot 合并 ,这在某种意义上通常是“向后”。另见 在某种程度上这是次要的,但狐步舞合并仍然不是