實用git指令

dcyyyyyy 發表於 2022-05-12
Git

實用git指令

本文以軟體構造實驗一中涉及到的git操作為基礎,結合git官方文件總結了一些常用的git指令,以供需要時快速檢視。實際工作中我們更多是想要解決眼前問題,比如"我想要克隆一個倉庫到本地該怎麼做"、"我要將我的程式碼上傳到遠端倉庫怎麼做"、"我要修改遠端倉庫程式碼怎麼做"這樣的問題,而檢視一本詳細的git指令教程雖然全面詳細但是對於解決這些常見問題來說效率實在太低,而且對於一個連指令如何書寫的小白來說一次性講清背後原理實屬無用功,所以本文主要是想以應用頻率很高的git操作為切入點展開介紹,同時也為已經瞭解具體操作內涵只是忘記指令的人提供了簡要版操作說明,更高效解決問題。


clone

操作目的:

將遠端倉庫複製克隆到本地指定位置

簡要操作說明:

  • 開啟cmd或git bash,使用cd命令進入想要將倉庫clone到的本地資料夾路徑
  • 使用指令git clone <倉庫的url>將倉庫clone到目標資料夾,使用git clone <倉庫的url> 新名字 將倉庫clone到目標資料夾並重新命名為指定名稱。

詳細操作說明:

  • 開啟cmd或Git Bash,使用cd命令進入想要將倉庫clone到的本地資料夾路徑:

    • cmd: cmd一進入預設在C盤中,如果目的資料夾不在C盤中則需要先進行切換磁碟操作,以切換到D盤為例,直接在cmd中輸入 D: 即可完成磁碟轉換(見下圖)
    • cmd: 然後使用cd指令進入目的資料夾位置即可(此處以目的資料夾在D->JavaProject->Lab為例)cd JavaProject\Lab注意在cmd中的路徑要使用'\'而非'/'(見下圖),這樣克隆下來的倉庫就會自動儲存在D/JavaProject/Lab中了
      image
      image
    • cmd: (當然,如果你手滑cd後面的路徑輸入錯了但已經進入了錯誤的位置,也無需關閉cmd重新來過,你可以使用指令cd.. 來退出返回至上一層)
      image
    • gitbush: 如果使用gitbush,則在gitbush下直接使用cd指令進入所在資料夾,同樣以D->JavaProject->Lab為例,與cmd下路徑輸入要求不同,使用'/'而非'\',其次就是上來就要有/d表明進入D盤,指令:cd /d/JavaProject/Lab
      image
  • 找到準備clone的倉庫的http連結或ssh連結(如果使用ssh連結需要保證已經提前配置好ssh),查詢url方法如下圖(以github上的一個倉庫為例進入倉庫首頁,點選右方綠色的Code按鈕即可檢視http或ssh連結,點選連結右方的按鈕可自動複製)
    image
    image

  • 複製結束之後,返回cmd或Git Bash,輸入指令git clone <倉庫的url>將倉庫clone到目標資料夾,clone成功後就可以在D/JavaProject/Lab下找到名字為倉庫名稱的資料夾了,這個資料夾中就是倉庫中所有的內容了。(下圖以cmd操作為例)
    image
    image

    • 如果你不想將資料夾的名字是預設的倉庫名,第一種辦法當然是右鍵重新命名,第二種方法就是使用指令git clone <倉庫的url> 新名字 將倉庫clone到目標資料夾並重新命名為指定名稱,這裡我將原名為test的倉庫clone下來的資料夾命名為MyTest,這樣clone下來的倉庫資料夾名字自動設定為MyTest了。
      image
      image
      (如果使用上述操作報錯了多半是網路原因連不上github,可以多試幾次或查詢報錯解決方案)

init & add & commit & push

操作目的:

將本地倉庫上傳到遠端倉庫

