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

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

我什么时候应用补丁? 每次我提交的时候都会发生吗?

65746 次浏览

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

它实际上主要是一个安全问题(至少,人们用它来做这个)。

补丁是一个或多个文件之间的一组差异,以显示它们之间的差异。您通常只生成一个补丁来显示您已经更改的内容。例如,当您发现并修复开源应用程序中的错误,然后将修复后的错误发布到他们的错误跟踪器上时,就可以这样做。

您可以在此 博客文章中看到如何创建补丁程序(您希望传达并应用到另一个回购的更改集合)

git patch
(图片来自 Jan AERTS出版的2008年博客文章“ 带有 git 的 Bioruby: 这是如何工作的?”)

另请参阅 用 Git 贡献 Rails作为另一个具体例子。

现在,GitHub 的 pull 请求使得 打补丁在 GitHub 回购上变得非常容易,这在你不是直接贡献者的时候非常有用(即你没有权利直接推送回购)。
实际上,最近 GitHub 引入了“ 最好拉请求电子邮件”来改进新补丁的通知。

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

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

现在,什么是补丁文件? 让我们假设您有一个文本文件,其中包含两行:

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

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

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

您如何描述对文件内容的更改?你可以说第一行“ This is line A”被替换成了“ This is SPARTA”或者甚至把第一行的最后一个单词“ A”换成另一个单词“ SPARTA”。这正是 差异告诉我们的。假设我有这个文件的两个版本,一个叫做 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”应用为补丁,即提交你的更改,甚至让你应用一些你已经有的补丁文件。在这个意义上,git 与其他版本控制系统(如 SVN、 CVS 或 perforce)完全相同,无需深入探究细节。

希望能有帮助!

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

git diff > mypatch.patch

如果存储库中有新文件(未跟踪) ,那么应该在创建补丁之前对该文件进行预处理(不要提交) ,并使用以下命令

git diff --cached > mypatch.patch

您可以稍后应用补丁:

git apply mypatch.patch

如果你想对一个 git 存储库做一些更改,你没有写权限,只需要做一些更改并在两者之间创建一个补丁,然后将补丁发送给有权限应用补丁的人,这样你的更改就应该被添加到这个 git 存储库中。