在我的日常git工作流程中,我有很多主题分支,如下所示:
o--o--o (t2) / o--o (t1) / o--o--o (master) \ o--o--o (t3)
当我从上游拉,
o--o--o (t2) / o--o (t1) / o--o--o--n--n--n (master) \ o--o--o (t3)
我想变基在新主机上的所有顶级主题我的分支:
o'--o'--o' (t2) / o'--o' (t1) / o--o--o--n--n--n (master) \ o'--o'--o' (t3)
目前我手工完成,使用git rebase --onto
.在这种情况下,整个更新过程将是:
$ git checkout master
$ git pull
$ git rebase master t1
$ git rebase --onto t1 t2~3 t2
$ git rebase master t3
Run Code Online (Sandbox Code Playgroud)
在各种主题分支之间跳转并添加提交时,这会变得更加繁琐.
在我的案例中,主题分支之间的依赖关系纯粹是树状的:没有分支依赖于多个其他分支.(我必须以某种特定的顺序最终上游依赖补丁,所以我先选择那个顺序.)
是否有任何工具可以帮助我管理此工作流程?我见过TopGit,但它似乎与tg patch
基于电子邮件的工作流程密切相关,这与我无关.
在git邮件列表上提出了几乎相同的问题: 一次重新绑定多个分支... 链接的响应附加了一个perl脚本,可以生成您需要的命令.
如果您希望此脚本快速并且避免让它踩到您的脚趾,还可以考虑使用git-new-workdir
设置工作副本来进行自动重新定位.
如果您发现自己一遍又一遍地解决相同的冲突,请考虑启用git rerere.
说了这么多,这是另一个配方:
# Construct a placeholder commit that has all topics as parent.
HEADS="$(git for-each-ref refs/heads/\*)" &&
MAGIC_COMMIT=$(echo "Magic Octopus"$'\n\n'"$HEADS" |
git commit-tree \
$(git merge-base $(echo "$HEADS" | sed 's/ .*//' ))^{tree} \
$(echo "$HEADS" | sed 's/ .*//;s/^/-p /')) &&
git update-ref refs/hidden/all $MAGIC_COMMIT
# Rebase the whole lot at once.
git rebase --preserve-merges master refs/hidden/all
# Resolve conflicts and all that jazz.
# Update topic refs from the rebased placeholder.
PARENT=
echo "$HEADS" |
while read HASH TYPE REF
do
let ++PARENT
git update-ref -m 'Mass rebase' "$REF" refs/hidden/all^$PARENT "$HASH"
done
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1224 次 |
最近记录: |