1. 程式人生 > >[整理]git rebase的用法

[整理]git rebase的用法

使用git版本管理工具,必問git rebase的用法,但之前專案組人數5人,一直使用的是git pull,git commit 和git push,幾乎沒有用git rebase來變基,減少難看的merge 型別的commit。
最近一個新專案,兩地合作辦公大概有10人共用一個專案分支,幾分鐘內可能有多人提交,造成連續多個merge在gitk的路徑中,看不清某個人某次有價值的提交是哪一條,故組長建議大家使用git rebase。

看了2015年多個部落格,前人栽的樹,整理如下,方便新人檢視。

merge和rebase解決衝突的差別圖不貼了,主要是新使用的時候不知道寫什麼命令列。
命令列的使用直接上程式碼,git rebase 替代 git merge 大致過程:

git stash
git pull —rebase
git stash pop
手動解決衝突
git add -u
git rebase —continue
如果此時提示No rebase in progress?則表示已經沒有衝突了;否則上面兩步要重複多次
git commit -m “xxx”
git push origin [branch] -f

[精華部分]使用下面的關係區別這兩個操作:
git pull = git fetch + git merge
git pull –rebase = git fetch + git rebase

很喜歡如下圖:
這裡寫圖片描述

git pull –rebase 理解
這個命令做了以下內容:
a.把你 commit 到本地倉庫的內容,取出來放到暫存區(stash)(這時你的工作區是乾淨的)
b.然後從遠端拉取程式碼到本地,由於工作區是乾淨的,所以不會有衝突
c.從暫存區把你之前提交的內容取出來,跟拉下來的程式碼合併
所以 rebase 在拉程式碼前要確保你本地工作區是乾淨的,如果你本地修改的內容沒完全 commit 或者 stash,就會 rebase 失敗。

還附上了git add -u的解釋:

git add 的幾種引數區別:
git add -A 儲存所有的修改
git add . 儲存新的新增和修改,但是不包括刪除
git add -u 儲存修改和刪除,但是不包括新建檔案。
如果只想提交某個檔案,可以使用git add 路徑/檔名 或者 git add 路徑/

這一篇解釋了手動解決衝突時<<<<和=====的含義
一般情況下rebase都是會有衝突的,詳細檢視衝突可以用命令git status然後就會顯示哪個檔案有衝突,然後開啟有衝突的哪個檔案,會發現有一些“<<<<<<<”, “=======”, “>>>>>>>” 這樣的符號。

<<<<<<<” 表示衝突程式碼開始

“=======” 表示testmaster衝突程式碼分隔符

“>>>>>>>" 表示衝突程式碼的結束

<<<<<<<  
所以這一塊區域test的程式碼

=======  
這一塊區域master的程式碼

>>>>>>> 

對於rebase的工作流以程式碼的形式也體現的很清楚:

git rebase 
while(存在衝突) {
    git status
    找到當前衝突檔案,編輯解決衝突
    git add -u
    git rebase --continue
    if( git rebase --abort )
        break; 
}

除去替代merge,git rebase還有合併多個commit的功能,如下取自知乎:
(知乎)git rebase有哪些用法?
原文似乎不樂意被轉載,簡單記錄如下,明細還是看原帖子。還沒試驗過,先記錄如下:

兩種經典用法
問題場景1.如何刪除歷史中某項提交?
【案例】去除提交列表中的某個commit,例如在master分支上A->B->C->D->E->F, 除去D。
方案一:
git checkout C //將HEAD切換到C提交
git cherry-pick master^ //master^即E,將E放在C後面,E的HSA1值改變
git cherry-pick master //master即F,將F放在E後面,F的HSA1值改變
git checkout master //將HEAD切換到master分支
git reset –hard [email protected]{1} //將HEAD切換到最新的F
方案二:
採用變基的方式
git rebase –onto C E^ F //前後開閉區間,E^即D,表面C後面加上(D,F]
git checkout master
git reset –hard [email protected]{1}
方案三:
互動式變基
git rebase -i D^
然後刪除第一行(?沒明白意思)

問題場景2.如何合併歷史提交?
【案例】在master分支上A->B->C->D->E->F, 合併D到C,即A->B->CD->E->F。
方案一:
git checkout D
git reset –soft HEAD^^
git commit -c C//-c表示重用C的提交資訊
git cherry-pick E
git cherry-pick F
git checkout master
git reset –hard [email protected]{1}
方案二:
用變基命令
git checkout D
git reset –soft HEAD^^
git commit -c C//-c表示重用C的提交資訊
git tag newbase
git rebase –onto newbase E^ master
git tag -d newbase//清理該tag
方案三:互動式變基
git rebase -i C^
將第二行的pick更改為squash,二者將合併(?還是沒明白意思)

另外其他 git merge request,git cherrypick不做整理,今天只講git rebase。

相關推薦

[整理]git rebase用法

