繁体   English   中英

改进git rebase工作流程

[英]Improving a git rebase workflow

我目前正在使用功能分支和在推送之前重新定位到master的非常简单的git工作流程。

git checkout -b feature
.. make some commits
git checkout master
git pull

如果拉动没有变化:

git merge feature
git push

如果有变化:

git checkout feature
git rebase master
git checkout master
git merge feature
git push

虽然很高兴了解git是如何工作的,但是一直打字有点乏味,我怀疑有一些更快的方法可以实现我正在做的但却找不到它们。

您最短的步骤总共有6个步骤(没有更改的情况):

git checkout -b feature
.. make some commits
git checkout master
git pull
git merge feature
git push

这种技术应该适用于两种情况(也包括6个步骤):

git checkout -b feature
.. make some commits
git fetch
git rebase origin/master
git checkout master
git merge feature

好吧,你可以合并使用git pull --rebase ,这样做:

-r --rebase

在获取后,将当前分支重新定位在上游分支的顶部。 如果存在与上游分支对应的远程跟踪分支,并且自上次提取以来上游分支已重新定位,则rebase使用该信息来避免重新定位非本地更改。

如果你想让git pull总是使用--rebase而不是合并pull.rebase, branch.<name>.rebase请参阅git-config (1)中的 pull.rebase, branch.<name>.rebasebranch.autosetuprebase

注意

这是一种潜在危险的操作模式。 它重写了历史,当你已经发布了这段历史时,它并不是一个好兆头。 除非您仔细阅读git-rebase (1),否则请勿使用此选项。

总结如下:

git branch -b feature
...
git checkout master
git merge feature  # By the way, merge's --no-ff might interest you
git pull --rebase  # rebases feature onto the new-fetched head if necessary

只需注意一下:如果您对master进行了更改,那么结果与您的方式略有不同,因为git pull --rebase自上次pull/push到拉动HEAD以来的所有更改,而您的方式会导致拉出更改并将您的master更改合并,然后根据该feature进行重新设置。 这大多是无关紧要的(我个人并不喜欢在我的历史记录中没有不必要的pull诱导合并),但你应该意识到它......

在图片中,之前:

 /-O          origin/master
C--A--B       master
    \--F--G   feature

在您的方式之后:

 /-O-----\  
C--A--B--C*-----(FG)  (origin/)master - fast-forward merge (unless --no-ff)
          \-F-G-/     feature (rebased!)

git pull --rebase方式:

 /-O
C--A--B--M*  => C--O--A--B--M*  (origin/)master
   \-F-G-/                      feature (not rebased!)

相反,如果你想要最终结果

C--O--A--B--F--G

使用

git branch -b feature
...
git checkout master
git rebase feature
git pull --rebase

还要注意git-rebase -i可以带来多少乐趣;)

可能一个好的别名可以改善你的工作流程,我用这个

# full rebase
frb = "!sh -c 'x=`git rev-parse --abbrev-ref HEAD` && echo "rebasing to $0 ..." && git rebase $0 && git checkout $0 && git rebase $x'"

用法(在功能分支上):

git frb master

当然,您也可以在开头添加结帐并在结尾处推送

...在git 1.9.3(osx)上测试,未测试如果存在冲突会发生什么

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM