如何在Git中查看收到的提交?

180

可能有重复:
使用Git如何找出本地和远程之间的修改文件

如何在Git中查看传入的提交?或者更好的方法是,查看我刚刚git fetch/git pull了什么?

编辑:为了澄清问题:有人告诉我,为了获得一些修复,我应该从他们的存储库中拉取。我的目标是在接受它们之前查看它们的更改。git pull会自动合并,这不是我想要的。 git fetch将获取它们而不会合并,但我不确定如何查看我刚刚拉取了什么。最初措辞的原因是我通常使用Mercurial,其中命令将是hg incoming <repo name here>,这是Git似乎缺少类似物的命令。

5个回答

215

incoming在Git中并不是完全对应的,因为你可以(而且我经常这样做)从多个存储库中拉取,并且每个存储库都有多个分支。

如果有一个类似于hg的incoming命令的等效命令,它可能是这样的:

git fetch && git log ..origin/master

也就是说,“获取来自上游的所有内容,然后将我的当前分支与上游主分支进行比较。”

同样地,"outgoing" 指的是:

git fetch && git log origin/master..

实际上,我只是手动输入它们(尽管我为其中一个创建了别名),因为很容易有许多本地分支跟踪和被许多远程分支跟踪,并且没有麻烦将其保持在一起。


8
你可能想使用 git diff --stat origin/master 来查看成功合并后 git pull 显示的差异统计信息。 - Jakub Narębski
3
谢谢您的提问!我可以为您翻译这段内容。请问我是否可以开始翻译了呢?"谢谢您的回答 @Dustin!我能问一下,我不太理解 log .. origin/master 后面的那些点代表什么意思?" - gideon
42
更通用的说法是,如果你不在主分支上,使用git log ..@{u}命令来查看当前本地分支所跟踪的远程上游分支上的提交记录。 - sschuberth
5
这应该是答案。 - angularsen
@Lucas,我已经在你的另一个问题中添加了答案。 - sschuberth
显示剩余3条评论

93

你可能也会对git whatchanged感兴趣,这个命令可以很好地概述一段提交历史中所做的更改。

如果你想要查看即将拉取的内容,请先执行git fetch命令,该命令只会更新远程仓库的本地追踪分支(而不是你自己的分支),然后使用任何能够显示你即将拉取的新提交的命令。例如:

git whatchanged ..origin

这是一种缩写,用于显示从“当前位置和起点的共同祖先”到“起点”的提交。


1
啊,我喜欢这个比使用git log更好。 - JP Silvashy
5
从git手册页面:
鼓励新用户使用git-log[1]。whatchanged命令与git-log[1]本质上是相同的,但默认显示原始格式的diff输出并跳过合并。 该命令主要保留出于历史原因;许多人在git log被发明之前阅读Linux内核邮件列表时学习Git,他们习惯于键入它。
- mja

18

你可能想要查看两个仓库之间的差异。假设你有一个本地的分支'master'和一个远程跟踪分支'origin/master',其他人在这个分支上提交代码,那么你可以获取关于这两个分支差异的不同统计信息:

git diff --summary master origin/master

git diff --stat master origin/master

git diff --numstat master origin/master

git diff --dirstat master origin/master

git diff --shortstat master origin/master

git diff --name-only master origin/master

git diff master origin/master

1
问题不是关于查看差异,而是关于可视化用户所做的提交和拉取请求。 - JP Silvashy
2
没错,但我感觉Netzpirat很接近了;如果这能显示日志而不是差异,那就完美了。 - Benjamin Pollack

8
当有人告诉你要pull时,他们会给你repo的URL和一个分支(默认为master)。
我只需要执行:
git fetch URL branch

紧随其后的是一个(按偏爱降序排列):

# note 3 dots in next 3 commands
gitk HEAD...FETCH_HEAD
    # shows all commits on both sides since the "fork" point
gitk --cherry-pick HEAD...FETCH_HEAD
    # as above but skips identical patches so you really see the differences
git log --graph --boundary --left-right --cherry-pick --decorate HEAD...FETCH_HEAD
    # I have a nice alias for this; it's the text mode eqvt of the above

我有时也使用“tig”,但是这种特定的用例(查看两侧)并不适合使用tig
然而,如果你将其缩小到两个点(可能更符合你的实际问题,尽管我仍然更喜欢三个点版本),你可以执行以下操作。
tig HEAD..FETCH_HEAD

以下是为方便起见的别名:

incoming = !sh -c 'git fetch && git log --graph --boundary --left-right --cherry-pick --decorate HEAD..FETCH_HEAD'
outgoing = !sh -c 'git fetch && git log --graph --boundary --left-right --cherry-pick --decorate FETCH_HEAD..HEAD'

1

不存在所谓的“传入提交”,用户在本地提交并推送它们。我会打开gitx或gitk(与git一起提供)并查看存储库的外观... 我认为这将给你一个清晰的视图。

使用:gitk --all 查看。


请查看我澄清后的问题。 - Benjamin Pollack
1
啊,我现在明白你的意思了,达斯汀的答案非常准确。谢谢你提供更多细节。 - JP Silvashy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接