天天看點

【朝花夕拾】git常用指令篇

                                   工作中用到過的git指令整理

       git是我們平時最常用的版本控制工具。相比于svn,git有如下幾大優勢:(1)git是分布式管理,不需要單獨的伺服器存儲代碼,團隊中的每一台機器都可以作為伺服器,都互相獨立。其最大的優點就是,在斷網的情況下,仍然可以正常地使用git來管理本地的送出等版本管理操作。待網絡恢複以後,隻需要把所有的送出push到遠端Git伺服器即可。(2)切換分支速度非常快,幾乎是瞬間完成,對分支的管理方面效率比svn更高,svn的分支切換太慢,導緻該功能形同虛設。

       該篇文章中,記錄了平時使用時常用的指令,其中絕大部分都是平時自己用過的指令。在學習和使用工具時,主要參考了如下兩個網站:

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

https://git-scm.com/book/zh/v2

(一)相關配置

    1.檢視git配置資訊  $ git config --list

【朝花夕拾】git常用指令篇

    2.修改配置資訊(平時使用時,隻修改過user.name和user.email)

$ git config --global user.name "

Your Name

"

$ git config --global user.email "

[email protected]

【朝花夕拾】git常用指令篇

    3. $ git init 把目前目錄變成Git倉庫

【朝花夕拾】git常用指令篇

(二)本地Git操作

       1.$ git status 檢視新修改檔案狀态

       2.$ git checkout filename 還原修改的檔案(根據自己示範的結果,得到的結論)

              (1)當unstage區(即隻修改但未add時)中有,而stage區中沒有該filename檔案時,該指令使filename檔案還原為最新一次commit中的檔案

              (2)當unstage區中有,stage區中也有時,執行該指令後,unstage區檔案還原為stage中的内容

              (3)當unstage區中沒有,stage區中有時,執行該指令後,stage區檔案不變,此時需要使用$ git reset HEAD filename還原(後續會講到該指令)

       3.$ git add 将工作區中新修改檔案添加到stage區

             filename 将指定檔案添加到stage區

             dir 将某個檔案夾添加到stage區

             .  在Git Version2.x中将目前檔案夾下所有有改動(修改的,删除的,新建立的檔案)的檔案加入到 stage區。在Git Version1.x中隻将新修改的和新建立的檔案添加到stage區。

             -u (update)将所有tracked檔案添加到stage區中,從測試情況來看,删除的檔案和新修改的檔案都是tracked,新建立的檔案是untracked檔案,用git status可以檢視(簡單點說,就是将删除的,新修改的檔案添加到stage區)。

             -A (all) 将所有change(修改的,删除的,新建立的檔案)都送出到stage區

             --ignore-removal 新建立的檔案和新修改的檔案,被添加到stage區。忽略掉被删除的檔案。和Git Version1.x中 git add . 功能一樣。

             -h 顯示幫助資訊

【朝花夕拾】git常用指令篇

       4.$ git reset HEAD可以将stage中的change還原到unstage區(即add前的狀态)中,詳細的可以參考第6點。

       5.$ git commit

               -a (--all) 将被track的檔案,送出。包括沒有被add的檔案。

               -m (--message) "message"  将stage區域的檔案添加到目前分支中,并帶有log

               --amend 将彈出一個編輯頁面,編輯修改上一次commit的内容。

               -C(--reuse-message) <commit> 使用和commit-id相同的送出資訊(可以用于補充送出内容)

               --reset-author 重新設定作者。

       6.$ git reset 将倉庫送出指針指向某個版本(可能是前進,也可能是回退)

              --soft  指針移動後,目前change仍不變。

              --hard  指針移動後,目前change被還原為未修改狀态。

              沒有hard/soft時,stage區中的change還原到unstage區。

              commit-id,HEAD指針指向到commit-id的送出點版本。

              HEAD 表示目前版本 HEAD^表示上一個版本,多個^可以共同使用,讀者可以自行查詢。

        7.$ git revert commitId 将已經送出的id為commitId記錄退回到送出前。會産生一個新的commitId,注意和reset差別開來,reset會删除掉對應的commit記錄。

        7.$ git diff

            file 添加檔案名,針對某個檔案進行比較。

            無參數 (1) 如果stage區有,則是工作區和stage去做比較

                        (2) 如果stage區沒有,則是工作區和分支中做比較

            HEAD 比較工作區和HEAD指針指向的版本庫中檔案做比較

            --cache 暫存區和分支做比較。                  

        8.$ git rm

        9.$ git stash 隐藏所有tacked(modified和deleted)的change,stash就是隐藏的意思。無論是unstage區還是stage區的,都可以被stash隐藏儲存起來。

              untracked的檔案不能被stash(測試時發現的結果),需要先add到stage區,然後stash。還原重新使用後,tracked檔案 都會被轉移到add前的狀态。

