簡體   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