git:如何查看单个分支的提交记录

19

一位同事从主分支(master)创建了一个本地分支('branchA'),进行了一些工作,然后推送(push)到远程,将其合并(merge)到主分支(master)中,之后又进行了一些工作并再次推送。同时,其他同事一直在其他分支上工作,并将它们合并到主分支(master)中。

现在我需要拉取(branchA)来进行审查。所以我执行了git pullgit checkout -b branchA origin/branchA命令,这是没问题的。但所有的命令(git diff/log/show)显示了整个仓库所有分支的提交(commit)。

如何查看(branchA)分支相对于其创建自哪个版本的主分支(master)的所有提交(commit)的差异(diff)?

另外,如何将(branchA)分支与当前主分支(master)的HEAD进行git diff,但只查看(branchA)分支中更改的文件?

5个回答

21
以下内容适用于您的第二个问题,即如何找到branchA与您本地当前版本的master之间的差异。您需要使用git log中的“双点”语法,以查看在branchA中所有不在master中的提交。具体来说:

git log master..branchA

根据git log手册:

SYNOPSIS
   git log [<options>] [<since>..<until>] [[--] <path>...]
   ...
   <since>..<until>
   Show only commits between the named two commits. When either <since> or <until> is omitted, it defaults to HEAD, i.e. the tip of the current branch.
   For a more complete list of ways to spell <since> and <until>, see gitrevisions(7).

如果您想查看在masterbranchA中的提交,但不包含两者共有的提交,则可以使用“三点”语法:

git log master...branchA

最后,你可以使用完全相同的语法来使用 git diff,即分别为 git diff master..branchAgit diff master...branchA

附带地,如果你已经检出了 branchA,则不需要将其指定为 <until>。Git 会假定 HEAD 如果未指定,因此这两组命令是等价的:

git checkout branchA
git log master..

并且

git log master..branchA

4
  1. git diff master..brnachA: 会比较master的HEAD和branchA之间所有修改过的文件。
  2. git diff master...brnachA: 会将branchA与创建它的master版本进行比较。

顺便提一句:git diff 命令将在命令行中生成输出。如果想在一些可视化工具中查看输出,请使用 git difftool 命令。

你也可以将所有的 git diff 参数和选项传递给 git difftool


-2-不太对。它会返回masterbranchA中的提交,但不会同时返回两者。如果master前进了50个提交,但是branchA已完全合并,它将返回master中的50个提交。这不会将branchA与其在master中的合并基进行比较,这似乎是第一个问题? - Christopher

2

Git提交不保留有关“在哪个分支上”提交的信息。它们只给您一个可以从中回溯的树中的点。一旦发生合并,您就无法从合并提交中确定来自您起始的分支的父级。这在此处中详细讨论。

这是我的理解。如果我错了,我很乐意接受纠正。


0

你可以使用 git log --branches=mybranch

这将显示特定分支上的日志


这个不起作用。可能是因为我已经合并到主分支,但我看到了其他人所做的更改。 - user1491250

0

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