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

0tdrvxhp  于 2023-01-01  发布在  Git
关注(0)|答案(5)|浏览(157)

我是Git和版本控制的新手,所以我想弄清楚什么是补丁,它和我在Git中做的其他活动有什么不同?
我什么时候应用补丁?每次提交时都会应用吗?

2nc8po8w

2nc8po8w1#

在这个blog post中,您可以看到如何创建补丁(您希望通信并应用到另一个存储库的更改的集合)

(图片来自2008年的博客文章“Bioruby with git: how would that work?“,由Jan AERTS发布)
另一个具体的例子是Contributing to Rails with Git
如今,GitHub的pull请求使得在GitHub repos上执行apply patches变得非常容易,这在你不是直接贡献者的情况下非常有用(即你没有直接推送到repos的权利)。
实际上,最近GitHub引入了“Better Pull Request Emails“来改进新补丁的通知。

dz6r00yl

dz6r00yl2#

Patch是一个Unix程序,它根据一个单独文件(称为修补程序文件)中包含的指令更新文本文件。
所以,换句话说,它可能意味着带有指令的文件,或者处理该文件并将其应用于某个东西的程序。
现在,什么是补丁文件?假设您有一个包含两行的文本文件:

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时,patch file的意思是一样的,但是使用diff + patch本身将是一场噩梦。例如,你总是需要有两个版本的文件(甚至整个存储库)以便进行比较。听起来不太好,是吗?所以Git为你处理了所有的艰苦工作--它将你的本地文件与你正在使用的存储库中的内容进行比较,并可以将其作为"diff"显示给你,或者把这个"diff"作为补丁来提交修改,甚至可以让你应用一些你已经有的补丁文件。不需要深入细节,从这个意义上说,git和其他版本控制系统是完全一样的,比如SVN,甚至CVS或者perforce。
希望能有所帮助!

r8uurelv

r8uurelv3#

补丁是一个小文件,用来显示仓库中所做的修改。通常当团队外部的人拥有只读权限,但有一个很好的代码修改可用时,就会使用补丁。然后他创建一个补丁并发送给你。你应用它并将其推送到git仓库。每个人都会从更新后的版本中受益,补丁的作者不需要读/写权限。
它实际上主要是一个安全问题(至少,这是人们使用它的目的)。

fwzugrvs

fwzugrvs4#

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

git diff > mypatch.patch

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

git diff --cached > mypatch.patch

您可以稍后应用修补程序:

git apply mypatch.patch

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

0yycz8jy

0yycz8jy5#

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

相关问题