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

时间:2014-09-17 00:00:51

标签: git version-control

我在分支“feature-1”中有几个提交,它们是某个功能的一部分(让我们称之为功能X)。在分支中还存在几个来自master的合并,这意味着特征X可以在其他提交之间传播。

还想象没有使用rebase,所以我们可以有类似的东西:

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

上图显示:

  • 提交J后,创建了分支功能-1。
  • 在master上执行了一些提交(K,L,M,N),它们可能来自外部功能。
  • 在分支上,功能-1存在三个提交A,B,C。
  • On branch feature-1发生从master到此分支的merge(1)。
  • On branch feature-1还有两个提交来完成X特征。

图形上我们有:

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

我们可以从功能1获取提交A,B,C,D,E到补丁文件吗?

更新:还有一个很大的限制,更改A,B,C,D,E在提交E后也在master中合并,因此format-patch无法检测到功能上存在的内容 - 1不在主人身上。

2 个答案:

答案 0 :(得分:0)

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

这应该只为那些在feature-1上可以访问的提交生成补丁,而不是master。

git format-patch master..feature-1 

更新

假设master指向合并提交,你可以尝试

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

否则,你可以在上面用硬编码合并提交的SHA代替master。

如果您的历史比这更糟糕,那么您可能需要查看类似

的内容

未测试

for rev in ${git rev-list --first-parent feature-1 ^ROOT_SHA
do
   git format-patch -1 ${rev} 
done

答案 1 :(得分:0)

最后,我找到的唯一方法是使用bash脚本。 如果正确使用GIT,可以避免这种情况,我的意思是如果仅在主服务器上应用合并(在这种情况下安德鲁的解决方案有效)。

另一个好的解决方案是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的文件,其中包含差异更改。