自创建分支以来显示提交记录

103

有没有一种方法可以使用git log或其他命令只查看在分支创建后添加的提交?

usage: git log [<options>] [<since>..<until>] [[--] <path>...]
   or: git show [options] <object>...

    --quiet               suppress diff output
    --source              show source
    --decorate[=...]      decorate options

1
相关链接:如何在git中获取分支上的更改 - John Bartholomew
相关:https://dev59.com/fmw05IYBdhLWcg3wahNN,https://dev59.com/NXRB5IYBdhLWcg3w7rmV - Trevor Boyd Smith
7个回答

99

完整的文档在这里:https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html

假设您有一个看起来像这样的存储库:

base  -  A  -  B  -  C  -  D   (master)
                \
                 \-  X  -  Y  -  Z   (myBranch)

验证仓库状态:

> git checkout master
Already on 'master'
> git status ; git log --oneline
On branch master
nothing to commit, working directory clean
d9addce D
110a9ab C
5f3f8db B
0f26e69 A
e764ffa base

并且针对我的分支:

> git checkout myBranch
> git status ; git log --oneline
On branch myBranch
nothing to commit, working directory clean
3bc0d40 Z
917ac8d Y
3e65f72 X
5f3f8db B
0f26e69 A
e764ffa base

假设您在我的分支(myBranch)上,并且您只想查看自从从主分支(master)创建以来所做的更改。请使用双点版本:

> git log --oneline master..myBranch
3bc0d40 Z
917ac8d Y
3e65f72 X

三个点版本会显示从主分支尖端到我的分支尖端的所有更改。但是请注意,公共提交B不包括在内:

> git log --oneline master...myBranch
d9addce D
110a9ab C
3bc0d40 Z
917ac8d Y
3e65f72 X

请注意:git loggit diff的行为是不同的!二者的行为并非完全相反,但几乎相反:

> git diff master..myBranch
diff --git a/rev.txt b/rev.txt
index 1784810..e900b1c 100644
--- a/rev.txt
+++ b/rev.txt
@@ -1 +1 @@
-D
+Z

> git diff master...myBranch
diff --git a/rev.txt b/rev.txt
index 223b783..e900b1c 100644
--- a/rev.txt
+++ b/rev.txt
@@ -1 +1 @@
-B
+Z

因此,两个点的版本显示了从主分支的最新提交(即D)到我的分支的最新提交(Z)的差异。而三个点的版本则显示了从我的分支的基础提交(即B)到最新提交(Z)的差异。


如果你执行 git log --oneline myBranch..master,那么会得到 DC 吗? - MiniGod
4
点赞,因为你描述了...和...之间的区别并提供了例子。非常棒的回答! - Gui Lima
1
谢谢指出 log 和 diff 表现不同(几乎相反)。这是为什么呢? - onlyanegg

70

你需要使用双点符号:

git log master..<your_branch_name>

我使用了以下的仓库结构进行测试:

a - - c - e - - g - i   master
  \ b - d / \ f - h     test

我尝试了 git log master..test

f - h

然后是 git log master...test:


  - g - i
  f - h

所以,双点表示在test中的提交但不在master中(^master temp),而三个点表示在mastertest中的提交,但两者都没有。

在这个问题中,另一个很好的答案首先回答正确并且解释得更好(https://dev59.com/1Gkw5IYBdhLWcg3wrsdS#24769534)。它可能应该被标记为答案而不是我的。您还可以参考这个解答(https://dev59.com/NXRB5IYBdhLWcg3w7rmV#463027),它帮助我更好地理解双点和三点符号之间的区别。


1
git log master... 对我没有起作用,只有 git log master.. 起了作用。请注意是两个点而不是三个点。 - NecipAllef
很高兴它对你有用。双重for循环显然是正确的语法。但要小心,点确实很重要。请参阅Alan Thompson的答案,详细解释双点和三点符号之间的区别。 - Matt Meng
这给了我奇怪的结果... 当 master..mybranch 给出 1(确实只有一个提交自分支创建以来),你的版本使用三个点却给出了 35。35 是从哪里来的不清楚。看起来它计算了自分支创建以来在 master 上发生的所有提交。或者可能是分支和主干上的所有提交... - Alexander Amelkin
如果这对您不起作用,请考虑是否可能是指的origin/master而不是本地版本(如果是这种情况,就像我一样,您可以简单地执行origin/master..mybranch - Torque

17

如果你在你创建的分支上:

git log master..

5

是的,可以比较您的“新”分支和主分支(通常命名为:“master”):

git log master..<your_branch_name>

当然,替换<your_branch_name>

6
这只显示自从您最后从主分支或反之拉取以来的提交记录,而不是显示自从创建该分支以来的提交记录。 - spiffytech

0

我可能错了,但我不认为任何答案都完全符合OP所问的问题,所以我想添加一个新答案。我相信这是我曾经遇到的完全相同的问题,因为在其他源代码控制系统中,这非常容易做到。

我在MASTER中有以下内容:

'develop' | --> 'GP603'

在ORIGIN(我的本地系统)中,我有:

'GP603' [从远程/GP603分支克隆]

然后我执行了两个不同的提交。第一次提交更改文件X。第二次提交更改文件X和文件Y。几天后,我只想验证我对本地分支ORIGIN/GP603状态的假设。这就是我验证只有我记得做的2个提交(实际上是该分支上唯一的2个提交)的方法:

$ git log origin/GP.603...

(提交2) commit b0ed4b95a14bb1c4438c8b48a31db7a0e9f5c940 (HEAD -> GP.603) Author: xxxxxxx Date: Wed xxxxx -0400

1. Fixed defect where the format of the file names and paths were being added to HashTable in such a way that they would never be matched in any comparison.  This was an
defect causing older failed files to never be moved to the correct directory (WindowsServiceApplication.cs)

2. Removing worthless and contextless message as it does nothing but clog the log with garbage making it harder to read (DinoutFileHandler.cs)

(提交1) 提交2c4541ca73eacd4b2e20d89f018d2e3f70332e7e 作者:xxxxxxxxx 日期:周二,xxxxx年xx月xx日-0400

In ProcessFile() function need to perform a .ToLower() on the file path string when adding it o the failedFiles collection.

0

这个命令对我非常有效。我只想看到在起始和结束引用之间提交的增量中更改的文件名称。

 git log --no-merges --pretty=oneline --name-only <begin ref>..<end ref>

它会输出如下内容:

<commit hash> <commit subject line>
foo.txtr
bar.txt

-1

我经常会进入“哦,天哪,我干了什么”的模式。具体来说,这种令人困扰的恐惧感涉及当前分支的最新更改。很高兴看到提交时的责备游戏,我按照以下方式进行。(假设您在感兴趣的“当前”分支中,并已从“dev”分支中分支出它。)

git log --oneline dev..

它给我提供了我所做的提交列表,以便追溯到混乱、罪恶和毁灭不是现实的地方。此外,如果您像一只ADHD猴子一样过度提交,它也会有所帮助。一旦我确定了我的方向列表,我就可以缩小范围并像this article中记录的那样进行分析——底部有一个关于限制输出的部分。


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