Git rebase用法小結

2021-10-09 09:44:10 字數 1923 閱讀 5402

rebase在git中是乙個非常有魅力的命令,使用得當會極大提高自己的工作效率;相反,如果亂用,會給團隊中其他人帶來麻煩。它的作用簡要概括為:可以對某一段線性提交歷史進行編輯、刪除、複製、貼上;因此,合理使用rebase命令可以使我們的提交歷史乾淨、簡潔!(特別適用於gerrit鉤子丟失導致push失敗的合併提交)

前提:不要通過rebase對任何已經提交到公共倉庫中的commit進行修改(你自己乙個人玩的分支除外)

當我們在本地倉庫中提交了多次,在我們把本地提交push到公共倉庫中之前,為了讓提交記錄更簡潔明瞭,我們希望把如下分支b、c、d三個提交記錄合併為乙個完整的提交,然後再push到公共倉庫。

現在我們在測試分支上新增了四次提交,我們的目標是把最後三個提交合併為乙個提交:

這裡我們使用命令:

git rebase -i [startpoint] [endpoint]
其中-i的意思是--interactive,即彈出互動式的介面讓使用者編輯完成合併操作,[startpoint] [endpoint]則指定了乙個編輯區間(前開後閉),如果不指定[endpoint],則該區間的終點預設是當前分支head所指向的commit。

在檢視到了log日誌後,我們執行以下命令:

git rebase -i 36224db
或:

git rebase -i head~3
然後我們會看到如下介面:

上面未被注釋的部分列出的是我們本次rebase操作包含的所有提交,下面注釋部分是git為我們提供的命令說明。每乙個commit id 前面的pick表示指令型別,git為我們提供了以下幾個命令:

根據我們的需求,我們將commit內容編輯如下:

然後是注釋修改介面:

當我們專案中存在多個分支,有時候我們需要將某乙個分支中的一段提交同時應用到其他分支中,就像下圖:

我們希望將develop分支中的c~e部分複製到master分支中,這時我們就可以通過rebase命令來實現(如果只是複製某一兩個提交到其他分支,建議使用更簡單的命令:git cherry-pick)。

在實際模擬中,我們建立了master和develop兩個分支:

master分支:

develop分支:

我們使用命令的形式為:

git rebase [startpoint] [endpoint] --onto [branchname]
其中,[startpoint] [endpoint]仍然和上乙個命令一樣指定了乙個編輯區間(前開後閉),--onto的意思是要將該指定的提交複製到哪個分支上,所以,在找到c(90bc0045b)和e(5de0da9f2)的提交id後,我們執行以下命令:

git rebase 90bc0045b^ 5de0da9f2 --onto master
注:因為[startpoint] [endpoint]指定的是乙個前開後閉的區間,為了讓這個區間包含c提交,我們將區間起始點向後退了一步。

執行完成後檢視當前分支的日誌:

可以看到,c~e部分的提交內容已經複製到了g的後面了,大功告成?no!我們看一下當前分支的狀態:

當前head處於游離狀態,實際上,此時所有分支的狀態應該是這樣:

所以,雖然此時head所指向的內容正是我們所需要的,但是master分支是沒有任何變化的,git只是將c~e部分的提交內容複製乙份貼上到了master所指向的提交後面,我們需要做的就是將master所指向的提交id設定為當前head所指向的提交id就可以了,即:

git checkout master

git reset --hard 0c72e64

此時我們才大功告成!

git rebase命令用法

命令 git rebase i interactive exec onto git rebase i interactive exec onto root git rebase continue skip abort quit edit todo show current patch 場景 有一條 ...

git 命令之git rebase 用法

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

git 命令之git rebase 最詳細用法

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