1. 程式人生 > >git rebase: 合併/擷取commit及分支間的commit拼接

git rebase: 合併/擷取commit及分支間的commit拼接

git rebase: 合併/擷取commit 及 分支間的commit拼接

一. 只涉及單獨分支的操作

1. 合併commit

當前分支狀態:

A--------B-------C--------D 
        |--想要合併的commit--|

預計合併之後的狀態:

A--------B'(包含C, D)

使用命令:
git rebase -i [start] [end]

startend遵循左開右閉原則
1. -i:啟用互動,只有加了這個,才會有下面一步步的操作提示
2. [start]: 如果想要合併B----C----D

,則[start]B 的前一個commit, 即A
3. [end]: 如果想要合併B----C----D,則[end]D ; 如果預設的話,預設為當前head 指向的commit

Note:[start][end]均為commit-ish,有如下表示方法

----------------------------------------------------------------------
|    Commit-ish             |                Examples
----------------------------------------------------------------------
|  1. <sha1
>
| dae86e1950b1277e545cee180551750029cfe735 | 2. <describeOutput> | v1.7.4.2-679-g3bee7fb | 3. <refname> | master, heads/master, refs/heads/master | 4. <refname>@{<date>} | [email protected]{yesterday}, [email protected]{5 minutes ago} | 5. <refname
>
@{<n>} | [email protected]{1} | 6. @{<n>} | @{1} | 7. @{-<n>} | @{-1} | 8. <refname>@{upstream} | [email protected]{upstream}, @{u} | 9. <rev>^ | HEAD^, v1.5.1^0 | 10. <rev>~<n> | master~3 | 11. <rev>^{<type>} | v0.99.8^{commit} | 12. <rev>^{} | v0.99.8^{} | 13. <rev>^{/<text>} | HEAD^{/fix nasty bug} | 14. :/<text> | :/fix nasty bug

示例

1. 當前狀態:

commit
file

2. 輸入命令:

git rebase -i 869af45 9728be5

869af459728be5hashID的簡寫形式,git會查詢以其開頭的hashID

此時會以編輯器(vim)形式進入第一個互動:

pick f9a2daa add 1.txt
pick dd0326f add 2.txt
pick 9728be5 add 3.txt

# Rebase 869af45..9728be5 onto 869af45 (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
~                                                                                                                                                                                                   
~                                                                                                                                                                                                   
~                                                                                                                                                                                                   
~                                                                                                                                                                                                   
~                                          

#開頭的都是幫助資訊,真正要修改的是開頭的三行

命令預設為pick,即使用當前commit, 因為我們想合併這三個commit,所以將前三行修改為

pick f9a2daa add 1.txt
s dd0326f add 2.txt
s 9728be5 add 3.txt

表示採用第一個commit,並將後續的commit合併到第一個commit.

然後用vim的儲存操作儲存後,若沒有conflict將再次以編輯器形式進入下一個互動

Note: 若存在conflict, 則解決衝突後,輸入 git rebase --continue 繼續操作,每次出現衝突,皆如此

# This is a combination of 3 commits.
# This is the 1st commit message:

add 1.txt

# This is the commit message #2:

add 2.txt

# This is the commit message #3:

add 3.txt

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Wed Jul 25 16:57:09 2018 +0800
#
# interactive rebase in progress; onto 869af45
# Last commands done (3 commands done):
#    s dd0326f add 2.txt
#    s 9728be5 add 3.txt
# No commands remaining.
# You are currently rebasing.
#
# Changes to be committed:
#       new file:   1.txt
#       new file:   2.txt
#       new file:   3.txt
#
# Untracked files:
#       core/file.js
#
~                                                                                                                                                                                                   
~                     

表明這三段commitmessage將合併。如果要更改資訊,可以在這裡修改,不修改的話可以直接進行儲存操作。這裡我們直接儲存,然後git會做如下提示 :
這裡寫圖片描述
我們發現操作成功了,但是當前的head還處於遊離狀態,此時我們處於一個7fc1b94的臨時分支上,所以,接下來,將分支切換到之前的分支, 輸入命令git reset --hard 7fc1b94:
這裡寫圖片描述
此時用git log檢視,會發現commit已經如我們所願地合併了。
這裡寫圖片描述

2. 刪除某段commit

當前分支狀態:

A--------B-------C--------D-------E--------F  
    |--想要刪除的commit--|

預計刪除之後的狀態:

A--------D'-------E'--------F'

示例:

