题
我正在两个不同的分支工作: 发布 和 发展.
我注意到我仍然需要整合一些致力于的更改 发布 分支回到 发展 分支。
问题是我不需要所有的提交,只需要某些文件中的一些块,所以一个简单的
git cherry-pick bc66559
没有成功。
当我做一个
git show bc66559
我可以看到差异,但真的不知道将其部分应用到我当前的工作树的好方法。
解决方案
你会想在这里的核心就是git add -p
(-p
是--patch
的代名词)。这提供了一个互动的方式在内容检查,让您决定每一大块是否应该去,甚至让您在需要时手动编辑补丁。
要结合樱桃挑选使用它:
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樱桃挑选具有--no-commit选项,并感谢费利克斯·拉贝的指出你需要重置!如果你只是想留下一些东西出来的承诺,你可以使用git reset <path>...
到unstage只是这些文件。)
可以当然提供特定路径在必要时add -p
。如果你已经从一个补丁,你可以用cherry-pick
更换apply
。
如果你真的想要一个git cherry-pick -p <commit>
(该选项不存在),您可以使用
git checkout -p <commit>
这将会给出当前提交对提交指定,并允许你从差异分别适用帅哥。此选项可能更为有用,如果提交你拉在已合并冲突的承诺你不感兴趣的部分(注意,但是,从checkout
不同cherry-pick
:checkout
尽力完全适用<commit>
的内容,cherry-pick
适用指定的DIFF承诺从它的父,这意味着checkout
可以应用远远不止这些承诺,这可能比你想要更多。)
其他提示
假设所需的变化是在要从变化分支的头,使用git结帐
有单个文件:
git checkout branch_that_has_the_changes_you_want path/to/file.rb
有多个文件只是菊花链:
git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb
在迈克Monkiewicz大厦回答也可以指定一个或多个文件从所提供的SHA1 /分支检出。
git checkout -p bc66559 -- path/to/file.java
这将允许您以交互方式选择要已经应用到当前文件的版本进行修改。
如果要指定在命令行中的文件列表,并获得在单个原子命令完成了整个事情,请尝试:
git apply --3way <(git show -- list-of-files)
--3way
:如果修补不干净的应用,Git会创建一个合并冲突,所以你可以运行git mergetool
。省略--3way
将混帐放弃补丁不干净的应用。
如果“部分挑选”意味着“在文件内,选择一些更改但丢弃其他更改”,则可以通过引入来完成 git stash
:
- 做完整的樱桃采摘。
git reset HEAD^
将整个精心挑选的提交转换为未暂存的工作更改。- 现在
git stash save --patch
:交互式地选择不需要的材料来隐藏。 - Git 会回滚工作副本中隐藏的更改。
git commit
- 扔掉不需要的更改的隐藏部分:
git stash drop
.
提示:如果您为不需要的更改的存储命名: git stash save --patch junk
那么如果你现在忘记执行(6),稍后你就会认出藏匿的东西是什么。