本篇是這個系列的最後一篇文章,以前的文章主要講的是基礎原理部分(見上方專輯),在理解原理的基礎上,介紹一些實用的技巧給你們,但願能提升你們的開發效率。git
這篇文章由於更多的是列舉實際應用的技巧,因此文章結構會顯得散亂一些,也不會像前兩篇文章那樣要求你們順序閱讀。每一個點都是互相獨立的,你們能夠根據本身的須要學習。shell
在這篇文章裏我會使用操做錄屏的方式來介紹例子,但願這種方式可讓你更直觀的瞭解命令的使用方法。vim
這裏有一點要特別注意的是:rebase會致使新的commit節點產生,因此切記不要對多人共用的遠端分支進行rebase。ide
rebase -i 是個很實用且應用普遍的工具,但願你們都學會它的使用。它還能夠用來修改commit信息,拋棄某些commit,對commit進行排序等等。具體命令以下,操做方式跟動圖一致,都是在vim裏面進行編輯。這裏不展開,感興趣的同窗能夠本身操做一下。工具
# Commands: 學習
# p, pick <commit> = use commit 開發工具
# r, reword <commit> = use commit, but edit the commit message 測試
# e, edit <commit> = use commit, but stop for amending this
# s, squash <commit> = use commit, but meld into previous commit spa
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
另外若是要合併的是最近的幾個commit,咱們還能夠用git reset --soft HEAD~3 && git commit -m 'xxx'來實現。對這個有問題的同窗能夠參照Git內部原理強調的可視化方法思考一下。
像上一步rebase後發現不符合預期,如何恢復?不當心刪除了一個分支,如何找回?
「學會這個技能,你的同事會請你喝奶茶的,並且說不定還能收穫妹子。」 —— 來自往期課程的某位同窗
主要思路爲:找到要返回的commit object的哈希值,而後執行git reset恢復。
咱們知道Git的出現就是爲了儘可能保證咱們的操做不被丟失,在Git內部原理中咱們講過,git object一旦被建立,就不可變動,因此只要找到它對應的哈希值,就能找回。可是ref呢?在Git內部原理中咱們也講過,它是一個可變的指針,好比說你在master中提交了一個commit,那當前的master這個ref就會指向新的commit object的哈希值。reflog 就是將這些可變指針的歷史給記錄下來,能夠理解成 ref的log,也能夠理解成 版本控制的版本控制。
當咱們實驗一種思路,或者跟朋友講代碼時,咱們可能會隨意的修改代碼。而當咱們回到正常的開發時,咱們須要一個乾淨的工做目錄,即保證目前工做目錄跟Git最後一次commit的文件是一致的。咱們能夠怎麼作?
儘可能少用會丟失文件的操做,除非你可以肯定再也不須要這些文件。
commit完發現有一些臨時的log忘記去掉?有一些文件忘記添加?commit信息出現錯別字?
也可使用 git reset HEAD~,而後執行你須要的修改,再commit便可,同上面介紹的命令效果是相同的。
Git interactive add 還有不少功能,也推薦你們有時間能夠嘗試一下。
若是一條遠端分支有多人共用,那麼不要在上面執行reset、rebase等會修改這條分支已經存在的commit object的命令。
具體的解釋參照這篇文章 Rebase and the golden rule explained 。
若是是一個本地分支,僅需git reset --hard <合併前的SHA1>便可。
若是這個分支已經被推送到遠端,好比說合並進master,發到線上才發現有bug須要回滾。這時分支有可能已經被其餘人所使用,根據「禁止修改多人共用的遠端分支」,你須要執行git revert -m 1 <合併的SHA1>,新增一個revert節點,以下圖中的E'。
但要注意不要在原特性分支繼續開發,而應該刪除原來的分支,從E'節點拉出新分支作bug修復等。
若是在原特性分支上繼續開發,則在合併回master的時候須要作一次revert操做revert掉E'節點,變成E‘’(以下圖),否則很容易出現丟失文件等問題。具體緣由分析參照分支合併中的總結。
代碼要開源了,但發現其中包括密鑰文件或內網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 拆分或合併倉庫。
【編輯推薦】
【責任編輯:張燕妮 TEL:(010)68476606】