簡要操作說明:

  • 開啟cmd或Git Bash使用cd指令進入本地倉庫(也就是儲存所有專案檔案的那個本地資料夾)所在位置
  • git init
  • git add .提交所有檔案;或使用指令git add <file>提交單個檔案
  • git commit -m "<description>"
  • git remote add <name> <http/ssh連結>與遠端倉庫建立連結,<name>處換成此連結名字即可,一般都命名為origin
  • git push <name> master : master合併分支

詳細操作說明:

  • 開啟cmd或Git Bash使用cd指令進入本地倉庫(也就是儲存所有專案檔案的那個本地資料夾)所在位置

    • cmd: cmd一進入預設在C盤中,如果目的資料夾不在C盤中則需要先進行切換磁碟操作,以切換到D盤為例,直接在cmd中輸入 D: 即可完成磁碟轉換(見下圖)
    • cmd: 然後使用cd指令進入目的資料夾位置即可(此處以目的資料夾在D->JavaProject->Lab為例)cd JavaProject\Lab注意在cmd中的路徑要使用'\'而非'/'(見下圖),這樣克隆下來的倉庫就會自動儲存在D/JavaProject/Lab中了
      image
      image
    • cmd: (當然,如果你手滑cd後面的路徑輸入錯了但已經進入了錯誤的位置,也無需關閉cmd重新來過,你可以使用指令cd.. 來退出返回至上一層)
      image
    • gitbush: 如果使用gitbush,則在gitbush下直接使用cd指令進入所在資料夾,同樣以D->JavaProject->Lab為例,與cmd下路徑輸入要求不同,使用'/'而非'\',其次就是上來就要有/d表明進入D盤,指令:cd /d/JavaProject/Lab
      image
  • 輸入指令git init將原資料夾初始化為git倉庫,以本地倉庫TEST為例,其所在位置為D:/JavaProject/TEST這裡的init操作需要我們進入這個倉庫再進行,比如這個TEST倉庫中有兩個檔案(以下在Git Bash下演示,也可以使用cmd)
    image
    image

  • 使用git add類指令指定所需檔案進行追蹤,一般使用git add .):

    • git add -A :等價於git add -all提交所有變化
    • git add -u :等價於git add -update提交被修改(modified)和被刪除(deleted)的檔案,不包括新檔案(new)
    • git add . :提交新檔案(new)和被修改(modified)檔案,不包括被刪除(deleted)的檔案,並根據.gitignore檔案做過濾
    • git add * :不會根據.gitignore檔案做過濾而是將任何檔案都加入
    • git add <file> :提交單個指定檔案<file>處換成指定檔名稱即可
      image
  • (此步可忽略)(可以使用指令git status檢視當前資料夾中所有檔案狀態,如果是紅色表示還沒被add到暫存區,綠色表示已經add到暫存區)
    image
    如果此時刪除一個檔案"MagicSquare.java"再執行指令git status則出現
    image
    這裡仔細閱讀可以發現如果是誤刪了這個檔案,那麼我們可以使用指令git restore <file>進行恢復
    image

  • 輸入指令git commit -m "<description>" 將修改從暫存區提交到本地庫:<description>處換位對此次提交的敘述即可,比如可以是"initial commit","second","for fifth commit","add a test"等等,總之就是為了之後檢視此次提交時能根據描述想起此次操作資訊即可。
    image

  • 連線遠端倉庫:使用git remote指令檢查現在已建立好的遠端連結,如果是第一次建立則使用該指令將沒有返回值,使用指令git remote add <name> <http/ssh連結>,<name>處換成此連結名字即可,沒有要求,自己命名,一般都命名為origin,<http/ssh連結>就換成你想要提交的倉庫的http/ssh連結即可,當然如果你想使用ssh連結就需要提前配置好相關設定,但好處是之後無需反覆輸入使用者名稱和密碼,更方便。檢視相關連結方法如下圖。再使用指令git remote檢查一下是否已經建立好連結,如果建立好則該指令返回origin(或是你剛才的命名)
    image
    image

  • 使用指令git push類將本地庫分支推送到遠端倉庫分支:(按使用頻率排序,選擇所需指令即可)(如果之前連結使用的是http連結此時提交就需要你輸入使用者名稱和密碼,如果是ssh連結此時就無需輸入)

    • 如果所要提交到的遠端倉庫分支中的內容包含於本地倉庫分支中的內容,那麼你直接使用指令git push <name> <本地分支名>:<遠端分支名><name>就是之前你自己起的遠端連線名,一般是origin。具體指令例如可以是git push origin master:master該指令可將當前本地倉庫的master分支推送到遠端倉庫master分支中,如果遠端倉庫沒有master分支則會自動建立,你的提交到此為止。(這裡我又新建立了一個ssh連結對應的origin1,使用origin1進行上傳)點開github就可以在master分支中找到檔案了
      image
      image

    • 如果所要提交到的遠端倉庫分支中的內容不包含於本地倉庫分支中的內容使用git push <name> master:master指令就會報錯,並提示你先pull下來再push,此時你有以下幾種選擇:
      image

      • git push -f origin master:master:不想pull下來,甚至不想要遠端分支內的所有內容,只想要把本地的push上去,那麼使用強制提交指令git push -f origin master:master將本地master分支強制提交成為遠端倉庫的master分支
      • git pull origin master:master:先提交本地修改git add . ,git commit -m "init",再pull下來git pull origin master:master,如果出現"Please enter a commit message to explain why this merge is necessary"可按esc鍵同時輸入:wq退出或按i鍵進入insert模式修改最上面黃色選中的資訊,選擇不修改。
    • 幾種省略寫法:

      • git push origin master:指令git push origin <本地分支名>:<遠端分支名>中遠端分支名被省略,則表示將本地分支推送到與之存在追蹤關係的遠端分支(通常兩者同名),如果該遠端分支不存在則將會被新建立
      • git push origin :master:指令git push origin <本地分支名>:<遠端分支名>中本地分支名被省略,則相當於push一個空的本地分支到遠端分支,表示刪除該遠端分支master,等同於指令git push origin --delete master
      • git push origin:如果當前分支與遠端分支存在追蹤關係,則本地分支和遠端分支都可以省略,會將當前分支推送到對應分支上,當然如果你這麼寫系統會提示你把指令寫全,如果你每次都是提交到master分支上,可以輸入指令git push --set-upstream origin master只需輸一次這個指令,以後就都可以省略寫成git push origin而不會再提示你補全指令了

