使用git log查找最初分支和当前分支之间的差异

时间:2016-03-17 19:36:10

标签: git

我还没有看到类似这样的东西,因为那里的大部分内容都是关于显示当前起源/发展与当前分支之间的差异。

我所追求的是与我分支开发时的差异(例如,一个月前,开发已经发生变化)以及我的功能分支中的变化。

所以,让我们说我从开发分支,更改了几个文件,现在我想比较我最初创建分支和现在之间的差异。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

TL; DR:git diff develop...feature-X

分支机构的背景

分支机构不承载创建信息 - 分支名称只是指向一个特定提交的指针,其特殊功能是当您在" on"分支(如,git status表示on branch xyz"),并进行新的提交,指针自动移动以指向新的提交。

换句话说,分支名称​​自动指向分支的提示。这是 分支的工作原理,在git中,我们定义了"分支" as"我们可以通过从分支名称指向的提示开始来获得每个提交。"

(旁注:远程跟踪分支是相似的,除了您无法检查它们以及#34;它们,因此无法更新远程跟踪分支。远程跟踪分支背后的想法是它跟踪远程存储库中的其他提交的提交,在那个分支上进行提交并进行提交。由于我们只对下面的提交感兴趣,因此您可以在我们使用origin/develop的任何地方使用develop。)

那就是说,只要你(a)从你第一次创建分支机构起就没有合并任何东西,或者(b)真的想看看发生了什么 em>那一点,你想要的是对合并基础进行区分。

合并基地

让我们绘制一些提交图,以显示我的意思。假设您已经feature-X,并且您在develop之前提交了一些提交内容,develop此后一直向前推进:

... <- o <- * <- o <- o <- o     <-- develop
             \
              o <- o <- o <- o   <-- feature-X

标记为*的提交是两个分支连接的地方:commit *,并且每个早期提交都在两个分支上,而提交&#34;后&#34;标记为*的标记仅在developfeature-X上。历史记录加入的这一点是合并基础:最接近两个分支上的两个分支的提示的提交。

听起来你现在想要的是将提交*的内容与feature-X上提交最多提交的内容进行比较。

使用合并库有多种方法。最直接的是使用git merge-base

$ git merge-base feature-X develop

这将打印合并库的SHA-1哈希,现在您可以运行:

$ git diff <sha-1> feature-X

将给定与feature-X点的提交进行比较(当然,这是该分支的提示)。

三点语法

但事实证明,合并基础在其他方面非常有用。因此gitrevisions中有一个特殊的语法用于处理两个分支提示(或任何两个提交,真的)和它们的合并基础,即三点X...Y语法。

通常情况下,develop...feature-X(注意三个点)表示&#34;这些分支的一个上的每个提交 - 一个 - 但是上没有提交两个分支&#34;。也就是说,它包含之后的所有小o个节点,我们将其作为提交*绘制,但不提交*本身,也不提交任何提交在它之前。

但是,对于git diff,三点语法的含义略有不同:

$ git diff develop...feature-X

这找到两个分支之间的合并基础 - 即提交* - 然后将该合并基础与命名的右侧提交区分开来,即特征-X的提示。

如果你想看看develop中发生了什么,只需颠倒双方:

$ git diff feature-X...develop

和以前一样,git会找到合并基础,然后将其与右侧提交进行比较,这次是develop的提示。

如果您忘记了这些详细信息,请查看gitrevisionsgit diff的文档。

答案 1 :(得分:1)

这里有两个步骤(如果你愿意,可能会提出一个单行程):

1)Find the last commit before the branch was created

2)从(1)中取出哈希 - 让我们称之为aabbcc - 并在diff中使用它:git diff aabbcc..HEAD