這纔是真正的Git——Git實用技巧詳解

本篇是這個系列的最後一篇文章,以前的文章主要講的是基礎原理部分(見上方專輯),在理解原理的基礎上,介紹一些實用的技巧給你們,但願能提升你們的開發效率。git

這篇文章由於更多的是列舉實際應用的技巧,因此文章結構會顯得散亂一些,也不會像前兩篇文章那樣要求你們順序閱讀。每一個點都是互相獨立的,你們能夠根據本身的須要學習。shell

在這篇文章裏我會使用操做錄屏的方式來介紹例子,但願這種方式可讓你更直觀的瞭解命令的使用方法。vim

將幾個commit壓縮成一個

這纔是真正的Git——Git實用技巧詳解

這裏有一點要特別注意的是:rebase會致使新的commit節點產生,因此切記不要對多人共用的遠端分支進行rebase。ide

rebase -i 是個很實用且應用普遍的工具,但願你們都學會它的使用。它還能夠用來修改commit信息,拋棄某些commit,對commit進行排序等等。具體命令以下,操做方式跟動圖一致,都是在vim裏面進行編輯。這裏不展開,感興趣的同窗能夠本身操做一下。工具

 
 
  1. # Commands: 學習

  2. # p, pick <commit> = use commit 開發工具

  3. # r, reword <commit> = use commit, but edit the commit message 測試

  4. # e, edit <commit> = use commit, but stop for amending this

  5. # s, squash <commit> = use commit, but meld into previous commit spa

  6. # f, fixup <commit> = like "squash", but discard this commit's log message 

  7. # x, exec <command> = run command (the rest of the line) using shell 

  8. # d, drop <commit> = remove commit 

  9. # l, label <label> = label current HEAD with a name 

  10. # t, reset <label> = reset HEAD to a label 

  11. # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>] 

  12. # .       create a merge commit using the original merge commit's 

  13. # .       message (or the oneline, if no original merge commit was 

  14. # .       specified). Use -c <commit> to reword the commit message. 

另外若是要合併的是最近的幾個commit,咱們還能夠用git reset --soft HEAD~3 && git commit -m 'xxx'來實現。對這個有問題的同窗能夠參照Git內部原理強調的可視化方法思考一下。

找回丟失的commit節點或分支

像上一步rebase後發現不符合預期,如何恢復?不當心刪除了一個分支,如何找回?

「學會這個技能,你的同事會請你喝奶茶的,並且說不定還能收穫妹子。」 —— 來自往期課程的某位同窗

這纔是真正的Git——Git實用技巧詳解

主要思路爲:找到要返回的commit object的哈希值,而後執行git reset恢復

咱們知道Git的出現就是爲了儘可能保證咱們的操做不被丟失,在Git內部原理中咱們講過,git object一旦被建立,就不可變動,因此只要找到它對應的哈希值,就能找回。可是ref呢?在Git內部原理中咱們也講過,它是一個可變的指針,好比說你在master中提交了一個commit,那當前的master這個ref就會指向新的commit object的哈希值。reflog 就是將這些可變指針的歷史給記錄下來,能夠理解成 ref的log,也能夠理解成 版本控制的版本控制

得到一個乾淨的工做空間

當咱們實驗一種思路,或者跟朋友講代碼時,咱們可能會隨意的修改代碼。而當咱們回到正常的開發時,咱們須要一個乾淨的工做目錄,即保證目前工做目錄跟Git最後一次commit的文件是一致的。咱們能夠怎麼作?

這纔是真正的Git——Git實用技巧詳解

儘可能少用會丟失文件的操做,除非你可以肯定再也不須要這些文件。

修改最近一個commit

commit完發現有一些臨時的log忘記去掉?有一些文件忘記添加?commit信息出現錯別字?

這纔是真正的Git——Git實用技巧詳解

也可使用 git reset HEAD~,而後執行你須要的修改,再commit便可,同上面介紹的命令效果是相同的。

提交一個文件中的部分修改

這纔是真正的Git——Git實用技巧詳解

Git interactive add 還有不少功能,也推薦你們有時間能夠嘗試一下。

禁止修改多人共用的遠端分支

若是一條遠端分支有多人共用,那麼不要在上面執行reset、rebase等會修改這條分支已經存在的commit object的命令。

這纔是真正的Git——Git實用技巧詳解

具體的解釋參照這篇文章 Rebase and the golden rule explained 。

撤銷一個合併

若是是一個本地分支,僅需git reset --hard <合併前的SHA1>便可。

若是這個分支已經被推送到遠端,好比說合並進master,發到線上才發現有bug須要回滾。這時分支有可能已經被其餘人所使用,根據「禁止修改多人共用的遠端分支」,你須要執行git revert -m 1 <合併的SHA1>,新增一個revert節點,以下圖中的E'。

這纔是真正的Git——Git實用技巧詳解

但要注意不要在原特性分支繼續開發,而應該刪除原來的分支,從E'節點拉出新分支作bug修復等。

若是在原特性分支上繼續開發,則在合併回master的時候須要作一次revert操做revert掉E'節點,變成E‘’(以下圖),否則很容易出現丟失文件等問題。具體緣由分析參照分支合併中的總結。

這纔是真正的Git——Git實用技巧詳解

從整個歷史中刪除一個文件

代碼要開源了,但發現其中包括密鑰文件或內網ip怎麼辦?

git filter-branch --tree-filter 'rm -f passwords.txt' HEAD

可使用filter-branch命令,它的實現原理是將每一個commit checkout出來,而後執行你給它的命令,像上面的rm -f passwords.txt,而後從新commit回去。

 這個操做屬於高危操做,會修改歷史變動記錄鏈,產生全新的commit object。因此執行前請通知倉庫的全部開發者,執行後全部開發者重新的分支繼續開發,棄用之前的全部分支。

其餘好用的命令

下面這些命令也是比較實用的命令,感興趣的同窗能夠本身學習一下。

  • git bisect 二分查找出現問題的變動節點,好比你發現當前提早下測試是不經過的,但HEAD~10(10個提交前)的測試是能夠經過的,就能夠用git bisect 來幫你定位到出現問題的變動點。

  • git blame 查看某行代碼最後是誰修改的。

  • git show-branch 直觀的展現多條分支間的關係。

  • git subtree 拆分或合併倉庫。

【編輯推薦】

  1. 致遠互聯攜手華爲雲啓動開發者大賽 加速企業應用定製向平臺生態轉型

  2. 快來測試Python開發工具pipenv的新版本

  3. 30 多個有內味道且笑死的人代碼註釋

  4. 科學家的挑戰:十年前寫的代碼如今還可否運行

  5. 用Python進行多元線性迴歸分析(附代碼)

【責任編輯:張燕妮 TEL:(010)68476606】

相關文章
相關標籤/搜索