1. 程式人生 > >git 命令之git rebase 最詳細用法 .

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

git rebase 命令的功能很強大, 在《git 權威指南》一書裡,改變提交(commit)的順序,書中教了一種很複雜的方法,運用了git reset ... git cherry-pick...等等命令。

但如果用git rebase 命令,則一下就搞定。

以下面的例子來講解一下git rebase 的其中一個用法,

************************************* 改變提交(commit) 的順序 ****************************************

git log一下檢視commit log:

現有:

commit A  hello    (這裡用字母ABCDE代替了那串很長的Hash code)

commit B  hi

commit C  how are you

commit D  i am fine

commit E  bye

現在想將D換到B之前,即 A, D, B, C, E,

我們可以用 git rebase -i [commit號] 命令,  因為現在要改變D的位置, 所以我們要rebase到commit E那裡, 具體命令為:

git rebase -i E

按回車後會出現下面的文字

  pick A hello
  pick B  hi
  pick C  how are you
  pick D  i am fine

  pick E  bye
 
  # Rebase 23350be..92c4c19 onto 23350be   (以下部分可能會根據情況不一樣而不同)
   #
   # 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
  #
  # If you remove a line here THAT COMMIT WILL BE LOST.
  # However, if you remove everything, the rebase will be aborted.
  #

要將D弄到B前面,只需將上面的pick語句的位置換一下,換成如下

  pick A hello

  pick D  i am fine
  pick B  hi
  pick C  how are you
  pick E  bye

然後儲存退出,如果你確定位置置換了之後不會發生衝突,就會出現以下字樣表示成功了

successfully rebased and updated refs/heads/[你的branch名].

你再git log一下,看看現在的順序為

commit A  hello 

commit D  i am fine

commit B  hi

commit C  how are you

commit E  bye

當然, 你可以用此方法置換成任何你想要的順序,但你得先確定,換位後不會發生衝突。如果有衝突,是不會出現successfully的字樣的。

以下再說另一種git rebase的用法

**************** 修改提交(非置頂的提交)內容(包括標題,作者,程式碼等)並更新提交 ************

現有

commit A hello

commit B hi

commit C how are u

commit D bye

我想修改commit C的程式碼 和標題,但我又不想用git reset 命令這麼麻煩,

這裡也可以用git rebase -i [commit號] 命令

具體為:

git rebase -i D ,       因為我要修改C,所以我要rebase 到C的前一個commit,即D。

按回車後仍然會看到像上面一樣的文字

  pick A hello
  pick B  hi
  pick C  how are you
  pick D  bye

 
  # Rebase 23350be..92c4c19 onto 23350be   (以下部分可能會根據情況不一樣而不同)
   #
   # 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
  #
  # If you remove a line here THAT COMMIT WILL BE LOST.
  # However, if you remove everything, the rebase will be aborted.
  #


這裡將C 前面的pick 改為edit ,即

  pick A hello
  pick B  hi
  edit C  how are you
  pick D  bye

然後儲存退出,就會出現以下字樣:

You can amend the commit now, with


        git commit --amend


Once you are satisfied with your changes, run


        git rebase --continue

現在你想修改什麼內容? 

如果你想修改commit 的標題, 備註, 作者簽名等資訊,請用

git commit --amend 命 令

例如,我要將commit C的標題 改為 Hello, I m Alvin Lee. 用上述命令修改完之後保退出去,

然後再用git rebase --continue使你的修改生效。

如果你發現commit C程式碼有bug,想修改那個bug,例如driver/alvin.c 裡有個bug, 則直接開啟該檔案:

int main(void)

{

prinntk("Hello I am Alvin Lee!\n")

return 1;

}

將錯誤處修改:

printk("Hello I am Alvin Lee!\n");

儲存退出。 用git add 命令將你的修改新增到暫存區(index),

再用git rebase --continue命令使你的修改生效,

如果沒有衝突, 則一切OK!

現在用git log -p [commit號] 命令看一下,

int main(void)

{

printk("Hello I am Alvin Lee!\n");

return 1;

}

錯誤被修改過來了!

******************************************* 更多用法, 且聽下回分解 ***************************************************


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-*

==============================

rebase

假設你現在基於遠端分支"origin",建立一個叫"mywork"的分支。

$ git checkout -b mywork origin

現在我們在這個分支做一些修改,然後生成兩個提交(commit).

$ vi file.txt
$ git commit
$ vi otherfile.txt
$ git commit
...

但是與此同時,有些人也在"origin"分支上做了一些修改並且做了提交了. 這就意味著"origin"和"mywork"這兩個分支各自"前進"了,它們之間"分叉"了。

在這裡,你可以用"pull"命令把"origin"分支上的修改拉下來並且和你的修改合併;結果看起來就像一個新的"合併的提交"(merge commit):

但是,如果你想讓"mywork"分支歷史看起來像沒有經過任何合併一樣,你也許可以用 git rebase:

$ git checkout mywork
$ git rebase origin

這些命令會把你的"mywork"分支裡的每個提交(commit)取消掉,並且把它們臨時儲存為補丁(patch)(這些補丁放到".git/rebase"目錄中),然後把"mywork"分支更新到最新的"origin"分支,最後把儲存的這些補丁應用到"mywork"分支上。

當'mywork'分支更新之後,它會指向這些新建立的提交(commit),而那些老的提交會被丟棄。如果執行垃圾收集命令(pruning garbage collection), 這些被丟棄的提交就會刪除. (請檢視git gc)

現在我們可以看一下用合併(merge)和用rebase所產生的歷史的區別:

