Git:在不提交的情况下将Cherry-Pick应用到工作副本

386

我有几个分支,其中存放着我想不时应用于工作副本的某些提交。最初我尝试了 cherry-picking,但我不想在目标分支中留下该提交。

所以我执行了 cherry-pick + reset HEAD~1 --soft

是否有像 cherry-picking 一样仅针对工作副本的更简单的方法?


8
你可以使用“-n”标志表示“不提交(commit)”。在这里查看:http://git-scm.com/docs/git-cherry-pick。 - Igal S.
6
针对一系列提交,可以使用命令git cherry-pick HEAD..<AwesomeBranch> -n进行挑选并将它们应用到当前分支上,但不会自动提交。 - schoetbi
7个回答

656

54
-n 将提交内容带到了暂存区。要将其从暂存区移除,需要使用 git reset HEAD - Vishnu N K
1
只需要使用 git reset 即可。 - Krishna
1
对于未来需要仅选择提交的某些部分的读者,请使用“git add -p”选择您需要的代码块。 - e.ad

25

如果您正在使用终端

git cherry-pick -n <HASH>
如果您使用的是Intellij Idea。
Settings -> Version Control -> git
untick commit automatically on cherry-pick 

https://intellij-support.jetbrains.com/hc/en-us/community/posts/4404012212882-Setting-Commit-automatically-on-cherry-pick-disappeared-in-2021-2-Beta-2 - Neo

18

如果您只是想将提交中所做的所有更改应用于您的工作目录,您也可以使用apply而不是cherry-pick

git show <commit> | git apply

这将会应用在<commit>中所做的更改,但不会将它们添加到暂存区或创建提交。


4
这样做的(不)优点是它无法处理冲突。 - artless noise
1
这对我有帮助。由于git stash pop将所有内容都弹出到暂存区(即使我在暂存区和工作区有不同的更改),我使用一个临时分支创建了一个假的存储区,其中包含两个提交(暂存区和工作区)。在切换回主分支后,使用git cherry-pick --no-commit <暂存区哈希值>将暂存区的提交返回到暂存区非常容易,但是如果没有这个技巧,将工作区的提交正确地返回到工作树将不容易:git show <工作区哈希值> | git apply - undefined

15

针对IntelliJ用户

设置 > 版本控制 > Git:取消勾选自动提交精选

这里输入图片描述

更新

此功能已被移除并默认设置为开启状态。 有很多投诉,也许他们会将其恢复。

同时,您可以通过从提交视图中的"Cherry-Pick Selected Changes"实现相同的结果(如Neo分享的主题中所提到的):

这里输入图片描述


1
IntelliJ IDEA 2021.2.1 (CE) 目前尚不支持此功能。 - Ricardo
是的,不幸的是 :/ - Trayan Momkov
1
https://intellij-support.jetbrains.com/hc/en-us/community/posts/4404012212882-Setting-Commit-automatically-on-cherry-pick-disappeared-in-2021-2-Beta-2 - Neo
https://youtrack.jetbrains.com/issue/IDEA-275207/Commit-automatically-on-cherry-pick-settings-is-no-longer-available-in-PhpStorm-20212 - Neo
正是我在寻找的。谢谢!很抱歉我无法提出一个精确的问题来匹配这个答案。 - daifei4321

8

只需要运行:

$ git cherry-pick --no-commit <HASH>

2
我遇到了这个错误:error: server/metadata/metadata-preui-prod.xml: No such file or directory 现在我这样做: git checkout SHA -- server/metadata && git reset -- server/metadata

旧的方法

想要选取单独的文件变更可以使用以下命令: git show SHA -- file1.txt file2.txt | git apply - 如果你想要选取SHA版本中所有的文件变更可以使用以下命令: git show SHA | git apply - 参考链接:如何只选取特定文件的git cherry-pick变更?

1

如果不打开控制台,在Visual Studio 2019中解决此问题,可以转到“Git存储库”窗口,右键单击Git提交历史记录,然后在要选择的提交上执行樱桃拣选操作。这将提交樱桃拣选。但是,然后我右键单击下面的提交,并执行“重置 -> 保留更改(--mixed)”,这将重置提交,但保留未提交的更改。


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