1. 程式人生 > >git rebase詳解

git rebase詳解

1 git合併程式碼方式主要有兩種方式,分別為:


(1) merge處理,這是大家比較能理解的方式。
(2) rebase處理,中文此處翻譯為衍合過程。

2 git rebase操作講解例子:

mkdir hellogit

cd hellogit # 建立hellogit目錄
git init    # 初始化git專案
vim readme  # 新建readme檔案,往裡邊新增內容
git add .   # 提交內容
git commit -m 'init project c1' # git系統預設建立一個master分支


# 接著我們建立一個dev分支,在dev分支上新增內容
git checkout -b dev    # 此處其實是兩步git branch dev加上git checkout dev
vim readme             # 在原來基礎上增加上內容
git add .
git commit -m 'add hello world c2'

# 切換回到master分支
git checkout master
vim readme           # 編輯readme檔案,在第二行增加hello world from master內容

# 此處先埋個點,因為此處會和dev分支上做的修改衝突
git add .
git commit -m 'add hello world c3'
vim hello.py         # 新新增一個hello.py檔案
git add .
git commit -m 'add hello.py c4'

# 切換回到dev分支
git checkout dev
vim helloworld.py     # 新增上helloworld.py檔案
git add .
git commit -m 'add helloworld.py c5'

3 至此,我們簡單分析下情況為:

master分支,節點連結串列指向為:c1<--c3<--c4
dev分支,節點連結串列指向為:c1<--c2<--c5
master分支和dev分支祖先為c1,假定在master分支上做git merge dev合併,得到的提交歷史為:
c1<--c2<--c3<--c4<--c5<--c6(c1、c4、c5做了一次三方合併發現衝突,手工處理完畢後git add/commit增加了提交節點c6)
採用git merge dev處理提交log是按照時間戳先後順序的。

假定採用的是git rebase處理過程為:

git checkout dev
git rebase master # 將dev上的c2、c5在master分支上做一次衍合處理

# git提示出現了程式碼衝突,此處為之前埋下的衝突點,處理完畢後
git add readme # 新增衝突處理後的檔案
git rebase --continue    # 加上--continue引數讓rebase繼續處理

4 此處處理後的節點為:

c1 c3 c4 c2 c5 # 此處不是按照時間順序處理的
綜合表現,git rebase可以得到一個更加簡潔的提交歷史,無需多了c6。
處理完畢後,git checkout master加上git merge dev,git會智慧採用f-f處理。

總結為:
git rebase過程相比較git merge合併整合得到的結果沒有任何區別,但是通過git rebase衍合能產生一個更為整潔的提交歷史。
如果觀察一個衍合過的分支的歷史提交記錄,看起來會更清楚:彷彿所有修改都是在一根線上先後完成的,儘管實際上它們原來是同時並行發生的。

一般我們使用衍合的目的,是想要得到一個能在遠端分支上乾淨應用的補丁,比如某個專案你不是維護者,但是想幫點忙,最好使用衍合處理。
先在自己的一個分支進行開發,當準備向主專案提交補丁的時候,根據最新的orgin/master進行一次衍合操作然後再提交,這樣維護者就不需要任何整合工作。

實際為:把解決分支補丁同最新主幹程式碼之間的衝突的責任,劃轉給由提交補丁的人來解決。
作為維護專案的人只需要根據你提供的倉庫地址做一次快進合併,或者直接採納你提交的補丁。

衍合的風險,請務必遵循如下準則:
一旦分支中的提交物件釋出到公共倉庫,就千萬不要對該分支進行衍合操作。

本文轉自:

相關推薦

Git-git rebase

rom 參數 翻譯 .com 做的 mce 基礎 pre 手工 git合並代碼方式主要有兩種方式,分別為:1、merge處理,這是大家比較能理解的方式。2、rebase處理,中文此處翻譯為衍合過程。 git rebase操作講解例子: 1 cd /usr/local/t

git rebase

1 git合併程式碼方式主要有兩種方式,分別為: (1) merge處理,這是大家比較能理解的方式。 (2) rebase處理,中文此處翻譯為衍合過程。 2 git rebase操作講解例子: mkdir hellogit cd hellogit #

Git應用第九講:Git cherry-pick與Git rebase

前言 前情提要:Git應用詳解第八講:Git標籤、別名與Git gc 這一節主要介紹git cherry-pick與git rebase的原理及使用。 一、Git cherry-pick Git cherry-pick的作用為移植提交。比如在dev分支錯誤地進行了兩次提交2nd和3rd,如果想要將這兩次提

git 使用 (1)——歷史

服務 編輯 元數據 原始的 事先 史記 依然 sub 本地磁盤 版本控制系統(VCS) 有了它你就可以將某個文件回溯到之前的狀態,甚至將整個項目都回退到過去某個時間點的狀態。你可以比較文件的變化細節,查出最後是誰修改了哪個地方,從而導致出現怪異問題,又是誰在何時報告了某個功

git 使用(3)—— 最基本命令 + .gitignore 文件