pull & fetch & merge

操作目的:

拉取遠端倉庫程式碼至本地,將遠端倉庫程式碼與本地倉庫程式碼合併

簡要操作說明(拉取有許可權的倉庫):

  • 開啟cmd或Git Bash使用cd指令進入pull操作後想要存放的目標資料夾所在位置
  • git init:git pull要求必須連線遠端倉庫
  • git remote add <遠端主機名name> <http/ssh連結>:git pull要求必須連線遠端倉庫,<name>處換成此連結名字即可,一般都命名為origin
  • git pull <遠端主機名name> <遠端分支名>:<本地分支名>:<name>處換成此連結名字即可,一般都命名為origin,pull操作會自動fetch和merge,git pull = git fetch + git merge,如果本地倉庫已經修改與遠端倉庫不同但是不想更新本地倉庫與遠端保持一致,則需先git add . ,git commit -m "init",再pull下來git pull origin master:master如果出現"Please enter a commit message to explain why this merge is necessary"可按esc鍵同時輸入:wq退出或按i鍵進入insert模式修改最上面黃色選中的資訊,選擇不修改。
    image

簡要操作說明(拉取無許可權的倉庫):

(無許可權倉庫拉取說白了就是clone)

  • 開啟cmd或git bash,使用cd命令進入想要將倉庫拉取到的本地資料夾路徑
  • 使用指令git clone <倉庫的url>將倉庫clone到目標資料夾,使用git clone <倉庫的url> 新名字 將倉庫clone到目標資料夾並重新命名為指定名稱。