GIT如何从非连续的提交中创建补丁

3

我有一些提交在“feature-1”分支中,它们是某个功能的一部分(我们称其为X功能)。在该分支中还存在来自主分支的合并,这意味着X功能可能分布在其他提交之间。

此外,请想象一下没有使用rebase,因此我们可能会得到像这样的结果:

 J - K - L - M - N                    [master]
  \             /(1)
   - A - B - C - D - E                [Branch feature-1]

上面的图表意味着:
- 提交J后创建了一个特性分支feature-1。 - 在主分支上执行了一些提交(K、L、M、N),它们可能来自外部功能。 - 特性分支feature-1上存在三个提交A、B、C。 - 在特性分支feature-1上发生了从主分支合并(1)到该分支的合并。 - 在特性分支feature-1上还存在两个提交来完成特性X。
图形表示如下:
 J -  K - L - M - N                              [master]
  \            
   - A - B - C - K - L - M - N - D - E           [Branch feature-1]

我们能否从feature-1中获得提交A、B、C、D、E,并将它们放入一个补丁文件中?

更新:还有一个很大的限制,即在提交E后,变更A、B、C、D、E也被合并到了主分支上,因此format-patch无法检测出feature-1上存在于主分支上不存在的内容。

2个回答

1

最终我找到的唯一方法是使用bash脚本。 如果GIT被正确使用,这可以避免,我的意思是只在主分支上应用合并(在这种情况下,Andrew的解决方案有效)。

另一个好的解决方案是使用rebase而不是merge,无论如何,这既不是主要话题也不是我的实际情况,所以我发现获得补丁文件的唯一解决方法是执行以下操作:

#!/bin/bash
if [[ $# -lt 1 ]]; then
  echo "Ilegal number of parameters."
  echo "Usage $0 PartialCommitMessage [file.patch]."
  exit 1;
fi
if [[ $# -eq 1 ]]; then
  FILE_NAME=$1.patch
else
  FILE_NAME=$2
fi
#First line needed in patch files.
echo "From: sgroh@somedomain.com" > $FILE_NAME
for rev in `git log --reverse --pretty=format:%H --grep=$1`
do
   cmd="git diff $rev^ $rev >> $FILE_NAME"
   echo $cmd
   eval $cmd
done

要查找包含某个工单号(例如:1122)的提交,请运行以下命令:

用法:

./createPatch.sh 1122

输出:

一个名为1122.patch的文件,其中包含差异更改。


0

Format-patch 命令与大多数其他 Git 命令使用相同的修订说明符。

这应该为仅在 feature-1 上可达而不在 master 上的提交生成补丁。

git format-patch master..feature-1 

更新

假设您是主控指向合并提交,您可以尝试

git format-patch master^1..feature-1

否则,您可以在上述代码中硬编码合并提交的 SHA,代替主分支。
如果您的历史记录比这还糟糕,那么您可能需要考虑类似于这样的东西。
未经测试。
for rev in ${git rev-list --first-parent feature-1 ^ROOT_SHA
do
   git format-patch -1 ${rev} 
done

如果feature-1没有合并到主分支,则为真。我将在问题中添加更新。 - sgroh
@sgroh,合并是哪个方向的?你在这里说feature-1已经合并到了master,但在问题中你又说master已经合并到了feature-1 - Chris
@Chris,合并会以两种方式进行,首先是将K、L、M、N从主分支合并到功能分支1中。第二次合并将更新主分支,包含所有在功能分支1中的更改,这意味着主分支将包含此后的所有更改。 - sgroh
@sgroh,那么你想要包含哪些提交呢? - Chris
@Chris,说得好,我可以执行 git log --all --oneline --grep "Feature-X" 或 git log --all --oneline | grep "feature-X"。通过这个命令,我们可以得到涉及的SHA集合。 - sgroh

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