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


Answers:


116

您可以在此博客文章中看到如何创建补丁(要传达的变更的集合并应用于另一个仓库)

git补丁
(图片来自Jan AERTS发布的2008年博客文章“ 带有git的Bioruby:如何工作? ” )

另请参见使用GitRails贡献力量

如今,GitHub pull请求使得在GitHub仓库上应用补丁变得非常容易,这在您不是直接贡献者(即您无权直接推送到仓库)时非常有用。
实际上,不久前GitHub引入了“ Better Pull Request Emails ”来改善新补丁的通知。


4
一个很好的答案,告诉我GIT的“补丁”不是我想要的。
RonLugge 2012年

91

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

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

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

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

然后,您更改第一行,现在您的文件如下所示:

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

您将如何描述文件内容的更改?您可以说第一行“这是A行”。被替换为“ This is 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 + patch将是一场噩梦。例如,您将始终必须检出文件的两个版本(甚至是整个存储库)才能进行比较。听起来不是很好,是吗?因此git会为您处理所有辛苦的工作-它会将您的本地文件与您正在使用的存储库中的文件进行比较,并可以将其显示为“ diff”,也可以将其作为“ diff”应用补丁也可以提交更改,甚至可以让您应用一些已经存在的补丁文件。无需深入探讨,从这个意义上讲,git与其他版本控制系统(如SVN甚至CVS或perforce)完全相同。

希望能帮助到你!


不知道git使用内置patch程序。我以为git有它自己的实现。
radiantshaw

43

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

实际上,这实际上主要是安全问题(至少,这是人们使用它的目的)。


1
附加信息:虽然git在内部不使用补丁,但是git的一个设计目标是使其易于交换补丁(因为许多项目都是以这种方式工作的,例如Linux和git本身)。因此git具有用于处理补丁的特殊命令(git diff默认情况下将更改显示为补丁,git apply可让您应用补丁等)。
sleske 2012年

恭喜你!您确实了解了修补程序的用途,即一种将更改提交到存储库的方法,而更改的作者没有写权限。因此,GitHub的分叉请求模型替代了变更分发的补丁模型。因此,我相信补丁仅在GitHub等工具的上下文之外有用。
mljrg

8

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

git diff > mypatch.patch

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

git diff --cached > mypatch.patch 

您以后可以应用补丁:

git apply mypatch.patch

如果要对git存储库进行一些更改,而又没有写权限,只需进行更改并在两者之间创建一个补丁,然后将该补丁发送给有权应用该补丁的人您的更改应添加到该git存储库中。


更好的演示:robots.thoughtbot.com/…。我的基本示例摘要:git format-patch <base_commit_or_branch_name>=将所有从现在开始到<base_commit_or_branch_name>的提交都包装到包含diff和提交消息的精美文件中,以便轻松发送(例如,通过电子邮件)给其他想要修补它们的人他们的代码库。然后收件人使用您的文件修补系统:cat *.patch | git am
Gabriel Staples

7

修补程序是一个或多个文件之间的一组差异,以显示它们之间的差异。通常,您只会生成一个补丁来向他人显示您所做的更改。例如,当您发现并修复开源应用程序中的错误,然后将其发布到其错误跟踪器上时,便可以执行此操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.