应用 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-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
。
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>
关于此的几个问题,但 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-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
。
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>