我正在两个不同的分支工作: 发布发展.

我注意到我仍然需要整合一些致力于的更改 发布 分支回到 发展 分支。

问题是我不需要所有的提交,只需要某些文件中的一些块,所以一个简单的

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-pickcheckout尽力完全适用<commit>的内容,cherry-pick适用指定的DIFF承诺从它的父,这意味着checkout可以应用远远不止这些承诺,这可能比你想要更多。)

其他提示

我知道我在回答一个老问题,但它看起来像有一个新的方式与交互检查了做到这一点:

git checkout -p bc66559

感谢我可以交互地挑选来自其他混帐帅哥犯?

假设所需的变化是在要从变化分支的头,使用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:

  1. 做完整的樱桃采摘。
  2. git reset HEAD^ 将整个精心挑选的提交转换为未暂存的工作更改。
  3. 现在 git stash save --patch:交互式地选择不需要的材料来隐藏。
  4. Git 会回滚工作副本中隐藏的更改。
  5. git commit
  6. 扔掉不需要的更改的隐藏部分: git stash drop.

提示:如果您为不需要的更改的存储命名: git stash save --patch junk 那么如果你现在忘记执行(6),稍后你就会认出藏匿的东西是什么。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top