在rebase的過程中,也許會出現衝突(conflict). 在這種情況,Git會停止rebase並會讓你去解決衝突;在解決完衝突後,用"git-add"命令去更新這些內容的索引(index), 然後,你無需執行 git-commit,只要執行:

$ git rebase --continue

這樣git會繼續應用(apply)餘下的補丁。

在任何時候,你可以用--abort引數來終止rebase的行動,並且"mywork" 分支會回到rebase開始前的狀態。

$ git rebase --abort

相關推薦

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 命令git rebase 用法

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

git命令git clone用法

轉:http://blog.csdn.net/wangjia55/article/details/8818845 在使用git來進行版本控制時,為了得一個專案的拷貝(copy),我們需要知道這個專案倉庫的地址(Git URL). Git能在許多協議下使用,所以Git U

git命令git stash 暫存臨時代碼

命令 tar 時代 代碼 但是 緊急 tails con net git stash — 暫存臨時代碼 stash命令可以很好的解決這樣的問題。當你不想提交當前完成了一半的代碼,但是卻不得不修改一個緊急Bug,那麽使用’Git stash’就可以將你當前未提交到本地(

git命令git tag 給當前分支打標簽

cos 重新 gin 其他人 1.7 -m mit cal file git命令之git tag 給當前分支打標簽 標簽可以針對某一時間點的版本做標記,常用於版本發布。 列出標簽 $ git tag # 在控制臺打印出當前倉庫的所有標簽 $ git tag -l ‘

git命令git gitignore 忽略某些檔案

專案中經常會生成一些Git系統不需要追蹤(track)的檔案。典型的是在編譯生成過程中 產生的檔案或是程式設計器生成的臨時備份檔案。當然,你不追蹤(track)這些檔案,可以 平時不用"git add"去把它們加到索引中。 但是這樣會很快變成一件煩人的事,你發現 專案中到

git使用教程(附有“詳細、易懂的git使用教程”連結)

筆者剛使用git不久,本文用來主要記錄使用git過程中遇到的問題及一些常用命令 git使用教程(超詳細,易上手)[link](https://mp.weixin.qq.com/s?__biz=MzIwMTY0NDU3Nw==&mid=2651936846&idx=1&am

Git命令log日誌

目錄 功能 格式化輸出 功能 在提交了若干更新之後,又或者克隆了某個專案,想回顧下提交歷史,可以使用 git log 命令檢視。 檢視所有日誌 git log git log 有許多選項可供特殊篩選 $ git log -p

git教程git命令總結

一. 分支操作 列出本地所有分支 git branch 退不出命令?單擊Q鍵 列出所有遠端分支 git branch -r 列出所有分支,包括遠端和本地所有分支 git

git操作git rebase

git rebase可以簡單的理解為調整commit資訊,包括合併commit資訊到master(與merge類似,但是效果不同)以及刪除commit資訊或者修改log資訊等,下面分別介紹幾種git rebase常用的場景。 合併commit資訊到mast

git常用命令git push使用說明

詳細的命令使用說明,請參考點選開啟連結 git push命令用於將本地分支的更新,推送到遠端主機。它的格式與git pull命令相仿。 $ git push <遠端主機名> <本地分支名>:<遠端分支名> 注意,分支推送順序的寫

git命令git-rebase

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

Linux實用命令git-svn

本地 幫助文檔 需要 code sta 同學 操作 開發 一個 近日發現了有一個工具,git-svn,可以打通git svn之間的鴻溝。 很適合習慣於git,卻需要維護svn代碼的同學。 安裝 sudo apt-get install git-svn 具體使用就不多寫了,可

大數據---Hive全網詳細的編譯tar及部署終極篇

大數據 Hive 1、軟件環境RHEL6角色jdkhadoop-2.8.1.tar.gz apache-maven-3.3.9 mysql-5.1xx.xx.xx.xx ip地址NNhadoop01xx.xx.xx.xx ip地址DNhadoop02xx.xx.xx.xx ip地址DNhadoop0

Git學習Git模型

1 Git簡介 Git 是一個分散式版本控制工具(便於程式碼儲存,追蹤程式碼的修改和程式碼回退),它的作者開發了Linux的 Linus Torvalds ,git目前在版本管理中應用十分普遍,本篇文章來自https://nvie.com/posts/a-successful-git

Hadoop學習shuffle過程詳細講解

hadoop1.x和hadoop2.x的區別: Hadoop1.x版本: 核心主要由Hdfs和Mapreduce兩個系統組成,其中Mapreduce是一個離線分散式計算框架,由一個JobTracker和多個TaskTracker組成。 JobTracker的主要作用:JobTracker

git 學習git 起步(一)

起步 本章介紹開始使用 Git 前的相關知識。我們會先了解一些版本控制工具的歷史背景,然後試著讓 Git 在你的系統上跑起來,直到最後配置好,可以正常開始開發工作。讀完本章,你就會明白為什麼 Git 會如此流行,為什麼你應該立即開始使用它。 關於版本控制 什麼是版本控制?我為什麼要關心它呢?版本控制是一

Git 學習git 分支(三)

別名 直觀 字符 正常 有關 rdquo automatic lease ive Git 分支 幾乎每一種版本控制系統都以某種形式支持分支。使用分支意味著你可以從開發主線上分離開來,然後在不影響主線的同時繼續工作。在很多版本控制系統中,這是個昂貴的過程,常常需要創建一個源

git衝突git pull時,同一個檔案,遠端倉庫裡已經修改了,不幸的是你在本地倉庫也修改了

0、git pull,爆出一個錯誤,pull failed Your local changes would be overwritten by merge. Commit, stash or revert them to proceed. 你本地修改的將會被合併覆蓋。要麼提交、要麼儲存