分享幾個 git 的使用場景

你真的會使用 git 嗎?你能回答下面幾個問題嗎?
有三個commit(順序:CommitA、CommitB、CommitC),它們相互獨立,沒有依賴。git

  1. 在不修改B、C的前提下,修改A,怎麼操做?
  2. 合併A、B、C爲一個commit,怎麼操做?
  3. 調整A、B、C的順序編程 C、B、A,怎麼操做?

做爲一個開發,平常工做中不可避免的要使用 git。
固然了,若是你技術無敵、獨立承擔一個項目、沒人干預或者影響你的工做,那麼你可能不須要下面這些總結。哈哈哈...編程

因爲 xxx 緣由,我認爲應該給項目組的其餘人講講 git。
由於語言障礙和技術熟練度的障礙,爲了讓同事們更好地理解而且願意使用 git 。我不得不一個場景一個方法地講解,因此有了下面總結。安全

這難道不是一種成長嗎?網絡

場景1

J 寫了一個功能,分紅3次commit(順序:CommitA、CommitB、CommitC)。完成功能以後,他找了B先生進行Code Review,B先生以爲 CommitB 和 CommitC 沒有問題,CommitA須要進行簡單修改。
那麼如何在不改變CommitB和CommitC的前提下,修改CommitA呢?code

方法:

使用 git rebase -i,操做以下blog

  1. rebase CommitA、CommitB、CommitC 三個commit
$ git rebase -i <parent commit of A>
  1. 修改 CommitA
    (1)Commit A前面pick修改成edit,而後:wq保存退出。

(2)這是HEAD停留在CommitA,能夠對CommitA進行修改,而後使用下面命令覆蓋CommitA教程

$ git add <修改文件>
$ git commit -amend
  1. 讓git完成後續rebase操做
$ git rebase -continue

場景2

J修改了CommitA後,項目leader但願一個功能儘量使用一個commit提交。
那麼如何合併CommitA、CommitB、CommitC爲一個commit呢?開發

方法:

一樣使用 git rebase -i,操做以下get

  1. rebase CommitA、CommitB、CommitC 三個commit
$ git rebase -i <parent commit of A>
  1. 合併 Commits
    (1)CommitB和CommitC前面pick修改成squash,而後:wq保存退出。

(2)這時,咱們會須要從新編輯 commit message,統合3條commit的信息。而後:wq保存退出。it

  1. 讓git完成後續rebase操做
$ git rebase -continue

場景3

J 合併CommitA、CommitB、CommitC後,新產生的CommitA+須要將代碼更新到master上。可是,同一項目組的T已經提交了CommitD。
原本 J 只須要merge本身的CommitA+到master就能夠了,可是 J 下一個任務依賴於 T 提交的CommitD。
J 但願一次性更新master和本身的branch(branch_J_dev),一石二鳥。
那麼如何在merge本身的CommitA+到master的同時將CommitD也merge到本身的branch(branch_J_dev)中呢?

方法:

又是使用 git rebase,操做以下

  1. rebase 本身的branch_J_dev 到 master
$ git checkout branch_J_dev
$ git rebase --onto master <CommitA+>
  1. master 合併 branch_J_dev 的提交
$ git checkout master
$ git merge branch_J_dev

git checkout mastergit merge branch_J_dev 很是重要,網絡上大部分教程都沒有最後一步。
並且好多人都把命令寫成了git rebase --ontomaster <commit id>全是抄襲同一我的的,也是醉了。哈哈哈哈...
我也是由於被坑了,因此才查了一下一下資料,發現居然還須要一步。

場景4(需求基本和場景3一致)

如何 J 本次但願提交的代碼有CommitA+、CommitB+、CommitC+三次commit(順序:CommitA+、CommitB+、CommitC+)。
那麼如何在merge本身的CommitA+、CommitB+、CommitC+到master的同時將CommitD也merge到本身的branch(branch_J_dev)中呢?

方法:

基本和場景3一致,操做以下

  1. rebase 本身的branch_J_dev 到 master
$ git checkout branch_J_dev
$ git rebase --onto master <CommitA+>^
  1. CommitA 合併進master
$ git checkout master
$ git merge branch_J_dev

^表明,起點。<CommitA+>^表示CommitA爲起點後面全部的Commit。

場景5

如何修改 commit 記錄(調整順序+修改message)?
其實這種操做沒什麼意義,可是對於對 commit log 有強迫症的人,或許有想修改 commit 記錄的衝動。
哈哈哈哈...

方法:

仍是使用 git rebase。驚喜不驚喜?意外不意外?操做以下

  1. rebase CommitD和CommitA+
$ git rebase -i <parent commit of D>
  1. 調整 commit 順序,就是將 CommitD 和 CommitA+ 順序進行調整。
  2. 修改 message ,將 pick 修改成reword
  3. 讓git完成後續rebase操做
$ git rebase --continue

(最後)小提示

  1. 若是想中途取消rebase操做,後悔藥👇
$ git rebase --abort
  1. git rebase 一旦結束,將丟失本來branch信息,很是危險。
    我在作分享時,git rebase --onto就出現了失誤而且沒能找回原來branch信息,場面十分尷尬。
    因此建議仍是用 merge 吧,安全一點。
$ git checkout master
$ git pull
$ git merge branch_J_dev

但願這篇文章對你有幫助。by iamtjcn
首發於:http://blog.iamtjcn.com/

相關文章
相關標籤/搜索