clu 分隔 ignore abc lob 目的 hat modified 容易 Git 基礎 本章將介紹幾個最基本的,也是最常用的 Git 命令,以後絕大多數時間裏用到的也就是這幾個命令。讀完本章,你就能初始化一個新的代碼倉庫,做一些適當配置;開始或停止跟蹤某些文件;暫存

git 使用(4)—— commit -a -m/diff --staged/rm/mv

art client -s 做的 res use 擴展名 ems 也會 查看已暫存和未暫存的更新 實際上 git status的顯示比較簡單,僅僅是 列出了(修改過的、新創建的、已經暫存但未提交的)文件,如果要查看具體修改了什麽地方,可以用git diff 命令。稍後我們會

git 使用(5)—— get log 查看提交歷史

校驗和 看到了 有一個 基本 detached pack 有意思 lin mls git log 查看 提交歷史 在提交了若幹更新之後,又或者克隆了某個項目,想回顧下提交歷史,可以使用 git log 命令查看。 接下來的例子會用我專門用於演示的 simplegit 項目,

git 使用(6)—— 3種撤消操作

direct ash 存在 其中 分支 stash card mas 相關 接下來,我們會介紹一些基本的撤消操作相關的命令。請註意,有些操作並不總是可以撤消的,所以請務必謹慎小心,一旦失誤,就有可能丟失部分工作成果。 修改最後一次提交 git commit --amend

git add

git reset 工作 合集 git 兩個 tool stat nbsp 方便 git add . :他會監控工作區的狀態樹,使用它會把工作時的所有變化提交到暫存區,包括文件內容修改(modified)以及新文件(new),但不包括被刪除的文件。 git add -u

git pull

git pull命令的作用是,取回遠端主機某個分支的更新,再與本地的指定分支合併。它的完整格式稍稍有點複雜。 $ git pull <遠端主機名> <遠端分支名>:<本地分支名> 比如,取回origin主機的next分支,與本地的master分支合併,

git stash -----mark

git stash詳解 2018年06月24日 23:00:55 淹不死的水 閱讀數:1782 標籤: gitgit stash 更多 個人分類: git 應用場景: 1 當正在dev分支上開發某個專案,這時專案中出現一個b

使用SourceTree git專案

這篇文件的目的是:讓使用Git更輕鬆。 看完這篇文件你能做到的是: 1、簡單的用Git管理專案。 2、怎樣既要開發又要處理髮布出去的版本bug情況。 SourceTree是一個免費的Git圖形化管理工具,mac下也可以安裝。 參考: 1、從Git

git指令總結

Git是目前最流行的版本管理系統,學會Git幾乎成了開發者的必備技能。 Git有很多優勢,其中之一就是遠端操作非常簡便。本文詳細介紹5個Git命令,它們的概念和用法,理解了這些內容,你就會完全掌握Git遠端操作。 git clone git remote git fetch

git使用 terminal命令/sourceTree/Xcode

說到git,必須要先談一下版本控制。什麼是版本控制?我為什麼要關心它呢?版本控制是一種記錄一個或若干檔案內容變化,以便將來查閱特定版本修訂情況的系統。 版本控制的型別大致可以分為三大類: 本地

即拉即用:你不知道的持續整合的3個Git Hooks

在構建之外新增自動化的手段,是真正用好CI的關鍵。如果你已經用了一段時間的Git了,相信你可能聽說過Git Hooks,甚至可能簡單的上手玩了玩。Git Hooks在持續整合的語境中十分神奇,所以在本文中,我將深入介紹三個用例,並教你學會將現成可用的Hooks運

Git使用】使用Egit克隆專案到本地圖解

第一步:   開啟Eclipse的Git檢視,在檢視中單擊"Clone a Git repository" 如圖:      第二步:在彈出的Clone Git Repository介面中輸入要克隆

git 使用-- tag打標籤

Git 的標籤管理。跟大多數的 VCS 工具一樣,git 也有在歷史狀態的關鍵點“貼標籤”的功能,一般人們用這個功能來標記釋出點(例如’v1.0′)。列出git中現有標籤 要想列出git中現有的所有標籤,輸入’git tag’命令執行即可: $ git tag v0.

git log

git log 可以讓我們檢視提交commit history,接下來我們來一起探索git log提供的引數。 $ git log commit 0005d1e3f54b79fe4707fbccc44b89e0fb4ce565 (HEAD -> master, origin/m

MyEclipse+Git使用

【說明】 1.關於git的介紹和使用請參考其他文章,本文只是具體說myeclipse+git的使用 2.由於使用myeclipse+git,所以不需要安裝git客戶端和圖形化程式,只需要一個egit外掛 3.同樣適用於eclipse+git, 【安裝egit外掛】 1.方法一:

git 使用(3)-- 初體驗

Git 基礎 本章將介紹幾個最基本的,也是最常用的 Git 命令,以後絕大多數時間裡用到的也就是這幾個命令。讀完本章,你就能初始化一個新的程式碼倉庫,做一些適當配置;開始或停止跟蹤某些檔案;暫存或提交某些更新。我們還會展示如何讓 Git 忽略某些檔案,或是名稱符合特定模式