<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何熟練使用Git,教你幾個實用小技巧

          共 3715字,需瀏覽 8分鐘

           ·

          2021-04-12 23:14


          點擊上方“服務端思維”,選擇“設為星標

          回復”669“獲取獨家整理的精選資料集

          回復”加群“加入全國服務端高端社群「后端圈」


          作者 | lzaneli
          出品 | 騰訊技術工程

          本篇是這個系列的最后一篇文章,之前的文章主要講的是基礎原理部分(見上方專輯),在理解原理的基礎上,介紹一些實用的技巧給大家,希望能提高大家的開發(fā)效率。

          這篇文章因為更多的是列舉實際應用的技巧,所以文章結構會顯得散亂一些,也不會像前兩篇文章那樣要求大家順序閱讀。每個點都是互相獨立的,大家可以根據(jù)自己的需要學習。

          在這篇文章里我會使用操作錄屏的方式來介紹例子,希望這種方式可以讓你更直觀的了解命令的使用方法。

          將幾個commit壓縮成一個

          ?? 這里有一點要特別注意的是:rebase會導致新的commit節(jié)點產(chǎn)生,所以切記不要對多人共用的遠端分支進行rebase。

          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
          # s, squash <commit> = use commit, but meld into previous commit
          # 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'來實現(xiàn)。對這個有問題的同學可以參照Git內(nèi)部原理強調(diào)的可視化方法思考一下。

          找回丟失的commit節(jié)點或分支

          像上一步rebase后發(fā)現(xiàn)不符合預期,如何恢復?不小心刪除了一個分支,如何找回?

          “學會這個技能,你的同事會請你喝奶茶的,而且說不定還能收獲妹子?!? —— 來自往期課程的某位同學

          主要思路為:找到要返回的commit object的哈希值,然后執(zhí)行git reset恢復。

          我們知道Git的出現(xiàn)就是為了盡量保證我們的操作不被丟失,在Git內(nèi)部原理中我們講過,git object是旦被創(chuàng)建,就不可變更,所以只要找到它對應的哈希值,就能找回。但是ref呢?在Git內(nèi)部原理中我們也講過,它是一個可變的指針,比如說你在master中提交了一個commit,那當前的master這個ref就會指向新的commit object的哈希值。reflog 就是將這些可變指針的歷史給記錄下來,可以理解成 ref的log,也可以理解成 版本控制的版本控制。

          獲得一個干凈的工作空間

          當我們實驗一種思路,或者跟朋友講代碼時,我們可能會隨意的修改代碼。而當我們回到正常的開發(fā)時,我們需要一個干凈的工作目錄,即保證目前工作目錄跟Git最后一次commit的文件是一致的。我們可以怎么做?

          盡量少用會丟失文件的操作,除非你能夠確定不再需要這些文件。

          修改最近一個commit

          commit完發(fā)現(xiàn)有一些臨時的log忘記去掉?有一些文件忘記添加?commit信息出現(xiàn)錯別字?

          也可以使用 git reset HEAD~,然后執(zhí)行你需要的修改,再commit即可,同上面介紹的命令效果是相同的。

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

          Git interactive add 還有很多功能,也推薦大家有時間可以嘗試一下。

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

          如果一條遠端分支有多人共用,那么不要在上面執(zhí)行reset、rebase等會修改這條分支已經(jīng)存在的commit object的命令。

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

          撤銷一個合并

          如果是一個本地分支,僅需git reset --hard <合并前的SHA1>即可。

          如果這個分支已經(jīng)被推送到遠端,比如說合并進master,發(fā)到線上才發(fā)現(xiàn)有bug需要回滾。這時分支有可能已經(jīng)被其他人所使用,根據(jù)“禁止修改多人共用的遠端分支”,你需要執(zhí)行git revert -m 1 <合并的SHA1>,新增一個revert節(jié)點,如下圖中的E'。

          但要注意不要在原特性分支繼續(xù)開發(fā),而應該刪除原來的分支,從E'節(jié)點拉出新分支做bug修復等。

          如果在原特性分支上繼續(xù)開發(fā),則在合并回master的時候需要做一次revert操作revert掉E'節(jié)點,變成E‘’(如下圖),不然很容易出現(xiàn)丟失文件等問題。具體原因分析參照分支合并中的總結。

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

          代碼要開源了,但發(fā)現(xiàn)其中包括密鑰文件或內(nèi)網(wǎng)ip怎么辦?

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

          可以使用filter-branch命令,它的實現(xiàn)原理是將每個commit checkout出來,然后執(zhí)行你給它的命令,像上面的rm -f passwords.txt,然后重新commit回去。

          ?? 這個操作屬于高危操作,會修改歷史變更記錄鏈,產(chǎn)生全新的commit object。所以執(zhí)行前請通知倉庫的所有開發(fā)者,執(zhí)行后所有開發(fā)者從新的分支繼續(xù)開發(fā),棄用以前的所有分支。

          其他好用的命令

          下面這些命令也是比較實用的命令,感興趣的同學可以自己學習一下。

          • git bisect 二分查找出現(xiàn)問題的變更節(jié)點,比如你發(fā)現(xiàn)當前提前下測試是不通過的,但HEAD~10(10個提交前)的測試是可以通過的,就可以用git bisect 來幫你定位到出現(xiàn)問題的變更點。
          • git blame 查看某行代碼最后是誰修改的。
          • git show-branch 直觀的展示多條分支間的關系。
          • git subtree 拆分或合并倉庫。

          希望大家讀完有所收獲。感興趣的同學可以閱讀同系列的其他文章:

          • 這才是真正的Git——Git內(nèi)部原理
          • 這才是真正的Git——分支合并

          參考

          • 書籍 Scott Chacon, Ben Straub - Pro Git-Apress (2014)
          • 書籍 Jon Loeliger, Matthew McCullough - Version Control with Git, 2nd Edition - O’Reilly Media (2012)
          • Rebase and the golden rule explained


          — 本文結束 —


          ● 漫談設計模式在 Spring 框架中的良好實踐

          ● 顛覆微服務認知:深入思考微服務的七個主流觀點

          ● 人人都是 API 設計者

          ● 一文講透微服務下如何保證事務的一致性

          ● 要黑盒測試微服務內(nèi)部服務間調(diào)用,我該如何實現(xiàn)?



          關注我,回復 「加群」 加入各種主題討論群。



          對「服務端思維」有期待,請在文末點個在看

          喜歡這篇文章,歡迎轉發(fā)、分享朋友圈


          在看點這里
          瀏覽 62
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文字幕精品一区 | 久久国产劲爆∧v内射 | 91国產乱老熟 | 肏逼婷婷丁香免费国产 | 操操影院|