1. 程式人生 > >【Git入門之十】Rebase操作

【Git入門之十】Rebase操作

Rebase,衍合?變基?唉,我也不知道要怎麼翻譯合適。。。變基怪怪的,我擦勒,你才變基呢。。。

1.Rebase提交

rebase命令允許你編輯你的提交歷史,比如你可以把多個提交(commit)聯合成一個,可以對它重新排序,跳掉某個提交或者編輯提交資訊。這是非常有用的,當你要再推送到遠端倉庫之前要想重新編輯提交資訊。以下舉個例子把多個提交聯合成一個。

  1. #做一些無聊的修改和提交
  2. $ echo "test_rebase1" > jackydata01  
  3. $ git commit -a -m "test_rebase1"
  4. [master 128a2f5] test_rebase1  
  5.  1 file changed, 1 insertion(+), 1 deletion(-)  
  6. $ echo "test_rebase2" > jackydata01  
  7. $ git commit -a -m "test_rebase2"
  8. [master 5ae88f5] test_rebase2  
  9.  1 file changed, 1 insertion(+), 1 deletion(-)  
  10. $ echo "test_rebase3" > jackydata01  
  11. $ git commit -a -m "test_rebase3"
  12. [master 37be873] test_rebase3  
  13.  1 file changed, 1 insertion(+), 1 deletion(-)  
  14. $ echo "test_rebase4" > jackydata01  
  15. $ git commit -a -m "test_rebase4"
  16. [master 7dff3e4] test_rebase4  
  17.  1 file changed, 1 insertion(+), 1 deletion(-)  
  18. $ echo "test_rebase5" > jackydata01  
  19. $ git commit -a -m "test_rebase5"
  20. [master 897fa79] test_rebase5  
  21.  1 file changed, 1 insertion(+), 1 deletion(-)  
看一下log。
  1. $ git log --pretty=oneline  
  2. 897fa79def2cf256b7f14d0ec0fcb67e8f61a814 test_rebase5  
  3. 7dff3e4ad7416f0370b4579393a0c8a8fc02efbd test_rebase4  
  4. 37be873b514afd9d8f6536cd893eadc3e32b4966 test_rebase3  
  5. 5ae88f5a0454066d820f6c1687b6d01f59f39dbd test_rebase2  
  6. 128a2f5cdb325bcbdb26b35741fad2a2fba49832 test_rebase1  
  7. ...還有很多  
利用《git rebase》把最後5個(如上)提交聯合為1個。
  1. git rebase -i HEAD~5  
這個時候會開啟Vim,這款神器我就不多說了,愛的多,恨的也不少,在Ubuntu上用過,自己不熟練所以感覺效率不高。Vim的常用命令自己google吧。


2.Rebase分支

對多個分支進行rebase操作,rebase命令為一個分支的更改生成一個補丁,然後把這個補丁應用到另外一個分支上,那麼最後的原始碼和merge是一樣的,使用這種方式進行分支的合併更為合理。
  1. #建立並跳轉到分支br
  2. $ git branch br  
  3. $ git checkout br  
  4. Switched to branch 'br'
  5. #修改br分支中的Jackydata01
  6. $ echo "this wiil be rebase to master" >jackydata01  
  7. #提交br分支中的修改
  8. $ git  commit -a -m "rebase to master"
  9. [br 5c2a431] rebase to master  
  10.  1 file changed, 1 insertion(+), 1 deletion(-)  
  11. #跳轉到master分支
  12. $ git checkout master  
  13. Switched to branch 'master'
  14. Your branch is ahead of 'origin/master' by 1 commit.  
  15.   (use "git push" to publish your local commits)  
  16. #使用rebase把br的改變應用到master
  17. $ git rebase br  
  18. First, rewinding head to replay your work on top of it...  
  19. Fast-forwarded master to br.  
  20. #顯示master中jackydata01的內容
  21. $ cat jackydata01  
  22. this wiil be rebase to master