我在分支“feature-1”中有几个提交,它们是某个功能的一部分(让我们称之为功能X)。在分支中还存在几个来自master的合并,这意味着特征X可以在其他提交之间传播。
还想象没有使用rebase,所以我们可以有类似的东西:
J - K - L - M - N [master]
\ /(1)
- A - B - C - D - E [Branch feature-1]
上图显示:
图形上我们有:
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不在主人身上。
答案 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的文件,其中包含差异更改。