git rebase 和 merge 的區別

git rebasegit merge 解決了相同的問題。都是將一個分支的提交合併到另外一分支上,那它們有哪些不一樣喃?前端

git merge

master 分支合入到 feature 分支git

git checkout feature
git merge master

// 或者
git merge master feature

git merge 的優點是它保留了分支的結構與歷史提交目錄,但同時這也致使了提交歷史會被大量的 merge 污染github

git rebase

rebase 命令是一個常常聽到,可是大多數人掌握又不太好的一個命令。rebase 合併每每又被稱爲 「變基」面試

它是將把全部的提交壓縮成一個 patch 。而後把 patch 添加到目標分支裏。rebasemerge 不一樣的是,rebase 經過爲原始分支中的每一個提交建立全新的 commits 來重寫項目歷史記錄算法

master 分支爲基,對 feautre 分支進行變基:編輯器

git checout feature
git rebase master

git rebase 的優點是能夠得到更清晰的項目歷史。首先,它消除了 git merge 所需的沒必要要的合併提交;其次,正如你在上圖中所看到的,rebase 會產生完美線性的項目歷史記錄,你能夠在 feature 分支上沒有任何分叉的狀況下一直追尋到項目的初始提交。url

可是, rebase 會丟失合併提交的上下文, 使咱們沒法看到真實的更改是什麼時候合併到目標分支上的.net

交互式 Rebase

這個命令比 git rebase 更爲強大,它將會在 commits 移動到新分支時更改這些 commits ,一般,這用於在合併 feature 分支到 master 以前清理其雜亂的歷史記錄。code

git checkout feature
git rebase -i master

這將打開一個文本編輯器,列出即將移動的全部提交:blog

pick 6633b5a Message for commit #1
pick 3a03f0d Message for commit #2
pick 657897b Message for commit #3

它清晰地展現了分支在 rebase 後的樣子。經過從新調整,提交歷史能夠變成任何你想要的樣子。

消除這種無心義的提交使你的功能歷史更容易理解。這是 git merge 根本沒法作到的事情。

至於 commits 條目前的 pickfixupsquash 等命令,在 git 目錄執行 git rebase -i 便可查看到,你們按需重排或合併提交便可,註釋說明很是清晰,在此不作過多說明

git merge vs git rebase

git merge:

  • 記錄下合併動做,不少時候這種合併動做是垃圾信息
  • 不會修改原 commit ID
  • 衝突只解決一次
  • 分支看着不大整潔,可是能看出合併的前後順序
  • 記錄了真實的 commit 狀況,包括每一個分支的詳情

git rebase:

  • 改變當前分支 branch out 的位置
  • 獲得更簡潔的項目歷史
  • 每一個 commit 都須要解決衝突
  • 修改全部 commit ID

個人建議

隨着團隊增加,經過 merge 策略很難管理和追蹤到每一個提交。爲了提交歷史更清晰、更易於理解,使用 rebase 是一個明智、高效的選擇。

下面是針對不一樣環境的建議,能夠最大限度地發揮 rebase 的優點:

**本地開發:**若是你沒有和別人協同工做,你應該使用 rebasing 而不是 merging ,這樣歷史記錄會很清晰。若是你已經從倉庫拉取了你的我的 fork,而且不許備和別的開發者一塊兒工做,在分支 pushrebase 也是能夠的。

你的代碼準備好了被 review :你建立了 pull request。別人正在 review 你的代碼,可能把它拉到了本地 review 。若是這樣,你最好別 rebase 你的代碼。你應該建立一個 「rework」 提交來更新你的 feature 分支。它會讓 pull request 的可塑性更強,也能避免歷史忽然丟失。

review 已經完成而且已經準備好了合併到目標分支。恭喜!你就要刪除你的 feature 分支了。因爲別的開發者不須要拉取、合併這些更改,這是你清理記錄的好機會。你能夠改寫記錄,摺疊原始提交、「pr rework」 提交和 "merge" 提交,使之成爲一整個清晰的提交。做爲可選,你還能夠給這些提交建立一個明確的 merge ,這樣作實際上頗有用。它會記錄 feature 併入 master 的時間。

參考:

Merging vs. Rebasing

An introduction to Git merge and rebase: what they are, and how to use them

天天三分鐘,進階一個前端小 tip 面試題庫 算法題庫

相關文章
相關標籤/搜索