【朝花夕拾】git常用指令篇

                (1) save <msg> 其中 <msg>表示對目前隐藏的資訊做一些注釋說明,可以不填寫。從測試結果上看,不加<msg>時,git stash 和git stash save 效果一樣。

【朝花夕拾】git常用指令篇
【朝花夕拾】git常用指令篇

                (2)list 顯示目前所有被stash的資訊

【朝花夕拾】git常用指令篇

                      以上三條資訊分别對應stash的儲存(msg資訊被被截取了一部分):

                      stash@{0} -- $ git stash save "test stash save"

                      stash@{1} -- $ git stash save ,其中 “:”後面的資訊為git自動添加,表示目前版本庫中最新送出的commt-id号簡寫和送出資訊

                      stash@{2} -- $ git stash

                 (3) pop取出stash棧頂(即stash@{0})的資訊,并删除該條資訊

【朝花夕拾】git常用指令篇

                 (4) apply stash@{n} 指定使用哪一條stash記錄,但該記錄不會受影響。

【朝花夕拾】git常用指令篇

                  (5) drop stash stash@{n}  删除指定的stash記錄,該記錄不會還原到工作區。

【朝花夕拾】git常用指令篇

                  (6)  clear 删除stash所有記錄。 

【朝花夕拾】git常用指令篇

                  (7) 恢複被删除後的stash記錄

                       1)找到被删除的記錄id,如第(5)點中的

【朝花夕拾】git常用指令篇

                         檢視之前被删除的記錄:git fsck --lost-found

【朝花夕拾】git常用指令篇

                        2)根據commit的id,恢複修改記錄

                         指令:git merge commitId

【朝花夕拾】git常用指令篇

                        通過上面的步驟,被誤删的stash記錄就又回到代碼中了,但是如果要讓這些修改回到unstage區,需要再執行 git  reset  HEAD^

           10. 建立本地分支

                 (1) $ git branch  new-branch-name

                 (2) $ git checkout -b new-branch-name 建立分支後,目前分支會切換到新建立的分支。

【朝花夕拾】git常用指令篇

             11.切換分支(注意與建立本地分支 -b 參數的差别)

                   $ git checkout brance-name

【朝花夕拾】git常用指令篇

             12.合并分支

                  $ git merge branch-name

【朝花夕拾】git常用指令篇

                  此時,master分支中做的修改,就被合并到了test-branch中來了。

             13.拉取遠端分支内容

                  $ git pull --rebase (一般建議是使用--rebase,這樣可以使送出線更優雅,可以到網上去查一下git pull,和 git pull --rebase的差別)

             14. 送出本地分支到遠端分支

                  $ git push origin branch-name

(三)遠端分支:

    1.檢視遠端路徑,拉取版本代碼的時候的路徑 (根據權限的不同,fetch和push不一定都顯示)

         $ git remote -v

【朝花夕拾】git常用指令篇

    2. 檢視遠端分支

           (1) $ git branch 檢視本地分支(*為目前分支)

