你真的會使用 git 嗎?你能回答下面幾個問題嗎?
有三個commit(順序:CommitA、CommitB、CommitC),它們相互獨立,沒有依賴。git
做爲一個開發,平常工做中不可避免的要使用 git。
固然了,若是你技術無敵、獨立承擔一個項目、沒人干預或者影響你的工做,那麼你可能不須要下面這些總結。哈哈哈...編程
因爲 xxx 緣由,我認爲應該給項目組的其餘人講講 git。
由於語言障礙和技術熟練度的障礙,爲了讓同事們更好地理解而且願意使用 git 。我不得不一個場景一個方法地講解,因此有了下面總結。安全
這難道不是一種成長嗎?網絡
J 寫了一個功能,分紅3次commit(順序:CommitA、CommitB、CommitC)。完成功能以後,他找了B先生進行Code Review,B先生以爲 CommitB 和 CommitC 沒有問題,CommitA須要進行簡單修改。
那麼如何在不改變CommitB和CommitC的前提下,修改CommitA呢?code
使用 git rebase -i,操做以下blog
$ git rebase -i <parent commit of A>
edit
,而後:wq
保存退出。(2)這是HEAD停留在CommitA,能夠對CommitA進行修改,而後使用下面命令覆蓋CommitA教程
$ git add <修改文件> $ git commit -amend
$ git rebase -continue
J修改了CommitA後,項目leader但願一個功能儘量使用一個commit提交。
那麼如何合併CommitA、CommitB、CommitC爲一個commit呢?開發
一樣使用 git rebase -i,操做以下get
$ git rebase -i <parent commit of A>
squash
,而後:wq
保存退出。(2)這時,咱們會須要從新編輯 commit message,統合3條commit的信息。而後:wq
保存退出。it
$ git rebase -continue
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,操做以下
branch_J_dev
到 master$ git checkout branch_J_dev $ git rebase --onto master <CommitA+>
master
合併 branch_J_dev 的提交$ git checkout master $ git merge branch_J_dev
git checkout master
和git merge branch_J_dev
很是重要,網絡上大部分教程都沒有最後一步。
並且好多人都把命令寫成了git rebase --ontomaster <commit id>
全是抄襲同一我的的,也是醉了。哈哈哈哈...
我也是由於被坑了,因此才查了一下一下資料,發現居然還須要一步。
如何 J 本次但願提交的代碼有CommitA+、CommitB+、CommitC+三次commit(順序:CommitA+、CommitB+、CommitC+)。
那麼如何在merge本身的CommitA+、CommitB+、CommitC+到master的同時將CommitD也merge到本身的branch(branch_J_dev)中呢?
基本和場景3一致,操做以下
branch_J_dev
到 master$ git checkout branch_J_dev $ git rebase --onto master <CommitA+>^
master
$ git checkout master $ git merge branch_J_dev
^
表明,起點。<CommitA+>^
表示CommitA爲起點後面全部的Commit。
如何修改 commit 記錄(調整順序+修改message)?
其實這種操做沒什麼意義,可是對於對 commit log 有強迫症的人,或許有想修改 commit 記錄的衝動。
哈哈哈哈...
仍是使用 git rebase。驚喜不驚喜?意外不意外?操做以下
$ git rebase -i <parent commit of D>
reword
。$ git rebase --continue
$ git rebase --abort
git rebase --onto
就出現了失誤而且沒能找回原來branch信息,場面十分尷尬。$ git checkout master $ git pull $ git merge branch_J_dev
但願這篇文章對你有幫助。by iamtjcn
首發於:http://blog.iamtjcn.com/