部分樱桃挑选与git的提交

我正在研究2个不同的分支: 发布开发
我注意到我仍然需要将已经提交给release分支的一些更改集成到开发分支中。
问题是我不需要所有的提交,只有某些文件中的某些macros,所以很简单

git cherry-pick bc66559 

并没有做到这一点。
当我做一个

 git show bc66559 

我可以看到差异,但是并不知道将其部分应用于当前工作树的好方法。
任何build议将非常欢迎!

你要在这里核心的东西是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-cherry-pick有一个–no-commit选项,并且感谢Felix Rabe指出你需要重置!如果你只想从commit中留下一些东西,你可以使用git reset <path>...来取消这些文件。)

你当然可以提供特定的path来add -p如果有必要的话。 如果你从一个补丁开始,你可以用apply来replacecherry-pick


如果你真的想要一个git cherry-pick -p <commit> (该选项不存在),你可以使用

 git checkout -p <commit> 

这会将当前提交与您指定的提交进行比较,并允许您从该比较单独应用hunk。 这个选项可能会更有用,如果你所提交的提交合并了你不感兴趣的部分提交的冲突。(注意, checkoutcherry-pick不同: checkout试图应用<commit>所有的内容都是完整的, cherry-pick会从它的父节点中应用指定提交的差异,这意味着checkout可以应用比提交更多的操作,这可能比你想要的要多。

我知道我正在回答一个老问题,但是看起来有一种新的方法可以通过交互式检查来实现:

 git checkout -p bc66559 

信用我可以交互式地从另一个git提交捡垃圾吗?

假设您想要的更改位于您想要更改的分支的头部,请使用git checkout

对于单个文件:

 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 

build立在Mike Monkiewicz的答案上,您也可以指定一个或多个文件来检查提供的sha1 /分支。

 git checkout -p bc66559 -- path/to/file.java 

这将允许您交互式地select要应用于当前版本的文件的更改。

如果“部分樱桃采摘”是指“文件内部,select一些变化,但丢弃他人”,可以通过引入git stash

  1. 做全樱桃采摘。
  2. git reset HEAD^将整个樱桃提交的转换转换为未分离的工作更改。
  3. 现在git stash save --patch :交互式地select不需要的材料存储。
  4. Git从您的工作副本中回滚隐藏的更改。
  5. git commit
  6. 丢弃不需要的更改: git stash drop

提示:如果你给一些不需要的改动一个名字: git stash save --patch junk那么如果你现在忘了做(7),以后你会认识到它是什么。