应用 git 补丁 - 基本示例

Applying a git patch - basic example

关于此的几个问题,但 none 我可以找到一个明确的最小示例。假设我们想要将来自特定分支的提交应用到多个分支,而不需要补丁提交之前的遗留提交。例如

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'

现在让我们打个补丁来填补空白(插入 'three' 缺少的行):

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 提交也合并了。

正如 nishantjr 所建议的那样,你当然可以用 cherry-pick 来完成。

但是,根据您的开发方式,我可能会期待这样的结果:

在 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

cherry-pick 命令从特定提交及其父提交创建补丁,并将该提交应用到 current 分支。这应该适合你:

git checkout master
git cherry-pick <commit-id>

Git 用户命令很少修改未签出的分支的分支指针。所以如果一个命令修改了一个分支,假设它是签出的分支。


So all that business with patch, apply and am is for patching all branches?

查看 man pages,这些似乎用于通过电子邮件发送补丁,或从 'patch' 文件应用补丁。

git-format-patch - Prepare patches for e-mail submission
git-am - Apply a series of patches from a mailbox
git-apply - Apply a patch to files and/or to the index


git 的 "man pages" 通常是了解如何使用 git 命令的非常好的资源。 您可以通过 运行 git help cherry-pick 查看它们 或 man git cherry-pick 或查找 online

另一篇关于 git 入门的好文章是 Git for computer scientists。它解释了 git 的(非常简单的)内部工作原理,一旦您理解了这一点,使用 git 就会变得非常直观。

如果要保留提交消息,请使用 -x 选项。 这样,您仍然可以跟踪提交的来源,并可能避免将来发生合并冲突。

git checkout <branch>
git cherry-pick -x <commit-id>

天真的评论,但您必须在此之后推送您的更改。

git push origin <branch>