我团队的工作流程如下:
v4
即将发布的版本,以及v5
,对于 - 在遥远的未来发布)。我们会定期将v4
合并到v5
。v4
或v5
上工作,我们处理我们的分支中的功能分支并创建拉取请求,指向上游v4
或v5
(使用Atlassian Stash)我们说我创造了一个新的发展。我创建了一个新分支:
git checkout -b SOMETHING_FOR_V4 v4
现在我在SOMETHING_FOR_V4
。我提交并推送:
git push -u origin SOMETHING_FOR_V4
我已使用-u
设置了远程跟踪分支,因此下次更新内容时,我可以执行git push
而无需指定分支,Git会知道在哪里推送。
但是时间过去了,我想要改变。
我需要明确告诉git rebase origin/v4
相反,我可以在创建分支时将origin/v4
设置为我的跟踪分支,但是当我按下时,我必须每次都说git push origin SOMETHING_FOR_V4
。
我想要的是让Git足够聪明,知道最重要的事情。
如果我在执行git rebase
之后只是说git push -u
,那么在推送时我会指定远程跟踪分支,这不是我想要的。
基本上我想要单独跟踪分支用于git push
(我第一次推送的那个)并为git rebase
(在v4
或v5
之上重新定义,这取决于我开始[1])。
是否有可能出现这种行为?
或者,我会使用什么命令来了解自己是否更接近"到v4
或v5
(我正在考虑自动化别名中的fetch-and-rebase)?
[1]在这种情况下v4
,它可能会在我开始的时候(例如origin/v4
或其远程)进行重新定位。我们可以说我可以自己同步v4
和origin/v4
。
答案 0 :(得分:2)
目前没有内置的方法可以实现您的目标。但如果你自己无法处理这个案子,那么git就不会是git。
为了实现此功能,我们必须配置我们想要重新绑定的分支。 Git让您可以自由添加任何您能想象到的配置;所以让我们调用此配置键branch.<name>.rebase-upstream
。
要将origin/v4
设为rebase-upstream
SOMETHING_FOR_V4
,我们可以这样做:
git configure branch.SOMETHING_FOR_V4.rebase-upstream origin/v4
现在我们需要一个脚本来读取此配置并将其传递给rebase
。
以下脚本将尝试读取当前分支的配置;如果您现在没有任何分支,或者当前分支机构没有rebase-upstream
配置,它会发出警告。
#!/bin/sh
current_branch="$(git symbolic-ref --short -q HEAD)"
if [ $? == 1 ]; then
echo "You are on no branch!" >&2
exit 1
fi
upstream="$(git config --get branch.$current_branch.rebase-upstream)"
if [ $? == 1 ]; then
echo "No rebase-upstream reference configured for $current_branch (config: branch.$current_branch.rebase-upstream)" >&2
exit 1
fi
echo "Rebase $current_branch onto $upstream"
git rebase "$upstream"
要轻松使用此脚本,您现在有两种可能性。
您可以在路径中的某处添加脚本并将其命名为git-rebase-upstream
(或类似);领先的git-
是这里的重要部分。 Git在您的路径中查找以git-
开头的可执行文件,并将它们作为命令使用。现在,您可以通过git rebase-upstream
使用它。
更多&#34;便携式&#34;方法将添加一个别名,该别名包含脚本的shell函数。优点是,如果要在多台计算机上同步git配置和命令,则只需备份全局.gitconfig
。
添加名为rebase-upstream
的别名如下所示:
git config --global alias.rebase-upstream '!f() { current_branch="$(git symbolic-ref --short -q HEAD)"; if [ $? == 1 ]; then echo "You are on no branch!" >&2; exit 1; fi; upstream="$(git config --get branch.$current_branch.rebase-upstream)"; if [ $? == 1 ]; then echo "No rebase-upstream reference configured for $current_branch (config: branch.$current_branch.rebase-upstream)" >&2; exit 1; fi; echo "Rebase $current_branch onto $upstream"; git rebase "$upstream"; }; f'
如果您想为这两种方法使用较短的别名(ru
),可以使用
git config --global alias.ru '!git rebase-upstream'