【问题标题】:Diff between two commits with two different parent commits两个不同父提交的两个提交之间的差异
【发布时间】:2016-08-09 07:28:06
【问题描述】:

当我对我的代码运行测试时,我总是在 git 中拍摄代码的快照(使用 stash create)并将提交 ID 附加到测试中(确保将其放在 reflog 中以防止它成为垃圾集)。这样我以后可以轻松地准确检查导致该测试输出的代码。

但通常,我想将旧代码与我当前版本的代码进行比较。问题是我当前版本的代码已经重新基于 master 分支,所以一个 git diff 将显示数百次提交的组合差异。我目前所做的是两个 git 显示,然后是一个普通(非 git)差异,但这有一个巨大的缺点,即对于具有不同行号的每一行,这个行号被认为是一个差异。

那么当第二次提交被重新设置时,有没有一种简单的方法可以在两次提交之间进行差异?所以基本上,我正在寻找类似于在内部重新定位第一次提交,显示差异,然后摆脱该提交的内部重新定位版本的东西。当然,如果变基失败,那就这样吧,但在大多数情况下,变基只对我有用,所以在大多数情况下这仍然有用。

我想我可以自己写这个,但它似乎是一个常见的问题,所以我想知道这样的东西是否已经存在?

【问题讨论】:

  • git diff old...current 是否没有显示您想要的内容(请注意那里的 3 个点,而不是 2 个)
  • 不,这显示了自旧的父提交以来对当前分支的所有更改(在我的情况下,旧的父是当前的祖先)。因此它还显示了数百个其他提交。它确实不同于两个点,但在我的情况下它相当于git diff old^..current,这也不是我想要的。
  • @max630 是的,这就是我在第二段中描述的内容。它不太好用。与此同时,我发现了 interdiff 工具。这给出了比正常差异更好的结果。我正在考虑将其作为答案,但首先我将通过将 old 挑选到 new 的父提交来将其与该方法进行比较。 Interdiff 有时无法注意到两个差异中相等的部分,所以我想git cherry-pick 可能会更好。
  • 是的,@max630 的回复是我发现的最好的。基本上你区分差异。我意识到 (Gnu?) diff 选项 --ignore-matching-lines 对清理 diffing diffs 产生的不可避免的垃圾有很大帮助。我对这个变体很幸运: % diff -U3 --ignore-matching-lines="^@@ "

标签: git


【解决方案1】:

我不知道直接在 git 中执行此操作的方法。

但是按照您的建议,通过编写一个执行“幕后”变基的小脚本,应该可以正常工作。

顺便说一句,我只想在这里放置一个标签而不是使用存储。

最后,您可能需要更新此问题的标题以提及rebase

【讨论】:

  • 我没有使用 the 存储,我使用的是git stash create,它以两次提交的形式创建索引和工作区的快照。这就像手动创建这些提交然后进行重置,但 git 已经内置了这个。标记与此无关:这是一种“记住”某个提交的方式,但我的问题是创建提交,而不是记住它,因为我已经通过在外部保存其提交 ID 来记住它。它确实可以防止垃圾收集,但这就是我使用 reflogs 的目的,它也可以正常工作并允许test@{one week ago} 之类的东西。
猜你喜欢
  • 2021-09-12
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
相关资源
最近更新 更多