【爛筆頭】git常用命令篇


前言

       轉載請聲明,轉自【https://www.cnblogs.com/andy-songwei/p/9737586.html】,謝謝!

       常言道,好記性不如爛筆頭,更何況筆者的記性也不是太好,於是就有了這篇“爛筆頭”系列之一的git命令記錄。本篇主要記錄了筆者在工作當中使用過的相關命令,以方便平時查看,同時也供同行們參考。當然,讀者可能認為,碰到問題的時候,再百度便是,何必費這個功夫去記錄呢。盡管如此,筆者仍然認為,有一套自己的班底,才更得心應手!

      本文主要從初始使用git、git管理本地分支、git操作遠程分支、git便捷使用等方面,對命令進行了歸類。主要內容如下(持續補充ing):

           

一、git相比svn的優勢

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

 

二、初始化及相關配置

  1、查看git配置信息  $ git config --list

        

  2、修改配置信息(平時使用時,只修改過user.name和user.email)

   $ git config --global user.name "Your Name"

   $ git config --global user.email "email@example.com

         

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

     

 

三、git本地倉庫管理

  1、$ git status 查看新修改文件狀態

  2、$ git checkout filename 還原修改的文件(根據自己演示的結果,得到的結論)

    (1)當unstage區(工作區,即只修改但未add時)中有,而stage區(暫存區,即add但未commit時)中沒有該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 顯示幫助信息

       

  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記錄。

  8、$ git diff

        file 添加文件名,針對某個文件進行比較。

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

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

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

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

  9、$ git rm

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

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

       

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

       

       

    (2)list 顯示當前所有被stash的信息

       

       以上三條信息分別對應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})的信息,並刪除該條信息

       

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

       

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

       

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

       

    (7)恢復被drop刪除后的stash記錄

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

         

          查看之前被刪除的記錄:git fsck --lost-found

           

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

           命令:git merge commitId

           

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

    (8)被stash clear刪除后,恢復記錄

        1)查看之前被刪除的記錄:git fsck --lost-found

        

 

        這里只需要關心“commit”行記錄

        2)查看每條記錄的修改:git show [commit-id]

         執行該命令后,會顯示該記錄的時間,修改內容等信息,通過這些信息來確定需要恢復哪一條。需要注意的是,這些記錄不是按照時間順序排列的,所以需要一一嘗試。

        3)恢復修改記錄:git merge [commit-id]

          恢復后,會體現在代碼中,而不是stash list中,如果想再保存,需要執行stash save命令重新保存。

 

  11、創建本地分支

    (1)$ git branch  new-branch-name

    (2) $ git checkout -b new-branch-name 創建分支后(在當前分支的基礎上,創建一個內容一樣的分支),當前分支會切換到新創建的分支。

        

  12、切換分支(注意與創建本地分支 -b 參數的差別)

       $ git checkout brance-name

       

  13、合並分支

      $ git merge branch-name

       

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

  14、拉取遠程分支內容

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

  15、提交本地分支到遠程分支

     $ git push origin branch-name

  16、patch

      patch的生成和合入有多種方式,這里介紹其中比較簡單的一種。

    (1)patch的生成

        ① $ git diff filepath(可以多個文件一起,也可以用 . 表示所有文件) > patchName.patch

        ② $ git format-patch -1 (當前公司采用的方式)

    (2)patch的合入

       $ git apply patchName.patch

四、git遠程分支管理

  1、查看遠程路徑,拉取版本代碼的時候的路徑 (根據權限的不同,fetch和push不一定都顯示)

      $ git remote -v

      

  2、查看遠程分支

    (1)$ git branch 查看本地分支(*為當前分支)

       

    (2)$ git branch -a 查看本地和遠程所有分支   (-av可以顯示每條分支最新的一條提交記錄)

          

       

  3、創建遠程分支

       創建一個本地分支dev1,然后push到遠程git服務器。

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

           

    (2)$ git push origin dev (提交本地分支修改時,也是該命令)

           

  4、刪除遠程分支(網上查資料,刪除的命令有多種,使用過以下兩種方式)

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

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

           

  5、重命名遠程分支

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

    (1)先刪除遠程分支 

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

    (3)將本地分支push到遠程倉庫 

  6、查看某條遠程分支的更新記錄

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

     

  7、拉取遠程分支並創建本地分支

    (1)git branch -r

         查看遠程分支名稱

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

         創建並切換到本地分支了

 

五、log查看提交記錄

  1、查看提交記錄 $ git log

       -- filename 顯示某個文件的提交信息

       -n 顯示log條數

       -p 顯示每次提交的diff

       --grep=str 根據關鍵字查找提交記錄 

  2、 查看某次提交記錄diff等信息(下表中好幾個參數筆者暫時沒有使用過,留着備用)

       git show commit-id filename 查看某個文件在某次提交中的相關信息

   

  3、查看某個文件的提交記錄

       git log --pretty==oneline  filename 找到commitid,然后結合commit show來查看

  4、查看某個文件某處的提交記錄

       $ git blame -L  行號,+列號  文件路徑名稱

        

       當前命令表示查看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倉庫中都有效。在配置文件中有對應的記錄,我的配置文件路徑為:C:\Users\rd0489\.gitconfig

     

      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 運行效果

           

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

        最后,推薦一款比較不錯的工具——zsh,對linux命令和git別名等的使用更加便利友好:Zsh入門 ,當然,該工具筆者還沒研究過,看到團隊中同事有使用,非常便利,所以就在這里推薦一下,以后有時間,筆者也會花時間來體驗體驗!

參考網站

  一個不不錯的入門網站:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

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


免責聲明!

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



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