Git Cherry-pick——如何显示更改但不执行任何操作

7
有没有办法在实际执行 'git cherry-pick' 命令之前显示将要应用的更改?我想看到一个类似于 'git diff' 的更改列表,而不会真正地进行更改或修改任何内容。

1
显而易见的建议是使用“git diff”,你已经提到了,但我猜想你传递给cherry-pick命令的不仅仅是一个单独的提交吧?也许你可以举个例子。 - IMSoP
1
请记住,对于普通(单父)提交使用的 git show 命令会显示与 git cherry-pick 将尝试应用到您当前提交的相同差异。因此,如果您在考虑“我可能喜欢提交 a123456,让我看看它做了什么”,那么您将运行 git show a123456 来查看它做了什么。然后,您可以决定是否尝试进行 cherry-pick。 - torek
是的,我知道git show(那是我目前正在使用的)但我也想直接看到cherry-pick将替换/更改哪些行。 - mikkom
3个回答

6

git cherry-pick 没有像其他命令一样提供 --dry-run 选项。

但是,虽然不完全符合你的要求,你可以通过利用 -n (--no-commit) 选项 进行测试。

回滚操作将非常简单 :

(假设您从一个干净的工作树开始)

# cherry-pick without actually committing
git cherry-pick -n <commit>

# inspect changes
git diff --staged

# wipe all these temporary changes to go back to where you started
git reset --hard

1
这是我害怕得到的答案,但无论如何还是谢谢。如果可能的话,我想避免使用reset --hard。 - mikkom
在执行了 git reset --hard 命令之后,git status 返回了 Cherry-pick currently in progress. (run "git cherry-pick --continue" to continue) ...。运行 --continue 命令将一切恢复到 git cherry-pick -n <commit> 之前的状态。 - Abdull
1
事实证明(至少在git版本2.39.1中),根本不需要执行git reset --hardgit cherry-pick --abort将会恢复到git cherry-pick -n <commit>执行之前的状态。 - Abdull

2

我已在一个(临时)分支上做了这样的“实验”。原始主分支未被更改。

git checkout -b cherry-test
git cherry-pick <sha1>
git show/log/whatever
git checkout master
git branch -D cherry-test

0

我相信你可以通过以下方式在分支上的最后一次提交和你想要挑选的提交之间进行 git diff:

git diff [last-commit-hash] [cherry-pick-commit-hash]


1
这实际上和 cherry-pick 一样吗?这会将整个 repo 进行差异化比较,而 cherry-pick 只会将单个提交中的更改合并,而不是整个 repo。我不会进行完整的合并,我之所以选择 cherry-pick 是有原因的。 - mikkom

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