Git 操作之rebase、squash

xiaozhidexiao發表於2017-11-12

使用git版本控制。

1.從master拉取分支(公司開發從develop拉取分支)。

git checkout -b feature-demo

2.程式碼編寫,提交程式碼。
本地開發時,有些功能的開發可能需要幾天,為了防止意外情況,儘量一天結束的時候,將未完成的程式碼提交到屬於自己的遠端分支。

/**
 * Git Demo
 * @date 2017-11-11 下午10:23
 */
public class GitDemoTest {

    @Test
    public void getCommit() {
        System.out.println("commit1");//git commit1
        System.out.println("commit2");//git commit2
        System.out.println("commit3");//git commit3
    }

}
(1)提交程式碼:
git add .
git commit
Tip: 如果使用Intellij Idea提交程式碼,可以使用review功能檢視有警告的提示,或者使用阿里程式碼檢查外掛進行程式碼檢查,慢慢減少不良的編碼習.

rebase 操作:
git rebase origin/master

推送到遠端分支:
git push origin feature-demo 

檢視遠端分支:
git branch -a
  ->
  feature-demo
  master
  remotes/origin/feature-demo
  remotes/origin/master

第二次提交程式碼:
git add .
git commit
...
第三次提交程式碼:
git add .
git commit
...

(2)最終提交程式碼時,需要刪除之前的遠端分支;使用git squash將多個commit資訊合併成一個,並再次提交到遠端分支,合併到master上.
刪除遠端分支:
git push origin --delete feature-demo
git branch -a

git squash操作:
git checkout feature-demo
git rebase -i HEAD~3 

vim操作:   pick ff1abcc git commit1    -> pick ff1abcc git commit1
          pick 5618649 git commit2    -> s ff1abcc git commit2
          pick 5b51a97 git commit3    -> s ff1abcc git commit3

合併提交資訊:     # This is a combination of 3 commits. -> # This is a combination of 3 commits.
                # This is the 1st commit message:     -> # This is the 1st commit message:
                git commit1                           -> git commit
                # This is the commit message #2:      -> # This is the commit message #2:
                git commit2                           ->
                # This is the commit message #3:      -> # This is the commit message #3:
                git commit3                           ->


Tip: 合併三次commit成一個,使分支看起來簡介,防止rebase時遇到衝突需多次解決衝突的情況)

git push origin feature-demo
git branch -a

3.將遠端feature-demo合併到master上。

總結:

(1) 使用git rebase目的:公司專案管理規範要求;梳理git分支樹,使分支樹看起來簡潔。
缺點:rebase時遇到本地feature、遠端master、遠端feature之間衝突時,解決衝突比較麻煩;如果commit多次,需要解決多次衝突(git merch只需要解決一次),容易導致解決衝突時丟失部分程式碼。


(2) 使用git squash目的:如果其他同事提交程式碼到master(develop),你rebase遠端master時可能會遇到衝突,使用squash可以使解決衝突“簡單化”;頻繁commit導致多個無意義提交資訊,容易引起他人理解git分支樹困惑,使用squash讓提交資訊準確明瞭。
缺點:將多次commit資訊合併成一個,提交資訊的減少導致理解困難,版本回滾會造成麻煩。


說明:“多次commit”的場景在開發時會經常遇到,如完成一天的開發任務,需要提交到遠端feature;或者遇到緊急的臨時任務,需要切換分支進行開發(Source Tree軟體的暫存功能也可以臨時儲存已經修改但未commit的程式碼)。

總之,git的使用需要結合公司的具體要求和個人使用習慣,根據具體的應用場景,選擇合適的使用方式。


相關文章