关于这一点的一些问题,但我没有找到一个明确的最小例子。假设我们想要将特定分支的提交应用于多个分支,而不需要在补丁提交之前进行遗留提交。 E.g。
mkdir cherry_test
cd cherry_test
git init
printf "one\ntwo\nfour\n" > file.txt
git add file.txt; git commit -m 'master: 1'
git branch dev
echo five >> file.txt
git add file.txt; git commit -m 'master: 2'
git checkout dev
echo FIVE >> file.txt
git add file.txt; git commit -m 'dev: 3'
echo SIX >> file.txt
git add file.txt; git commit -m 'dev: 4'
现在让我们做一个补丁来填补空白(插入缺失的行'三'):
perl -0777 -i -pe 's/two\nfour/two\nthree\nfour/igs' file.txt
git add file.txt; git commit -m 'dev patch'
此时我还不清楚如何将此补丁应用到master而没有额外的大写数字提交也会修补。说..
git log
commit d44425da786e161dd066b5db6db8b649b99ba575
author etc
dev patch
然后this answer建议我们需要使用git format-patch -1 d44425da
。但是,如何将其与master
和其他分支合并?我的努力似乎都导致之前的dev
提交也在合并。
答案 0 :(得分:2)
cherry-pick
命令从特定提交创建补丁,它是父级,并将该提交应用于当前分支。这应该适合你:
git checkout master
git cherry-pick <commit-id>
Git用户命令很少修改未签出的分支的分支指针。因此,如果命令修改了分支,则假设它是签出分支。
那么所有关于patch,apply和am的业务都是修补所有分支吗?
查看man pages
,这些似乎是通过电子邮件发送补丁或从“补丁”文件应用补丁。
git-format-patch - 准备电子邮件提交补丁 git-am - 从邮箱中应用一系列补丁 git-apply - 将补丁应用于文件和/或索引
git的“手册页”通常是查找如何使用git命令的非常好的资源。
您可以通过运行git help cherry-pick
来查看它们
或man git cherry-pick
或查找online
另一篇关于git入门的好文章是Git for computer scientists。它解释了git的(令人惊讶的简单)内部工作,一旦你理解了,使用git变得非常直观。
答案 1 :(得分:2)
如果要保留提交消息,请使用-x选项。 这样,您仍然可以跟踪提交的来源,并可能在将来避免合并冲突。
git checkout <branch>
git cherry-pick -x <commit-id>
天真的评论,但你必须在此之后推动你的更改。
git push origin <branch>
答案 2 :(得分:0)
正如nishantjr建议的那样,你当然可以选择樱桃。
但是,根据您的开发方式,我可能会期待这样的事情:
在master上创建修补程序:
git checkout master
perl -0777 -i -pe 's/two\nfour/two\nthree\nfour/igs' file.txt
git add file.txt; git commit -m 'master patch'
现在,将master中的更改合并到dev中。我将使用git merge
,但git rebase
的工作方式类似:
git checkout dev
git merge master
对于您尝试执行的操作,您可能不应该使用git format-patch
,git apply
或git am
。例如,如果您希望将补丁文件通过电子邮件发送给其他人,则只需要这些内容。但这是一个非常罕见的用例,因为从github这样的东西中提取比应用补丁文件要容易得多。
修改强>
合并master后,您将遇到冲突,因为您在master分支中添加了five
,在dev分支中添加了FIVE\nSIX
。运行git status
将提供有关如何解决冲突的基本信息。你的file.txt看起来像这样:
one
two
three
four
<<<<<<< HEAD
FIVE
SIX
=======
five
>>>>>>> master
您必须编辑此文件以告诉git您需要哪些更改。因为我们在dev分支上,所以让我们保持dev分支的变化。编辑文件如下所示:
one
two
three
four
FIVE
SIX
保存,然后git add file.txt
,然后git commit
。