我在2个不同的分支工作:发行和开发。
我注意到我仍然需要将一些提交给发布分支的更改集成回开发分支。
问题是我不需要所有的提交,只有一些块在某些文件,所以一个简单的
git cherry-pick bc66559
这是行不通的。
当我做
git show bc66559
我可以看到差异,但真的不知道一个好方法,部分应用到我目前的工作树。
我在2个不同的分支工作:发行和开发。
我注意到我仍然需要将一些提交给发布分支的更改集成回开发分支。
问题是我不需要所有的提交,只有一些块在某些文件,所以一个简单的
git cherry-pick bc66559
这是行不通的。
当我做
git show bc66559
我可以看到差异,但真的不知道一个好方法,部分应用到我目前的工作树。
当前回答
如果“partial cherry picking”的意思是“在文件中,选择一些更改,但放弃其他更改”,可以通过引入git stash来完成:
做完整的樱桃采摘。 git重置HEAD^以将整个选定的提交转换为未分阶段的工作更改。 现在git隐藏保存-补丁:交互选择不需要的材料隐藏。 Git从工作副本中回滚存储的更改。 git提交 扔掉不想要的改变:git隐藏下降。
提示:如果你给不需要的更改的隐藏处起了一个名字:git stash save—patch junk,那么如果你现在忘记做(6),以后你会认识到隐藏处是什么。
其他回答
这里需要的核心内容是git add -p (-p是——patch的同义词)。这提供了一种交互式的方式来添加内容,让您决定是否应该添加每个块,甚至允许您在必要时手动编辑补丁。
与cherry-pick结合使用:
git cherry-pick -n <commit> # get your patch, but don't commit (-n = --no-commit)
git reset # unstage the changes from the cherry-picked commit
git add -p # make all your choices (add the changes you do want)
git commit # make the commit!
(感谢Tim Henigan提醒我git-cherry-pick有一个-no-commit选项,感谢Felix Rabe指出你需要重置git。如果你只想在提交时保留一些内容,你可以使用git reset <path>…只取消这些文件。)
如果需要,您可以提供特定的路径来添加-p。如果你从一个补丁开始,你可以用apply代替樱桃。
如果你真的想要git cherry-pick -p <commit>(这个选项不存在),你可以使用
git checkout -p <commit>
That will diff the current commit against the commit you specify, and allow you to apply hunks from that diff individually. This option may be more useful if the commit you're pulling in has merge conflicts in part of the commit you're not interested in. (Note, however, that checkout differs from cherry-pick: checkout tries to apply <commit>'s contents entirely, while cherry-pick applies the diff of the specified commit from it's parent. This means that checkout can apply more than just that commit, which might be more than you want.)
如果“partial cherry picking”的意思是“在文件中,选择一些更改,但放弃其他更改”,可以通过引入git stash来完成:
做完整的樱桃采摘。 git重置HEAD^以将整个选定的提交转换为未分阶段的工作更改。 现在git隐藏保存-补丁:交互选择不需要的材料隐藏。 Git从工作副本中回滚存储的更改。 git提交 扔掉不想要的改变:git隐藏下降。
提示:如果你给不需要的更改的隐藏处起了一个名字:git stash save—patch junk,那么如果你现在忘记做(6),以后你会认识到隐藏处是什么。
如果你想在命令行上指定一个文件列表,并在一个原子命令中完成所有事情,尝试:
Git apply——3way <(Git show——文件列表)
——3way:如果一个补丁没有干净地应用,Git会创建一个合并冲突,所以你可以运行Git mergetool。省略——3way会让Git放弃那些不干净的补丁。
基于Mike Monkiewicz的回答,您还可以从提供的sha1/branch中指定一个或多个文件来签出。
git checkout -p bc66559 -- path/to/file.java
这将允许您以交互方式选择要应用于文件当前版本的更改。
假设您想要的更改位于您想要更改的分支的头部,使用git签出
对于单个文件:
git checkout branch_that_has_the_changes_you_want path/to/file.rb
对于多个文件只需Daisy chain:
git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb