Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将'git格式的补丁SHAx..SHAy'输出到单个补丁文件,而不是每次提交一个? 常规贴片_Git - Fatal编程技术网

如何将'git格式的补丁SHAx..SHAy'输出到单个补丁文件,而不是每次提交一个? 常规贴片

如何将'git格式的补丁SHAx..SHAy'输出到单个补丁文件,而不是每次提交一个? 常规贴片,git,Git,git格式补丁OlderSHA..NewerSHA通常在OlderSHA和NewerSHA之间的每次提交中创建一个补丁文件,不包括OlderSHA。它是更改的基础,包括NewerSHA 例如,在这个现实世界的例子中,SHAs之间有五个提交,所以git格式的补丁程序生成五个补丁文件 git format-patch 3caf9c2..0aa9968 0001-About-as-far-as-you-get-adding-new-module-to-RCP-wit.patch 0002-Add-a-

git格式补丁OlderSHA..NewerSHA通常在OlderSHA和NewerSHA之间的每次提交中创建一个补丁文件,不包括OlderSHA。它是更改的基础,包括NewerSHA

例如,在这个现实世界的例子中,SHAs之间有五个提交,所以git格式的补丁程序生成五个补丁文件

git format-patch 3caf9c2..0aa9968
0001-About-as-far-as-you-get-adding-new-module-to-RCP-wit.patch
0002-Add-a-trivial-service.patch
0003-Rename-files-and-add-lazy-module-class.patch
0004-Add-WCS-shim-and-add-to-testRouteMap.patch
0005-Add-module-to-routing-to-enable-lazy-loading.patch
问题陈述 我想生成一个单独的文件来表示OlderSHA和NewerSHA之间的所有更改,这些更改可以在一个命令中应用。我不想在两个沙阿之间维持现状;我只希望最后的差异存储在补丁文件中

git format-patch --single-file-option? 3caf9c2..0aa9968
EVERYTHING_BETWEEN_SHAs.patch
我已经看过了,如果这是一个选择,我错过了

这个问题对谷歌来说有点难,因为单个文件,甚至是输出的单个补丁文件似乎都会收敛到我想要的是与单个文件结果相关的补丁

请注意,我也不只是想要;我想要在单个文件中两次提交之间的差异,每个文件的更改在结果文件中有一个条目或节。如果foo在commit 2中变为bar,在commit 5中变回foo,我不希望它出现在SuperPatch.patch中


这个选项存在吗?

通常最简洁的方法可能是

git format-patch OlderSHA..$(git commit-tree -m - \
                           -p `git merge-base OlderSHA NewerSHA` NewerSHA^{tree})
如果OlderSHA不是严格意义上的祖先,则需要合并基础。如果是的话,你可以失去它,然后去做

git format-patch OlderSHA..$(git commit-tree -m - -p OlderSHA NewerSHA^{tree})

如果你想在补丁中获得更好的提交消息,你可以使用多个-m或丢失-m,然后通过提交树的stdin输入完整消息。

我将在@jthill answer中添加一些注释

所有新旧之间的变化都是模棱两可的。考虑到这种情况,

git init foo
cd foo
touch a.txt
git add .
git commit -mroot
git branch new
echo hello > a.txt
git commit -am'hello'
git checkout new
echo world > a.txt
git commit -am'world'
git checkout master
日志图应该是这样的

* d1f8ac1 (new) world
| * dd5329d (HEAD -> master) hello
|/  
* 8db55b4 root
git格式pach master new将仅为d1f8ac1创建一个补丁,其差异在8db55b4和d1f8ac1之间,就好像是由git diff master生成的一样…新的三个点。它不同于dd5329d和d1f8ac1之间的差异,好像是由git diff master生成的..新的两点

当OlderSHA是NewerSHA的祖先时,这两个差异是相同的。如上述场景所述,当OlderSHA与NewerSHA不同时,2个差异是不同的

还有一种特殊情况,老年人和新进人是不相关的。他们没有共同的祖先。git格式修补程序OlderSHA-NewerSHA为所有可从OlderSHA和NewerSHA访问的提交生成修补程序。git diff OlderSHA..NewerSHA和git diff OlderSHA…NewerSHA生成相同的差异

当你需要。。。区别,使用

git format-patch OlderSHA..$(git commit-tree -m - \
                       -p `git merge-base OlderSHA NewerSHA` NewerSHA^{tree})
git format-patch OlderSHA..$(git commit-tree -m - -p OlderSHA NewerSHA^{tree})
当你需要。。区别,使用

git format-patch OlderSHA..$(git commit-tree -m - \
                       -p `git merge-base OlderSHA NewerSHA` NewerSHA^{tree})
git format-patch OlderSHA..$(git commit-tree -m - -p OlderSHA NewerSHA^{tree})
这里的git格式补丁OlderSHA..$也可以是git格式补丁-1$。对于特殊情况,使用。。不同的方式,或使用。。。不带p$git的差分方式合并基础OlderSHA NewerSHA


git提交树创建一个提交,其消息日志由-m指定,其父级由-p指定,其树由NewerSHA^{tree}指定。这就像是基于OlderSHA或OlderSHA和NewerSHA的合并基进行新的提交,并且提交的代码与NewerSHA完全相同。

您在寻找git diff吗?吉特差异3caf9c2..0aa9968>3caf9c2..0aa9968。patch@phd嘘,啊。。。事实证明,要么同意,要么接受。想回答这个问题吗?看起来它缺少了电子邮件头的内容,在我的例子中,还有一个关于底部使用了哪个版本的git的注释,但是当我测试单个提交时,文件在其他方面是相同的。但是,为什么格式化补丁不支持这个呢?除了暗示您将通过电子邮件发送补丁之外,用例中还有什么不同?这不是暗示。它是:为电子邮件提交准备补丁-phd@phd好的,但是除了它明确的目的是创建电子邮件的区别之外,用例是如何改变的?也就是说,为什么格式补丁不支持diff所支持的相同类型的聚合?