了解 git diff 和 git cherry-pick 的工作原理
Understanding how git diff & git cherry-pick works
这是回购回购:https://github.com/sathishsoundharajan/git-diff
步骤
- 在 github 中创建了新的存储库。
- 创建主分支。
- 已将 master.txt 文件添加到 master 分支并提交。
- 从 master 创建了名为 feature-branch 的新分支。
- 已将 feature.txt 文件添加到功能分支并提交。
- 切换到主分支。
- 向 master 分支添加了一个新文件 new-master.txt 并提交了 ( CommitId: https://github.com/sathishsoundharajan/git-diff/commit/593da755a9ea90b6f55bcc6d184f249218bf4170)
- 现在,由于某种原因,我必须挑选这个提交到功能分支。
- 切换到功能分支。
- 使用
git cherry-pick 593da755a9ea90b6f55bcc6d184f249218bf4170
。精心挑选,没有冲突,但 commit_id 更改为 https://github.com/sathishsoundharajan/git-diff/commit/e58427c82322d6a3ec933741887f5b8312981e11
- 现在,如果我们从 feature-branch 向 master 提出拉取请求/在 master 和 feature-branch 之间进行 git 差异,我应该只会在差异中看到 feature.txt 文件。但我也可以在 diff 中看到 new-master.txt 文件
https://github.com/sathishsoundharajan/git-diff/pull/1
问题:
- 为什么 commit-id 在 cherry-pick 之后改变了?
- 我们可以停止 cherry-pick 以不创建新的 commit-id 并重用现有的吗?
- 为什么在 git diff 中我看到了 new-master.txt,即使它已经在 master 分支中了?
- 有没有办法让 git 不显示这个差异?
- 有没有一种方法可以在不比较提交 ID 的情况下通过比较文件中的实际更改来查看两个分支之间的差异?
1 因为历史不同所以 ID 不能相同 security/cryptographic 原因。
2 不,相关的 ro #1 ...如果你有相同的 ID,那就意味着你发现了碰撞(或者你正在生成完全相同的对象,就像 git svn
所做的那样)。 . 理论上可行但是....
3 因为在 PR/MR 中,您看到的差异不是两个分支的提示之间的差异,而是因为 feature 分支已启动 ,说(如果你得到什么尝试 git diff
和 ...
而不是 ..
)。如果您看到分支的 2 个 tlps 之间的差异,代码审查将是地狱,因为您会看到 MR/PR 本身的更改以及自 MR/PR 分支启动以来目标分支中引入的更改(更不用说随着更多的东西被合并到目标分支,这些变化会随着时间的推移而改变)。谁愿意那样工作?
4 喜欢 2 个分支提示之间的差异吗?尝试使用 ..
而不是 ...
。现在,在 github 上?如果他们认为有必要,他们可能会提供该选项,但我认为您不会发现很多客户会感兴趣....和 然后是关于他们的,而不是关于 git.
5 你是什么意思?
这是回购回购:https://github.com/sathishsoundharajan/git-diff
步骤
- 在 github 中创建了新的存储库。
- 创建主分支。
- 已将 master.txt 文件添加到 master 分支并提交。
- 从 master 创建了名为 feature-branch 的新分支。
- 已将 feature.txt 文件添加到功能分支并提交。
- 切换到主分支。
- 向 master 分支添加了一个新文件 new-master.txt 并提交了 ( CommitId: https://github.com/sathishsoundharajan/git-diff/commit/593da755a9ea90b6f55bcc6d184f249218bf4170)
- 现在,由于某种原因,我必须挑选这个提交到功能分支。
- 切换到功能分支。
- 使用
git cherry-pick 593da755a9ea90b6f55bcc6d184f249218bf4170
。精心挑选,没有冲突,但 commit_id 更改为 https://github.com/sathishsoundharajan/git-diff/commit/e58427c82322d6a3ec933741887f5b8312981e11 - 现在,如果我们从 feature-branch 向 master 提出拉取请求/在 master 和 feature-branch 之间进行 git 差异,我应该只会在差异中看到 feature.txt 文件。但我也可以在 diff 中看到 new-master.txt 文件 https://github.com/sathishsoundharajan/git-diff/pull/1
问题:
- 为什么 commit-id 在 cherry-pick 之后改变了?
- 我们可以停止 cherry-pick 以不创建新的 commit-id 并重用现有的吗?
- 为什么在 git diff 中我看到了 new-master.txt,即使它已经在 master 分支中了?
- 有没有办法让 git 不显示这个差异?
- 有没有一种方法可以在不比较提交 ID 的情况下通过比较文件中的实际更改来查看两个分支之间的差异?
1 因为历史不同所以 ID 不能相同 security/cryptographic 原因。
2 不,相关的 ro #1 ...如果你有相同的 ID,那就意味着你发现了碰撞(或者你正在生成完全相同的对象,就像 git svn
所做的那样)。 . 理论上可行但是....
3 因为在 PR/MR 中,您看到的差异不是两个分支的提示之间的差异,而是因为 feature 分支已启动 ,说(如果你得到什么尝试 git diff
和 ...
而不是 ..
)。如果您看到分支的 2 个 tlps 之间的差异,代码审查将是地狱,因为您会看到 MR/PR 本身的更改以及自 MR/PR 分支启动以来目标分支中引入的更改(更不用说随着更多的东西被合并到目标分支,这些变化会随着时间的推移而改变)。谁愿意那样工作?
4 喜欢 2 个分支提示之间的差异吗?尝试使用 ..
而不是 ...
。现在,在 github 上?如果他们认为有必要,他们可能会提供该选项,但我认为您不会发现很多客户会感兴趣....和 然后是关于他们的,而不是关于 git.
5 你是什么意思?