分享幾個 git 的使用場景


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

  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呢?

方法:

使用 git rebase -i,操作如下

  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,操作如下

  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保存退出。
3. 讓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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM