git 命令之git rebase 用法&git rebase介紹
From:http://blog.csdn.net/wangjia55/article/details/8776409
1.出現情況的背景:
當你提交的程式碼後,管理員發現,您的程式碼不能提交到伺服器上,主要原因在於,你的commit 中和伺服器中的有些commit不再同一時間軸上,即:你的有些commit要插入到伺服器中的某些commit之間,這樣就會造成程式碼的衝突。所以這個時候就要使用Git rebase。
假如,你平時使用的分支叫 new ,然後在這個分支上你剛提交過幾個commit。
做法:
1.新建一個分支,並且程式碼和伺服器中程式碼同步
git checkout origin/v2.0 -b temp
2.為了保證新建的temp分支程式碼是最新的,可以多執行下面一步
git pull
3.當你新建分支後,系統會自動checkout到temp分支上,此時
git checkout new
4.合併程式碼,並整理
git rebase temp //會將temp分支的程式碼合併過來,並按照提交的順序排序
5. 因為順序是重新整理的,所以肯定會出現衝突
6.解決衝突,最後 git add * ,但不許要git commit
7.解決後,執行 git rebase --continue
8.重新提交程式碼: git push for-*
注意:如果要對某些程式碼的commit重新整理
1. 可以記住某個commit號
2. git rebase -i commit號
3. 會顯示一個整理提交的介面,有很多引數,e。p。等等
4.將前面的引數改為e。則wq儲存後,系統會自動讓你重新修改commit內容
5.修改完成後,再git push for-*
==========================================================================
git rebase小計(轉)
FROM:http://www.cnblogs.com/kym/archive/2010/08/12/1797937.html
PS:有的內容已修改
git rebase,顧名思義,就是重新定義(re)起點(base)的作用,即重新定義分支的版本庫狀態。要搞清楚這個東西,要先看看版本庫狀態切換的兩種情況:
- 我們知道,在某個分支上,我們可以通過git reset,實現將當前分支切換到本分支以前的任何一個版本狀態,即所謂的“回溯”。即實現了本分支的“後悔藥”。也即版本控制系統的初衷。
- 還有另一種情況,當我們的專案有多個分支的時候。我們除了在本地開發的時候可能會“回溯”外,也常常會將和自己並行開發的別人的分支修改新增到自 己本地來。這種情況下很常見。作為專案管理員,肯定會不斷的合併各個子專案的補丁,並將最新版本推送到公共版本庫,而作為開發人員之一,提交自己的補丁之 後,往往需要將自己的工作更新到最新的版本庫,也就是說把別的分支的工作包含進來。
舉個例子來說吧!假設我們的專案初期只有一個master分支,然後分支上作過兩次提交。這個時候系統只有一個master分支,他的分支歷史如下:
master0(初始化後的版本)
||
v
master1(第一次提交後的版本)
||
v
master2(第二次提交後的版本)
這個時候,我們可以通過git reset將master分支(工作目錄、工作快取或者是版本庫)切換到master1或者master0版本,這就是前面所說的第一種情況。
假設我們這裡把master分支通過git reset回溯到了master1狀態。那麼這個時候系統仍然只有一個master分支,分支的歷史如下:
master0(初始化後的版本)
||
v
master1(第一次提交後的版本)
然後,我們在這裡以master1為起點,建立了另一個分支test。那麼對於test分支來說,他的第一個版本test0就和master1是同一個版本,此時專案的分支歷史如下:
master0(初始化後的版本)
||
v
master1(第一次提交後的版本)===test0(test分支,初始化自master分支master1狀態)
這個時候,我們分別對master分支、test分支作兩次提交,此時版本庫應該成了這個樣子:
master0(初始化後的版本)
||
v
master1===test0==>test1===>test2
||
v
master2===>master3
- 這個時候,通過第一種git reset的方式,可以將master分支的當前狀態(master3)回溯到master分支的master0、master1、master2狀態。 也可已將test分支當前狀態(test2)回溯到test分支的test0、test1狀態,以及test分支的父分支master的master0、 master1狀態。
- 那麼。如果我要讓test分支從test0到test2之間所有的改變都新增到master分支來,使得master分支包含test分支的所有修改。這個時候就要用到git rebase了。
首先,我們切換到master分支,然後執行下面的命令,即可實現我們的要求:
1
|
git rebase test
|
這個時候,git做了些什麼呢?
- 先將test分支的程式碼checkout出來,作為工作目錄
- 然後將master分支從test分支建立起的所有改變的補丁,依次打上。如果打補丁的過程沒問題,rebase就搞定了
- 如果打補丁的時候出現了問題,就會提示你處理衝突。處理好了,可以執行git rebase –continue繼續直到完成
- 如果你不想處理,你還是有兩個選擇,一個是放棄rebase過程(執行git rebase –abort),另一個是直接用test分支的取代當前分支的(git rebase –skip)。
此外,rebase還能夠讓你修訂以前提交,這個功能日後再說。
應該改為
git rebase master test
等價於
首先我們切換到test分支,再執行rebase
git checkout test
git rebase master
這個時候,git做了些什麼呢?
- 先將test分支的程式碼checkout出來,作為工作目錄
- 然後將master分支從test分支建立起的所有改變的補丁,依次打上。如果打補丁的過程沒問題,rebase就搞定了
- 如果打補丁的時候出現了問題,就會提示你處理衝突。處理好了,可以執行git rebase –continue繼續直到完成
- 如果你不想處理,你還是有兩個選擇,一個是放棄rebase過程(執行git rebase –abort),另一個是直接用test分支的取代當前分支的(git rebase –skip)。
此外,rebase還能夠讓你修訂以前提交,這個功能日後再說。
註釋:在master分支上進行rebase一般來說應該是不對的。
master分支預設是公共分支,當有多人協同時,master分支在多個地方都有副本。
如果在master分支上執行git rebase test,會把master分支的提交歷史進行修改,可以使用git log仔細觀察rebase前後,master分支上的commit hash id。
一旦修改了master的commit hash id,而如果其他人已經基於之前的commit物件做了工作,那麼當他拉取master的新的物件時,會需要在合併一次,這樣反覆下去,會把master分支搞得一團亂。
所以你的示例中master分支到提交物件master2、master3,如果已經推送到遠端,並有其他人基於master3物件進行了工作,那麼後面的結果將會變得非常的亂。
rebase的含義是把當前分支的提交物件在目標分支上重做一遍,並生成了新的提交物件。
所以如果在master分支上需要對test分支進行rebase,你需要的命令是
1
|
git
rebase master test |
這條命令等價於兩條命令的合集
1
2
|
git
checkout test git
rebase master |
永遠不要在已經發布到公共倉庫的提交物件上做rebase操作,而master分支預設就是公共倉庫。
相關文章
- Git基礎命令之git rebase命令Git
- Git——rebase命令Git
- git rebase命令Git
- git學習之git rebaseGit
- 【Git】rebase 用法小結Git
- [Git]rebaseGit
- Git -- RebaseGit
- git rebaseGit
- git reset rebase 用法總結Git
- git merge & git rebaseGit
- Git 操作之rebase、squashGit
- git rebase masterGitAST
- git rebase 流程Git
- git rebase -iGit
- git rebase簡介(基本篇)Git
- git rebase 和 git mergeGit
- [Git] Git整理(四) git rebase 的使用Git
- git rebase --onto 的奇妙用法Git
- git rebase的使用Git
- 如何理解git rebase?Git
- git revert .vs. git reset .vs. git rebaseGit
- Git rebase 與 Git merge 的使用Git
- git rebase vs git merge詳解Git
- git merge 和 git rebase 小結Git
- Git教程十九:分支管理之RebaseGit
- git rebase --onto詳解Git
- git rebase 使用詳解Git
- git merge 與 git rebase的區別Git
- 淺談git rebase和git checkout –ours(theirs)Git
- git-rebase進階使用Git
- 徹底搞懂 Git-RebaseGit
- 撤銷rebase與git原理Git
- git分支合併與rebaseGit
- 學會使用 git-rebaseGit
- git rebase(變基)—— Git 學習筆記 19Git筆記
- 詳解git rebase,讓你走上git大神之路Git
- 圖解 Git 基本命令 merge 和 rebase圖解Git
- 使用 git rebase 提高 PR 質量Git