我正在一个新项目中使用Git,该项目有两个并行但目前处于试验阶段的开发分支:
master:导入现有的代码库,再加上一些我通常确信的修改exp1:实验分支#1exp2:实验分支#2
exp1和exp2表示两种非常不同的体系结构方法。在我进一步相处之前,我无法知道哪一个(如果有的话)会起作用。当我在一个分支中取得进展时,我有时会对另一个分支进行有用的编辑,并希望仅合并这些编辑。
将一个开发分支中的选择性更改合并到另一个分支中,同时保留其他所有内容的最佳方法是什么?
我考虑过的方法:
gitmerge——无需提交,然后手动取消大量编辑,我不想在分支之间共享这些编辑。手动将通用文件复制到临时目录中,然后git checkout移动到另一个分支,然后更多地手动将临时目录复制到工作树中。在上述基础上的变化。暂时放弃exp分支,使用另外两个本地存储库进行实验。这使得手动复制文件更加简单。
所有这三种方法都显得乏味且容易出错。我希望有更好的方法;类似于过滤器路径参数,可以使gitmerge更有选择性。
简单的方法是,实际上合并来自两个分支的特定文件,而不仅仅是用另一个分支的文件替换特定文件。
第一步:区分分支
git diff branch_b>my_patch_file.patch
创建当前分支和branch_b之间差异的修补程序文件
第二步:对匹配模式的文件应用补丁
git apply-p1--include=pattern/匹配/the/path/to/file/或/folder my_patch_file.patch
关于选项的有用说明
您可以在include模式中使用*作为通配符。
斜杠不需要逃避。
此外,您可以改用--exclude并将其应用于除与模式匹配的文件之外的所有文件,或使用-R反转补丁
-p1选项是*Unix修补程序命令的一个保留,并且事实上,修补程序文件的内容在每个文件名前面加上/或b/(或更多,取决于修补程序文件是如何生成的),您需要删除这些文件,这样它就可以找出真正的文件到需要应用修补程序的文件的路径。
查看git应用程序的手册页以了解更多选项。
第三步:没有第三步
很明显,你想提交你的更改,但谁能说你在提交之前没有其他相关的调整。
我编写了自己的脚本“pmerge”来部分合并目录。这是一项正在进行的工作,我仍然在学习Git和Bash脚本。
该命令使用gitmerge--no提交,然后取消应用与提供的路径不匹配的更改。
用法:git pmerge分支路径示例:gitmerge-devel-src/
我还没有对它进行广泛的测试。工作目录应该没有任何未提交的更改和未跟踪的文件。
#!/bin/bash
E_BADARGS=65
if [ $# -ne 2 ]
then
echo "Usage: `basename $0` branch path"
exit $E_BADARGS
fi
git merge $1 --no-commit
IFS=$'\n'
# List of changes due to merge | replace nulls with newlines | strip lines to just filenames | ensure lines are unique
for f in $(git status --porcelain -z -uno | tr '\000' '\n' | sed -e 's/^[[:graph:]][[:space:]]\{1,\}//' | uniq); do
[[ $f == $2* ]] && continue
if git reset $f >/dev/null 2>&1; then
# Reset failed... file was previously unversioned
echo Deleting $f
rm $f
else
echo Reverting $f
git checkout -- $f >/dev/null 2>&1
fi
done
unset IFS
简单的方法是,实际上合并来自两个分支的特定文件,而不仅仅是用另一个分支的文件替换特定文件。
第一步:区分分支
git diff branch_b>my_patch_file.patch
创建当前分支和branch_b之间差异的修补程序文件
第二步:对匹配模式的文件应用补丁
git apply-p1--include=pattern/匹配/the/path/to/file/或/folder my_patch_file.patch
关于选项的有用说明
您可以在include模式中使用*作为通配符。
斜杠不需要逃避。
此外,您可以改用--exclude并将其应用于除与模式匹配的文件之外的所有文件,或使用-R反转补丁
-p1选项是*Unix修补程序命令的一个保留,并且事实上,修补程序文件的内容在每个文件名前面加上/或b/(或更多,取决于修补程序文件是如何生成的),您需要删除这些文件,这样它就可以找出真正的文件到需要应用修补程序的文件的路径。
查看git应用程序的手册页以了解更多选项。
第三步:没有第三步
很明显,你想提交你的更改,但谁能说你在提交之前没有其他相关的调整。