使用 git rebase
一种想法是检查分支并使用迭代变基将所有提交压缩为一个,然后强制推送以更新拉取请求并合并(尽管这项工作的一部分可以委托给 Bob)。
要自动将分支中的所有提交压缩到第一个提交并将其应用于拉取请求,您可以使用以下命令:
$ git checkout pull-req
$ GIT_SEQUENCE_EDITOR='sed -i "2,\$s/^pick/s/g" $1' git rebase -i origin/master
$ git push --force
GIT_SEQUENCE_EDITOR是一个 Git 环境变量,用于为变基提交列表设置临时编辑器。我们将它设置为一个内联脚本,它在除第一行(即模式中的 the )之外的所有行的开头pick
用s
(meaning ) 替换单词。传递给脚本的提交列表是一个简单的文本文件。然后 Git 继续进行变基并让您编辑最终的提交消息。squash
2,\$
sed
此外,使用 git 钩子,您可以或多或少地轻松编辑此最终消息以满足您的需要(例如在压缩的提交消息之间添加一个视觉分隔符)。
使用 git merge --squash
挤压也可以通过git merge --squash
. 请参阅此处了解两种方法之间的区别。下面的脚本将使用 merge 命令将分支的提交压缩为单个提交。它还创建分支的备份(以防万一)。
MAINBRANCH="master"
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
# update current feature branch with master
git pull origin $MAINBRANCH
# delete existing backup
git branch -D "$CURRENT_BRANCH-backup"
# backup current feature branch and go back
git checkout -b "$CURRENT_BRANCH-backup" && git checkout -
# checkout and update master branch
git checkout $MAINBRANCH && git pull
# create new branch from master
git checkout -b "$CURRENT_BRANCH-squashed"
# set it to track the corresponding feature branch
git branch "$CURRENT_BRANCH-squashed" --set-upstream-to "$CURRENT_BRANCH"
# merge and squash the feature branch into the one created
git merge --squash $CURRENT_BRANCH
# commit the squashed changes
git commit
# force push to the corresponding feature branch
git push -f . HEAD:$CURRENT_BRANCH
# checkout the feature branch
git checkout $CURRENT_BRANCH
# delete the squashed copy
git branch -D "$CURRENT_BRANCH-squashed"