部分樱桃挑选与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。 这个选项可能会更有用,如果你所提交的提交合并了你不感兴趣的部分提交的冲突。(注意, checkout
和cherry-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
:
- 做全樱桃采摘。
-
git reset HEAD^
将整个樱桃提交的转换转换为未分离的工作更改。 - 现在
git stash save --patch
:交互式地select不需要的材料存储。 - Git从您的工作副本中回滚隐藏的更改。
-
git commit
- 丢弃不需要的更改:
git stash drop
。
提示:如果你给一些不需要的改动一个名字: git stash save --patch junk
那么如果你现在忘了做(7),以后你会认识到它是什么。