什么是git版本控制中的补丁?

时间:2011-11-26 15:51:28

标签: git version-control

我是git和版本控制的新手,所以我想弄清楚补丁是什么,它与我在git中做的其他活动有什么不同?

我什么时候申请补丁?每次我提交都会发生吗?

5 个答案:

答案 0 :(得分:96)

您可以在此blog post中看到如何创建补丁(您想要传达的更改集合并应用于其他仓库)

git patch
(图片来自2008年博客文章“Bioruby with git: how would that work?”,由Jan AERTS发布)

另见Contributing to Rails with Git另一个具体例子。

现在,GitHub拉取请求使得GitHub repos上的apply patches非常容易,当你不是直接贡献者时(即你无权直接推送回购),这很有用。 /> 实际上,最近GitHub引入了“Better Pull Request Emails”来改进新补丁的通知。

答案 1 :(得分:72)

Patch是一个Unix程序,它根据单独文件中包含的指令更新文本文件,称为补丁文件。

因此,换句话说,它可能意味着带有指令的文件或处理该文件的程序并将其应用于某些文件。

现在,什么是补丁文件?假设您有一个包含2行的文本文件:

This is line A.
This is line B, or otherwise #2.

然后你改变了第一行,现在你的文件看起来像这样:

This is SPARTA.
This is line B, or otherwise #2.

您如何描述文件内容的更改?你可以说第一行“这是A行”。被替换为“这是SPARTA。”,甚至第一行的最后一个单词“A”替换为另一个单词“SPARTA”。这正是diff告诉我们的。假设我有这个文件的两个版本,一个叫file1.txt,另一个叫file2.txt,然后我运行diff并得到这个:

$ diff -u file1.txt file2.txt 
--- file1.txt   2011-11-26 11:07:03.131010360 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.

有了更改说明,您可以将其应用于初始内容并获取修改后的内容。这些改变,以“补丁”式程序可以理解的统一格式,称为补丁文件。这就像不是从他们教你如何钓鱼的人那里钓鱼,这样你就可以自己将鱼从水中挖出来。现在,让我们将我们的补丁应用于file1.txt,使其看起来与file2.txt完全相同:

$ cat file1.txt 
This is line A.
This is line B, or otherwise #2.
$ cat file2.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ diff -u file1.txt file2.txt > changes.patch
$ cat changes.patch 
--- file1.txt   2011-11-26 11:09:38.651010370 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.
$ patch < changes.patch 
patching file file1.txt
$ cat file1.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ 

您可能认为只拥有此文件的两个版本会更容易。那么,在这个简单的情况下,这是真的。但是当你有很多文件,并且那些文件非常大时,有几行更改而不是整个文件的两个副本会更有效率。

在谈论git时,补丁文件仍然意味着相同的事情,但自己使用diff +补丁将是一场噩梦。例如,您将始终必须签出两个版本的文件(甚至整个存储库)才能进行比较。听起来不那么好,是吗?因此,git会为您处理所有艰苦的工作 - 它将您的本地文件与您正在使用的存储库中的文件进行比较,并将其显示为“diff”,或将“diff”应用为patch也提交您的更改,甚至允许您应用一些已经存在的补丁文件。在没有深入细节的情况下,git与其他版本控制系统(如SVN,甚至CVS或perforce)完全相同。

希望它有所帮助!

答案 2 :(得分:34)

补丁是一个小文件,用于指示存储库中已更改的内容。它通常在团队外部的人具有只读访问权限但具有良好的代码更改时使用。然后他创建一个补丁并将其发送给您。您应用它并将其推送到git存储库。然后每个人都可以从更新版本中受益,并且补丁的作者不需要读/写访问权。

这主要是一个安全问题(至少,这是人们使用它的原因)。

答案 3 :(得分:7)

补丁是一个或多个文件之间的一组差异,用于显示它们之间的不同之处。您通常只会生成一个补丁,以向某人显示您已更改的内容。您可能会这样做的一个示例是当您在开源应用程序中找到并修复错误,然后将修复程序发布到其错误跟踪器上时。

答案 4 :(得分:7)

补丁文件表示可以按任何顺序应用于任何分支的一组更改。通过使用补丁,您将获得一个或多个文件之间的差异。稍后,您可以应用差异(补丁)来获取新文件的更改。 Git中的补丁有很多用途。 如果您的工作目录中有未提交的更改,并且您需要将更改应用于其他位置,只需创建一个修补程序并应用该修补程序。

git diff > mypatch.patch

如果您的存储库中有新文件(未跟踪),那么您应该在创建补丁(不提交)之前暂存该文件,并使用以下命令

git diff --cached > mypatch.patch 

您可以稍后应用补丁:

git apply mypatch.patch

如果您想对git存储库进行一些更改,但您没有写入权限,只需进行更改并在两者之间创建补丁,并将补丁发送给有权应用补丁的人员通过此,您的更改应添加到该git存储库。