0

当您git pull从远程存储库运行时,您将看到所有已更新文件的列表和更改的行数,以及插入/删除的大致比率。您还将看到任何创建、重命名、删除和模式更改的文件。例如:

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

有没有办法获得与此类似的输出,但通过在本地 repo 上指定开始和结束提交?我基本上想要与快进输出相同的git pull输出,但没有实际执行任何操作,只是显示如果我处于本地 repo 处于提交 A 并且远程处于提交 B 并且我执行了 pull 的情况下发生什么(即使两个提交都已经在我的本地仓库中)。或者,也许更简洁,我想看看如果我从提交 A 开始并检查提交 B 会发生什么的摘要列表。

我知道git diff哪个基本上执行了所需的功能(向我展示了两次提交之间的变化),但它打印出两次提交之间的整个差异(我相信它会以适合的方式出现patch?),而我只是寻找总结报告,如快进报告。

4

1 回答 1

3

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

Updating 5524541..cff1e7a

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

(请注意,这两个提交哈希 ID 不太可能再次出现在其他任何人身上,因此从这个答案中保存它们毫无意义。因为它们是缩短的哈希 ID,它们比 1-in-2 160更有可能任何一个完整的哈希 ID 的机会,但它们仍然非常不可能。)

为什么这有效

当你跑git pull...

...您实际上正在运行git fetch,然后是第二个 Git 命令。在您的情况下,第二个 Git 命令是git merge.

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

Updating 5524541..cff1e7a

它获得了一些以 commit 结尾的提交cff1e7a

此时,通过连接到某个分支名称找到的当前提交是. 也就是说,如果您在 branch 上,则该名称表示HEAD5524541dev dev 5524541

New-to-you commitcff1e7a是“严格领先于” commit 5524541,所以当你git pull运行时git merge——它允许快进操作而不是合并——你git merge 了一个快进操作,改变你当前的分支名称,以便它引用cff1e7a. 1 这一切都很正常,但它发展得非常快,你可能没有看到它发生。

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

请注意,不需要使用两点语法:

git diff --stat --summary 5524541 cff1e7a

和:

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

同样的事情。键入一个空格比键入两个点更容易,考虑到工作方式,一个空格的版本比两个点的版本更合乎逻辑git diff,所以这是我推荐的那个。

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

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

剩下的--summary就是这个部分。


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

虽然这是一个见仁见智的问题,但我们中的一些人(包括我自己)认为,在使用git pull. 所以这是一件好事。当git pull导致真正的合并时,它会产生一些人所说的狐步合并,这通常在某种意义上是“倒退”的。另请参阅GIT:如何防止在我的“主”分支中合并狐步舞? 在某种程度上,这是次要的,但狐步舞合并仍然不好

于 2021-04-27T00:36:50.980 回答