使用git版本管理工具,必問git rebase的用法,但之前專案組人數5人,一直使用的是git pull,git commit 和git push,幾乎沒有用git rebase來變基,減少難看的merge 型別的commit。 最近一個新專案,兩地合作辦公

git 命令之git rebase 用法

1.出現情況的背景:    當你提交的程式碼後,管理員發現,您的程式碼不能提交到伺服器上,主要原因在於,你的commit 中和伺服器中的有些commit不再同一時間軸上,即:你的有些commit要插入到伺服器中的某些commit之間,這樣就會造成程式碼的衝突。所以這個時

git rebase用法

mod 內容 例子 分享圖片 窗口 ont ash repo checkout 改變基        一個git庫,開發人員在master分支的Bcommit的時候,創建了一個dev分支,此時Bcommit是dev分支的基,然後分別進行兩個分支的開發。   進行到maste

git用法整理

前言 我用的TortoiseGit. 實驗 比較指定版本之間的區別 一個問題解決了幾次,每次都有提交。當問題解決完後,想知道從修改前,到修改完成,都改了些什麼。 當不相同的檔案列出來後,就可以右擊選“compare revisions”來看檔案的區別了,適合做筆記。

git 命令之git rebase 最詳細用法 .

git rebase 命令的功能很強大, 在《git 權威指南》一書裡,改變提交(commit)的順序,書中教了一種很複雜的方法,運用了git reset ... git cherry-pick...等等命令。 但如果用git rebase 命令,則一下就搞定。 以下面的例子來講解一下git re

git命令之git rebase用法

rebase 假設你現在基於遠端分支"origin",建立一個叫"mywork"的分支。 $ git checkout -b mywork origin 現在我們在這個分支做一些修改,然後生成兩個提交(commit). $ vi file.txt $ git

Git Rebase 操作的分析與整理

首先會產生 rebase 分支(master)的備份,放到(no branch )臨時分支中。再將支線分支(branch)的每一次提交修改,以補丁的形式,一個個的重新應用到主幹分支上。這個過程是一個迴圈應用補丁的過程,期間只要補丁產生衝突,就會停止迴圈,等待手動解決衝突。這個衝突指的是上一個合併後版本與補丁之

git reset rebase 用法總結

git reset  放棄修改,同步運程倉庫,回退以前某個版本HEAD指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id。  

[Git] Git整理(四) git rebase 的使用

開發十年,就只剩下這套架構體系了! >>>   

git branch用法總結

如果 命名 參數 war blank org 2.6 重命名 scm Git branch git branch 不帶參數:列出本地已經存在的分支,並且在當前分支的前面加“*”號標記,例如: #git branch* master

git常用命令2--- git rebase

過程 checkout nbsp 常用 check mit 另一個 ups pst git rebase:簡單而言就是把某個分支上的提交commit嫁接到另一個commit的後面,在這個過程中這些commit的base相對就改變了,也就叫變基。 git rebase <

git 基本用法

out dex 分支 sta ont align git init git clone 文件夾 返回上一個文件 git reset --hard HEAD~1 創建文件 mkdir 文件名 調用文件 cd 文件名 文件夾裏添加文本 touch index.html 文本添

git rebase

ror mes staging eba 表示 clas his top rop 1 noop 2 3 # Rebase 3bb2bfb..3bb2bfb onto 3bb2bfb (1 command) 4 # 5 # Commands:

git基本用法

臨時 標準 lob init 通過 開頭 git fetch values 管理 git基本用法 一.創建新倉庫 touch README.md 創建一個新文件 git init 初始化當前文件夾為一個Git倉庫 git add README.md 添加該文件

git rebase 的使用

還需 覆蓋 分支 .com 重新 客戶端 dia 從服務器 你們 rebase 在 Git 中整合來自不同分支的修改主要有兩種方法:merge 以及 rebase。 在本節中我們將學習什麽是“rebase”,怎樣使用“rebase”,並將展示該操作的驚艷之處,以及指出在

Git-git rebase詳解

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

git add用法

delete 會有 不同 2.x version mit 暫存區 分享 工作 git add命令是將工作區內容添加到暫存區。git commit 將暫存區內容添加到版本庫。 git add -A 提交所有變化 git add -u 提交被修改(modified)和被刪除

Git基本用法1

emp origin 開發環境 github res 創建 退出 pda 索引 二、git的初始化 在使用git進行代碼管理之前,我們首先要對git進行初始化。 1.Git 配置 使用Git的第一件事就是設置你的名字和email,這些就是你在提交commit時的簽名,每次提

Git基本用法2

新增 block one 其中 gin 參數 normal 密碼 nor 二、比較內容1.比較提交 - Git Diff現在我們對項目做些修改:$ cd gitproject # 向README文件添加一行 $ echo "new line" >> README

git rebase 使用

comm 更新 size 根據 project git git pull 提交代碼 會有 從master上拉個分支 命名為myproject; 本地寫代碼,寫完以後需要提交時:(1) git status (2) git add . (3) git commit