应用git补丁 - 基本示例

时间:2015-09-07 23:47:19

标签: git git-cherry-pick

关于这一点的一些问题,但我没有找到一个明确的最小例子。假设我们想要将特定分支的提交应用于多个分支,而不需要在补丁提交之前进行遗留提交。 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提交也在合并。

3 个答案:

答案 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-patchgit applygit 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