使用 git 创建补丁文件

9
我想知道是否可以在git中创建补丁文件。我的意思是,如果我对几个文件进行了更改,则应根据文件名创建补丁文件。 git diff在控制台上显示更改内容,但是否可能将输出分成不同的文件?

你说的“数据过少”是什么意思?那是我通常创建补丁的方式,或者使用 git diff master > filename.patch。当你应用补丁时,你需要使用 patch -p1 < filename.patch 命令去掉路径的第一部分。 - dj2
抱歉,我的错 @dj2。它能成功保存到单个文件中,但是能否保存到不同的文件中呢?例如,如果修改了file1和file2,能否为它们创建file1.patch和file2.patch呢? - BeginnersSake
你为什么想要将补丁拆分成单独的文件? - t.niese
@t.niese 这个要求是这样的。我知道我可以使用eclipse来实现相同的效果。但是我想知道只使用git是否可能。 - BeginnersSake
如果您希望每个补丁文件仅包含单个文件的更改,则将文件路径放入 git diff 命令中即可。就是这么简单。 - axiac
2个回答

11

git format-patch

假设你已经提交了一个修改了foo.txtbar.txthello.txt的提交aaa111

git format-patch -1 aaa111

它生成一个包含三个文件更改的补丁。

git format-patch -1 aaa111 -- foo.txt

它只生成foo.txt更改的补丁。

git format-patch -1 aaa111 --stdout -- bar.txt > aaa111.bar.patch

它���成一个名为aaa111.bar.patch的补丁,其中仅包括bar.txt的更改。

更新于2022年6月4日

对于涉及二进制文件的提交,您应该在git format-patch中添加--binary选项。


1
@ElpieKay,能解释一下 -1 代表什么吗(以及它的作用)?我查了一下 git format-patch -h 但没找到。另外,如果我想为最近的 3 次提交创建补丁,每个提交一个文件,我该怎么做呢?谢谢。 - xpt
4
@xpt -h仅列出少量选项。请改用git format-patch --helpman git format-patch-1-<n>的一个实例,它“从最高的<n>次提交准备补丁”。如果没有-1,它会为从aaa111可达的每个提交创建补丁。使用-1时,只创建aaa111的补丁。因此,git format-patch -3将为最近的3次提交创建补丁。请注意,-<n>-ngit format-patch的两个不同选项。 - ElpieKay

1
以下脚本创建最近一次提交(HEAD~1)所修改文件的补丁:
# Enumerate the files modified on the desired commit
for file in $(git diff --name-only HEAD~1); do
    # Generate the name of the patch file: replac '/' with '_'
    # in the paths of the modified files and add the .patch termination
    patch=${file//\//_}.patch
    # Create one patch for each modified file
    git diff HEAD~1 -- $file > $patch
done

你可以修改生成补丁文件名的方式,加入路径(以避免在当前目录中生成)。同时如果想要生成不同提交之间的差异,将两处的 HEAD~1 替换为相应的提交标识。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接