【朝花夕拾】git常用指令篇

           (2) $ git branch -a 檢視本地和遠端所有分支   (-av可以顯示每條分支最新的一條送出記錄)

【朝花夕拾】git常用指令篇
【朝花夕拾】git常用指令篇

     3.建立遠端分支

         建立一個本地分支dev1,然後push到遠端git伺服器。

         (1) $ git push origin local-branch-name:remote-branch-name (:前後沒有空格,本地分支和遠端分支最好用同一個分支名,便于識别)

【朝花夕拾】git常用指令篇

         (2)$ git push origin dev (送出本地分支修改時,也是該指令)

【朝花夕拾】git常用指令篇

     4.删除遠端分支(網上查資料,删除的指令有多種,使用過以下兩種方式)

        (1) $ git branch -r -d origin/branch-name

        (2) $ git push origin :branch-name(有些時候有效,有些時候無效,尚未找到原因)

【朝花夕拾】git常用指令篇

     5.重命名遠端分支

        網上查過一些資料,一般都是說無法直接修改,用間接的方式

        (1) 先删除遠端分支 

        (2) 重命名本地分支 $ git branch -m branch-name new-branch-name

        (3) 将本地分支push到遠端倉庫 

      6.檢視某條遠端分支的更新記錄

         $ git reflog show --date=iso origin/master

【朝花夕拾】git常用指令篇

      7.拉取遠端分支并建立本地分支

        (1) git branch -r

             檢視遠端分支名稱

        (2) git checkout -b 本地分支名 遠端分支名

             建立并切換到本地分支了

  (四)log的使用

      (1) 檢視送出記錄 $ git log

           -- filename 顯示某個檔案的送出資訊

           -n 顯示log條數

           -p 顯示每次送出的diff

      (2) 檢視某次送出記錄diff等資訊 git show commit-id       

           filename 檢視某個檔案在某次送出中的相關資訊

【朝花夕拾】git常用指令篇

         (3)檢視某個檔案的送出記錄

                  git log --pretty==online  filename 找到commitid,然後結合commit show來檢視

         (4)檢視某個檔案某處的送出記錄

                  $ git blame -L  行号,+列号  檔案路徑名稱

【朝花夕拾】git常用指令篇

                  目前指令表示檢視FaceIdSdk.java 檔案 第75行,第5列中的送出記錄

   <五> 添加git的忽略檔案。在項目開發中,有些檔案不希望送出到git中,可以建立.gitignore檔案,将不需要git識别的檔案路徑添加到其中, 并送出到git中。           

           不需要從頭寫

.gitignore

檔案,GitHub已經為我們準備了各種配置檔案,隻需要組合一下就可以使用了。所有配置檔案可以直接線上浏覽:

https://github.com/github/gitignore

           忽略檔案的原則是:

            (1)忽略作業系統自動生成的檔案,比如縮略圖等;

            (2)忽略編譯生成的中間檔案、可執行檔案等,也就是如果一個檔案是通過另一個檔案自動生成的,那自動生成的檔案就沒必要放進版本庫,比如Java編譯産生的

.class

檔案;

            (3)忽略你自己的帶有敏感資訊的配置檔案,比如存放密碼的配置檔案。

   <六> 别名配置

            git中提供了使用别名來代替指令的的功能,比如,git status,配置好别名st表示status後,直接使用git st即可。對于一些常用,但指令比較長,而且不容易記憶的情況,别名的使用帶來了極大的便利。

【朝花夕拾】git常用指令篇

            按照這樣的格式配置自己喜歡的别名即可。配置後的别名是全局性的,在所有git倉庫中都有效。

            在配置檔案中有對應的記錄,我的配置檔案路徑為:C:\Users\rd0489\.gitconfig

【朝花夕拾】git常用指令篇

           lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit 

          $ git lg 運作效果

【朝花夕拾】git常用指令篇

           是不是非常喪心病狂? -_-