還是用之前的示例:
commit

1. 方法一:

在之前合併commit的基礎上,將如下

pick f9a2daa add 1.txt
s dd0326f add 2.txt
s 9728be5 add 3.txt

改為

pick f9a2daa add 1.txt
d dd0326f add 2.txt
s 9728be5 add 3.txt

ddrop, 棄用本行的commit

之後的操作和之前一樣即可,然後我們發現:
刪除成功後的commit
刪除成功後的檔案列表

PS: 當然如果你只想刪除第二個commit而不想合併第一個和第二個,那麼就寫成

pick f9a2daa add 1.txt
d dd0326f add 2.txt
p 9728be5 add 3.txt

2. 方法二:

使用命令:
git rebase [start] [end] --onto <newbase>

[start], [end] 都和之前一樣;
--onto <newbase> 表示為rebase操作指定的基礎點
以如下commit樹為例:

A--------B-------C--------D-------E--------F  
    |--想要刪除的commit--|

分析如下:

                     (因為左開右閉原則,實際start為C)
--newbase--|                    start             end
--------A--------B-------C--------D-------E--------F  
           |--想要刪除的commit--|
示例:

仍然用之前的例子
操作前的commit
則執行命令如下:
git rebase 5806b3 08676a5 --onto dff15b

PS:
1. 將--onto <newbase>的位置調換這樣寫也是可以的:
git rebase --onto dff15b 5806b3 08676a5
2. 或者,你可以用其他commit-ish表示法,例如:
git rebase 分支名~1 分支名 --onto 分支名~2

執行後,如果head為遊離態,則還是用老方法處理。操作成功後,我們可以看到:
操作後commit
操作後file

二. 涉及多個分支間的操作

以下只提及操作命令,就不一一示例操作了(才不是因為我偷懶)

1. 拼接到頭部

當前分支狀態:

A--------B-------C--------D    分支A
          \
           E-------F--------G  分支B
          |--想要拼接的commit--|

預計合併之後的狀態:

A--------B-------C--------D    分支A
                           \
                            --------E'-------F'--------G'  分支B

可以直接在分支B上執行:
git rebase A B

git rebase A

2. 忽略中間的支線

當前分支狀態:

A--------B-------C--------D    分支A
          \
           E-------F--------G  分支B
             |-忽略的commit-| \
                              H-------I--------J  分支c
                             |--想要拼接的commit--|

預計合併之後的狀態:

A--------B-------C--------D    分支A
                           \
                            --------H'-------I'--------J'  分支c

使用命令:
在分支C上執行git rebase B C --onto A

相關推薦

git rebase: 合併/擷取commit分支commit拼接

git rebase: 合併/擷取commit 及 分支間的commit拼接 一. 只涉及單獨分支的操作 1. 合併commit 當前分支狀態: A--------B-------C--------D |--想要合併的c

git rebase合併

合併issue3分支的時候,使用rebase可以使提交的歷史記錄顯得更簡潔。 現在暫時取消剛才的合併。 $ git reset --hard HEAD~ 切換到issue3分支後,對master執行rebase。 $ git checkout issue3 Switched t

git rebase合併多次commi

