1. 程式人生 > >命令列高效操作Git,看這篇就夠了

命令列高效操作Git,看這篇就夠了

原文地址:http://blog.jboost.cn/2019/06/16/use-git.html

 

對於軟體開發人員來說,git幾乎是每天都需要接觸的工具。但對於相處如此親密的工作夥伴,你對它的瞭解又有多少,是不是還在傻瓜式地開啟一個GUI工具,點選提交按鈕,然後“臥槽,又衝突了”,一臉懵逼到不知所措,責怪誰又在你前面提交了,誰又改了你的程式碼。

博主從一開始接觸git,就沒用過任何GUI工具,都是通過命令列進行操作,發現這種方式不僅對git的理解更深,效率也更高,遇到問題時一般都知道如何來處理,故做此分享。本文所有知識與操作只涉及日常使用場景,更多詳細內容可自行查閱其它資料。本文Git版本為 windows-2.20.1版。

基礎理論

git的理論知識,對使用者來說只需要知道它是分散式版本控制系統,瞭解如下三個概念即可,

  • 工作區:就是你直接操作的檔案目錄與內容
  • 暫存區:暫時為你儲存還沒將內容提交到版本庫的一個區域,對應.git目錄下的stage或index檔案
  • 版本庫:分本地版本庫與遠端版本庫,本地版本庫就理解為對應.git目錄即可,遠端版本庫就是遠端倉庫,如gitlab或github的repository。

如下圖,我們平時提交程式碼的過程基本都是從工作區add到暫存區,然後再commit到本地倉庫,最後push到遠端倉庫。

基本命令

對於日常工作,掌握如下幾個基本命令一般就夠了

  • git status
     檢視修改狀態
  • git pull origin master 拉取遠端倉庫master分支合併到本地,master根據場景換成其它分支名
  • git add file 新增檔案到暫存區,可用 * 新增所有
  • git commit -m "commit message" 提交到本地版本庫,並添加註釋,註釋表明此次修改內容,要清晰準確
  • git push origin master 將本地版本提交到遠端倉庫的master分支,master根據場景換成其它分支名

對大部分日常工作來說, 上面幾個命令基本就夠用了。

新建專案

1. 從本地到遠端

專案開發的時候,有時候是先在本地建一個專案,再提交到遠端倉庫的。

  1. 建立專案目錄(或通過IDE建立),命令列cd到專案目錄
  2. 執行git init , 將在專案目錄建立.git目錄
  3. 執行git add * ,將所有檔案新增到暫存區,這裡要先建立一個.gitignore檔案,將不需要版本維護的檔案新增進去忽略,不然各種IDE編譯資料夾,環境相關檔案都加到版本庫去了。刪除檔案用git rm file_name
  4. 執行git commit -m "upload project" ,提交到本地倉庫
  5. 在gitlab或github上建立一個倉庫,並將倉庫地址複製下來
  6. 執行git remote add origin git@server-name:path/repo-name.git ,關聯遠端倉庫,倉庫地址如果是http開頭則要使用者名稱密碼,如果是git開頭,則是走的ssh協議,需要將你本機的ssh公鑰新增到遠端倉庫服務上。
  7. 執行git push -u origin master ,推送本地倉庫內容到遠端倉庫

這樣在遠端倉庫目錄,就能看到你提交上去的檔案內容了。

2. 從遠端到本地
更多的時候,是遠端倉庫已有專案了,需要下載到本地開發。

  1. git clone git@server-name:path/repo-name.git , 將遠端倉庫的內容下載到本地,這裡倉庫地址的處理同上
  2. 修改內容
  3. git add * ,將修改的內容新增到暫存區
  4. git commit -m "fix xxx issue" ,提交到本地倉庫
  5. git push -u origin master , 推送本地倉庫內容至遠端倉庫

版本回退

有時候改了檔案,想反悔怎麼辦,git給你“後悔藥”。

單個檔案的還原:

  • git checkout file_name ,丟棄工作區的修改,還原到上次提交(commit)的版本,
  • git reset HEAD file_name ,把暫存區的修改撤銷掉(unstage),重新放回工作區。即還原到上次新增到暫存區(add)的版本

這裡涉及幾個場景

  • 場景1:當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令git checkout file_name
  • 場景2:當你不但改亂了工作區某個檔案的內容,還新增到了暫存區時(執行了add,但沒執行commit),想丟棄修改,分兩步,第一步用命令git reset HEAD file_name,就回到了場景1,第二步按場景1操作。
  • 場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次的全部提交,參考下面的整個版本的還原,不過前提是沒有推送到遠端庫。

整個版本的還原:

  • git reset --hard HEAD^^, 回退到上上個版本
  • git reset --hard 3628164, 回退到具體某個版本 3628164 是具體某個commit_id縮寫

找不到commit_id? git reflog 可檢視每一個命令的歷史記錄,獲取對應操作的commit_id。git log [--pretty=oneline], 可檢視commit記錄

上一個版本就是HEAD^,上上一個版本就是HEAD^^,往上100個版本寫成HEAD~100。3628164 是具體某個commit_id,不需要寫全,只需要唯一確定就行,可往前進也可往後退。(git windows2.20.1版貌似不支援對HEAD^的操作)

多人協作

  1. 首先,可以試圖用 git push origin branch_name 推送自己的修改;
  2. 如果推送失敗,則因為遠端分支比你的本地更新,需要先用 git pull 試圖合併;
  3. 如果合併有衝突,則手動解決衝突,並在本地提交;
  4. 沒有衝突或者解決掉衝突後,再用 git push origin branch-name 推送就能成功!

分支管理

平時開發時需要建立子分支來實現你的功能模組,然後再合併到主分支中。

  • git checkout -b your_branch_name , 建立並切換分支
  • git branch , 檢視分支,標有*號表示當前所在分支
  • git merge dev , 合併指定dev分支到當前分支
  • git merge --no-ff -m "merge with no-ff" dev , 合併分支並生成commit記錄
  • git branch -d dev , 刪除分支

git checkout -b dev = git branch dev + git checkout dev

Fast-forward合併,“快進模式”,也就是直接把master指向dev的當前提交,所以合併速度非常快。存在衝突的不能fast forward。git merge --no-ff -m "merge with no-ff" dev Fast forward模式下,刪除分支後,會丟掉分支資訊。如果強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支資訊

標籤管理

當釋出版本時,一般需要對當前版本進行標籤記錄,以便後續進行版本檢視或回退。

  • git tag tag_name , 對當前分支打標籤
  • git tag , 檢視所有標籤
  • git tag v0.9 6224937 ,針對某個具體commit id打標籤
  • git show tag_name , 檢視標籤資訊
  • git tag -a v0.1 -m "version 0.1 released" 3628164 , 帶有說明的標籤
  • git tag -d v0.1 , 刪除標籤
  • git push origin tag_name , 推送標籤到遠端
  • git push origin --tags , 一次性推送所有標籤

刪除已經推送到遠端的標籤:

  • git tag -d v0.9 , 先本地刪除
  • git push origin :refs/tags/v0.9 , 然後從遠端刪除

提高效率的Tips

  1. 配置命令別名

    git config --global alias.st status # 後面可以用git st 來代替git status了
    git config --global alias.ck checkout # 後面可以用 git ck 來代替 git checkout了
    git config --global alias.cm 'commit -m' # 後面可以用git cm 來代替 git commit -m 了
  2. git pull origin master 或 git push origin master, 可直接 git pull 或 git push, 如果出現“no tracking information”的提示,則說明本地分支和遠端分支的連結關係沒有建立,用命令 git branch --set-upstream-to=origin/master master 建立關聯即可。

總結

以上命令雖然看起來多,但平常用的最頻繁的應該是“基本命令”與“分支管理”部分,只要多用幾次,自然便能記住,應付日常工作完全沒有問題,徹底脫離GUI操作,讓工作更有效率。





我的個人部落格地址:http://blog.jboost.cn
我的頭條空間: https://www.toutiao.com/c/user/5833678517/#mid=1636101215791112
我的github地址:https://github.com/ronwxy
我的微信公眾號:jboost-ksxy

————————————————————————————————————————


歡迎關注我的微信公眾號,及時獲取最新分享