了解 git diff 和 git cherry-pick 的工作原理



以下是repro repo:https://github.com/sathishsoundharajan/git-diff

步骤

  1. 在github中创建了新的存储库
  2. 已创建主分支
  3. 将master.txt文件添加到master分支并提交
  4. 已从master创建名为feature branch的新分支
  5. 将feature.txt文件添加到功能分支并提交
  6. 切换到主分支
  7. 将新文件new-master.txt添加到master分支并提交(CommitId:https://github.com/sathishsoundharajan/git-diff/commit/593da755a9ea90b6f55bcc6d184f249218bf4170)
  8. 现在,出于某种原因,让我们假设我必须精心挑选这个提交到功能分支
  9. 切换到功能分支
  10. 使用git cherry-pick 593da755a9ea90b6f55bcc6d184f249218bf4170。Cherry在没有冲突的情况下被选中,但commit_id更改为https://github.com/sathishsoundharajan/git-diff/commit/e58427c82322d6a3ec933741887f5b8312981e11
  11. 现在,如果我们从feature分支向master提出pull请求/在master和feature分支之间获取git diff,我应该只在diff中看到feature.txt文件https://github.com/sathishsoundharajan/git-diff/pull/1

问题:

  1. 为什么在cherry-pick之后提交id发生了更改
  2. 我们可以停止cherry pick不创建新的提交id并重用现有的提交id吗
  3. 为什么在gitdiff中我看到了new-master.txt,尽管它已经在master分支中了
  4. 有没有办法让git不显示这种差异
  5. 有没有一种方法可以在不比较提交ID的情况下,通过比较文件中的实际更改来查看两个分支之间的差异

1,因为历史记录不同,因此出于安全/加密原因,ID不能相同。

2个,相关问题1。。。如果你有相同的ID,那就意味着你发现了碰撞(或者你正在产生完全相同的对象,就像git svn所做的那样(。。。理论上是可能的,但是。。。。

3,因为在PR/MR中,您看到的不是两个分支的提示之间的差异,而是因为功能分支已启动,例如(如果您尝试git diff...而不是..(。如果你看到了分支的2个tlp之间的差异,代码审查将是地狱,因为你会看到MR/PR本身的变化,加上自MR/PR分支启动以来在目标分支中引入的变化(不要说随着更多的东西合并到目标分支,这些变化会随着时间的推移而变化(。谁会想那样工作?

4喜欢两个分支之间的差异吗?尝试使用..而不是...。现在,在github上?如果他们认为有必要,他们可能会提供选项,但我认为你不会发现很多客户会感兴趣,那么这是关于它们的,而不是关于git的。

5你什么意思?

最新更新