將多次commit合併,只保留一次提交歷史。 1.首先使用git log檢視一下提交歷史 [[email protected]:zh_cn(bugfix/yc

git如何合併遠端2個分支

提要:專案用的gitlab,手動在管理後臺只能新建刪除以及合併master分支,並不能合併2個有衝突的分支,所以還得用命令列 1,先檢出專案到一個資料夾 git clone 2,你檢出的專案預設是master,所以現在要檢視遠端全部分支

git獲取linux核心原始碼分支管理

1.    環境:ubuntu12.04. 2.    git安裝:sudo apt-get install git-core ,安裝完後檢視版本如下:            3.   獲取linux核心原始碼:     在kernel的官網上有三種版本,mainline

git分支管理(建立分支分支轉換,檢視分支合併分支,刪除分支分支衝突)

分支(branch)這玩意兒我也不知道該怎麼解釋,就按照自己的理解來吧~ 在你第一次commit的時候,git會自動建立一個master分支(當然前提是你沒有在這之前就轉換到另一個分支上),這就是主線。有的時候,會想對倉庫進行某些操作,但是我們又不想影響到倉庫當前的狀態,這個時候就可以建立一

Git tips: 合併 commit 保持分支幹淨整潔

本文的讀者需要已經瞭解 基本的 Git 操作和開發流程 。 在我們開發完分支後,一般分支上會有很多 commit —— 少不了諸如 “fix typo”, “sth wrong in the previous commit” 之類的 commit。在合併到主幹的時候,往往

git rebase & merge 將其他分支的修改合併到當前分支

例如現在有兩個分支 master 和 feature, 你在 feature 分支上進行了實驗,這時候有個另外的人在 master 分支上進行了新的提交。那麼你需要將 master上別人的修改應用到 feature 分支上。 方法1: merge git c

Git使用rebase合併多個commit

首先假設我們有3個 commit 我們需要將 2dfbc7e8 和 c4e858b5 合併成一個 commit,那麼我們輸入如下命令: 其中,-i 的引數是不需要合併的 commit 的 hash 值(也就是我們要rebase到的commit物件),這裡指的是第一條 commit, 接著我們就進入到

git 放棄本地修改強制更新& Git分支merge和rebase的適用場景區別

本地有修改和提交,如果想放棄這些修改和提交 可以使用如下命令強制用遠端的庫更新: git fetch --all git reset --hard origin/master git fetch --all 只是下載遠端的庫的內容,不做任何的合併 git rese

git中各個commit節點的查詢 回溯 與 合併:git rebasegit reset

commit daffbd39053d4f2e78f88955c2158de6092258a2 Author: hyk <[email protected](none)> Date:   Wed May 29 22:45:23 2013 +0800     this is a test

利用 git rebase -i 指令合併多次 commit

由於公司要求一次 push 只能有一次 commit,然而自己由於操作失誤,導致一次修改的內容,分成了兩次 commit,再進行 push 的時候就失敗了 在網上找了一次找到了如下的方法 合併前兩次 commit 的資訊 # git rebase -i

巧用 git rebase 將某一部分 commit 復制到另一個分支

cif 技術分享 res info devel strong afr branch start 一、為什麽需要將一個 commit 復制到其他分支上去呢?   在我們的實際開發的過程中,我們的項目中會存在多個分支。 在某些情況下,可能需要將某一個分支上的 commit

記一次使用commit提交大檔案無法推送到遠端庫解決問題過程git rebase使用

**記一次使用commit提交大檔案無法推送到遠端庫解決問題過程及git rebase使用** [toc] 解決這個問題並沒有特別的(刪除提交歷史中某個檔案,然後重新push),但是由於開始的使用失誤,中間有使用`git rebase`和`git reset`命令處理,所以特此記錄下 ## 大檔案無法

Git-使用Rebase合併分支

# commit 合併 在開發過程中,可能會出現多個 commit 所涉及的邏輯都是同一個功能模組,此時,會導致 log tree 非常的混亂,不美觀,因此,我們可以將多個 commit 進行合併,變成一條,這樣,也使得 log tree 會更加的簡潔。 首先,先確定的是,我們合併 commit 使用的是

分支管理~策略,git merge 合併禁用ff模式 (十一)

通常,合併分支時,如果可能,Git會用Fast forward模式,但這種 ff 模式下,刪除分支後,會丟掉分支資訊。 如果要強制禁用 Fast forward 模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支資訊。 下面開始實踐:git merge

git常用操作分支

1、github官網註冊賬號,下載gitbash,完成基本配置,推薦開源中國上的一篇部落格:簡單使用Git和Github來管理自己的程式碼和讀書筆記 2、基礎階段常用操作: 知乎上關於git三個區解釋如下: 工作區(working diretory) 用於修改檔案 快取區(stage)

Git如何合併Commit

如果你在 push 你的修改之前想要將本地多次修改後的 commit 合併一下變得更好看,可以使用下面的方法。 指定你要合併的 commit 相關的命令有兩種 你可以通過指定修改過去的幾個 commit git rebase -i HEAD~2 你可以通過指定最新的想保留的

git命令合併分支程式碼

對於複雜的系統,我們可能要開好幾個分支來開發,那麼怎樣使用git合併分支呢? 合併步驟:1、進入要合併的分支(如開發分支合併到master,則進入master目錄)git checkout mastergit pull 2、檢視所有分支是否都pull下來了git branch -a 3、使用m

git rebase總結git使用規範

一、git規範   場景一:如果程式碼commit到本地庫了,但是commit之前忘記pull了,遠端程式碼也已更新,此時不能使用pull直接拉取遠端程式碼(分支會產生merge的記錄):     解決方法:commit之後,使用git fetch,拉取遠端程式碼到快取區,然後使用git reb