git rebase: 合併/擷取commit及分支間的commit拼接
git rebase: 合併/擷取commit 及 分支間的commit拼接
一. 只涉及單獨分支的操作
1. 合併commit
當前分支狀態:
A--------B-------C--------D
|--想要合併的commit--|
預計合併之後的狀態:
A--------B'(包含C, D)
使用命令:
git rebase -i [start] [end]
start
和end
遵循左開右閉原則
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. 當前狀態:
2. 輸入命令:
git rebase -i 869af45 9728be5
869af45
和9728be5
為hashID
的簡寫形式,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
#
~
~
表明這三段commit
的message
將合併。如果要更改資訊,可以在這裡修改,不修改的話可以直接進行儲存操作。這裡我們直接儲存,然後git
會做如下提示 :
我們發現操作成功了,但是當前的head
還處於遊離狀態,此時我們處於一個7fc1b94
的臨時分支上,所以,接下來,將分支切換到之前的分支, 輸入命令git reset --hard 7fc1b94
:
此時用git log
檢視,會發現commit
已經如我們所願地合併了。
2. 刪除某段commit
當前分支狀態:
A--------B-------C--------D-------E--------F
|--想要刪除的commit--|
預計刪除之後的狀態:
A--------D'-------E'--------F'
示例:
還是用之前的示例:
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
d
即drop
, 棄用本行的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--|
示例:
仍然用之前的例子
則執行命令如下:
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
為遊離態,則還是用老方法處理。操作成功後,我們可以看到:
二. 涉及多個分支間的操作
以下只提及操作命令,就不一一示例操作了(才不是因為我偷懶)
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 rebase與git 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