1. 程式人生 > >一文搞定 Git 相關概念和常用指令

一文搞定 Git 相關概念和常用指令

我幾乎每天都使用 Git,但仍然無法記住很多命令。

通常,只需要記住下圖中的 6 個命令就足以供日常使用。但是,為了確保使用地很順滑,其實你應該記住 60 到 100 個命令。

Git 流

Git 相關術語

Git 中不可避免會遇到下面幾個術語,不搞清楚它們,後面只會更懵逼。

  • 工作區(Working Directory)
  • 暫存區(Stage/Index)
  • 本地歷史倉庫(Repository)
  • 遠端倉庫(Remote)

對照下圖,下面一一進行介紹。

Git 術語

工作區

我們寫程式碼的地方就是工作區,就是在電腦裡能看到的目錄,我們當前的工作空間。

暫存區

暫存區(stage)就是每次 git add 時,檔案的修改存放的地方。

git commit 時就是一次性把暫存區所有修改提交到分支。

本地倉庫

我們可以把暫存區的內容提交到我們的本地倉庫,又名版本庫(respository),可將其理解成一個目錄,該目錄下的所有檔案都會被 git 管理起來,每個檔案的修改、刪除、git 都能跟蹤,以便隨時追蹤歷史,和還原。

.git 隱藏目錄就是 git 的版本庫,裡面存了很多東西,最重要的就是 stage(index) 暫存區,還有第一個分支 master,以及指向 master 的 HEAD 指標。

respository

遠端倉庫

遠端倉庫其實就是找一臺電腦充當伺服器的角色,每天 24 小時開機,其他每個人都從這個遠端倉庫克隆一份到自己的電腦上,並且各自把各自的提交推送到伺服器倉庫裡,也從伺服器倉庫中拉取別人的提交。

比如,GitHub、Gitlab 等都屬於遠端倉庫。


下面,舉一個形象化的例子來幫助大家理解上面幾個概念:

比如我們在逛著某寶:

1、看到了心儀的物品,我們可以把商品新增到購物車(暫存區),我們可能會頻繁的新增商品(add)或者移除商品(checkout),在這個過程中我們可以隨便嗨,反正還沒給錢;

2、接著我們挑的七七八八了,接著我們就要提交我們的訂單了,點選提交訂單(commit)

,接著會生成一個商品的訂單列表(快照),我們還可以在提交的時候新增點備註資訊,比如要什麼顏色(commit -m “顏色”),好的,此時訂單提交了,但是我們還沒支付(Push),我們可以在自己的賬戶未支付訂單列表(本地倉庫)中找到我們的這個訂單訂單(快照),也可以看到自己以前的一些訂單記錄;

3、再接著我們選擇這個還沒付款的訂單,進行支付(Push),付款完成後,**商家(遠端倉庫)**就會收到這個訂單,然後發貨…

其他一些重要概念

HEAD

HEAD 就是當前活躍分支的遊標,你現在在哪兒,HEAD 就指向哪兒。

HEAD 是一個指標,總是指向當前分支。倉庫版本的回退和追蹤都是通過操作 HEAD 指標來完成。

不過 HEAD 並非只能指向分支的最頂端(時間節點距今最近的那個),實際上它可以指向任何一個節點,它就是 Git 內部用來追蹤當前位置的東東。

標籤

有了 commit id 為什麼還要tag?因為 commit id 不好找,tag 是有意義的名字,它與 commit 綁在一起。

其他要點

1、每一次 git commit,都會生成一個 commit id 記錄該次提交,Git 都會將它們串成一條時間線,這條時間線就是一個分支。
2、因為建立、合併、刪除分支都很快,所以 git 鼓勵你使用分支完成某個任務,合併後再刪除分支。過程比直接在 master 分支工作更安全,且效果一樣。
3、分支策略:master 分支應該是非常穩定的,僅用來發布新版本,平時不能在上面幹活,幹活都在 dev 分支,dev 是不穩定的,到 1.0 釋出時,再將 dev 合併到 master 上,由 master 釋出新版本。


Git 常用命令

1. 建立一個新的倉庫

# 在當前目錄新建一個 Git 倉庫
$ git init

# 新建一個目錄,並將其初始化為 Git 倉庫
$ git init [project-name]

# 從遠端下載一個倉庫
$ git clone [url]

2. 配置

Git 的配置檔案是 .gitconfig,可以放在使用者的主目錄(全域性配置)下或專案目錄下(專案配置)。

# 顯示當前的 Git 配置
$ git config --list

# 編輯 Git 配置
$ git config -e [--global]

# 設定用來提交程式碼的使用者資訊
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

3. 新增/刪除檔案

# 將指定檔案新增到暫存區中
$ git add [file1] [file2] ...

# 將指定目錄新增到暫存區中,包括子目錄
$ git add [dir]

# 將當前目錄中的所有檔案新增到暫存區中
$ git add .

# 在新增每個更改之前都進行確認
# 對於同一個檔案的多個更改,建議分開提交
$ git add -p

# 將指定檔案從工作區刪除,並將本次刪除新增到暫存區
$ git rm [file1] [file2] ...

# 停止追蹤指定的檔案,不會刪除檔案
$ git rm --cached [file]

# 對指定檔案進行重新命名,並新增到暫存區中
$ git mv [file-original] [file-renamed]

4. 程式碼提交相關

# 將暫存區中的檔案提交到程式碼倉庫
$ git commit -m [message]

# 將指定的檔案從暫存區中提交到倉庫
$ git commit [file1] [file2] ... -m [message]

# 將工作區的更改直接提交到倉庫
$ git commit -a

# 提交前展示所有的變動
$ git commit -v

# 使用新提交代替上次提交
# 如果程式碼沒有任何變動,將會用於重寫上次提交的提交資訊
$ git commit --amend -m [message]

# 重做上次的提交,並將指定的檔案包含其中
$ git commit --amend [file1] [file2] ...

5. 分支相關

# 列出本地分支
$ git branch

# 列出所有遠端分支
$ git branch -r

# 列出本地和遠端的所有分支
$ git branch -a

# 新建分支,並留在當前分支
$ git branch [branch-name]

# 新建分支,並切換到新分支
$ git checkout -b [branch]

# 指向某次提交新建分支
$ git branch [branch] [commit]

# 建立一個新分支,並與指定的遠端分支建立跟蹤關係
$ git branch --track [branch] [remote-branch]

# 切換到指定分支,並更新工作區
$ git checkout [branch-name]

# 切換到上一個分支
$ git checkout -

# 將本地分支與指定的遠端分支建立跟蹤關係
$ git branch --set-upstream [branch] [remote-branch]

# 合併指定分支與當前分支
$ git merge [branch]

# 將指定的提交合併到本地分支
$ git cherry-pick [commit]

# 刪除分支
$ git branch -d [branch-name]

# 刪除遠端分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

6. 標籤操作

# 列出所有標籤
$ git tag

# 在當前提交上建立一個新標籤
$ git tag [tag]

# 在指定提交上建立一個新標籤
$ git tag [tag] [commit]

# 刪除本地標籤
$ git tag -d [tag]

# 刪除遠端標籤
$ git push origin :refs/tags/[tagName]

# 檢視標籤資訊
$ git show [tag]

# 提交指定標籤
$ git push [remote] [tag]

# 提交所有標籤
$ git push [remote] --tags

# 建立一個新分支,指向特定的標籤
$ git checkout -b [branch] [tag]

7.檢視資訊

# 顯示有變動的檔案
$ git status

# 顯示當前分支的提交歷史
$ git log

# 顯示提交歷史和每次提交的檔案
$ git log --stat

# 指定關鍵字搜尋提交歷史
$ git log -S [keyword]

# 顯示自某次提交以來的所有更改,一次提交顯示一行。
$ git log [tag] HEAD --pretty=format:%s

# 顯示自某次提交以來的所有更改,其提交描述必須符合搜尋條件。
$ git log [tag] HEAD --grep feature

# 顯示指定檔案的提交歷史
$ git log --follow [file]
$ git whatchanged [file]

# 顯示與指定檔案相關的每個差異
$ git log -p [file]

# 顯示最近 5 次提交
$ git log -5 --pretty --oneline

# 顯示所有的提交使用者,已提交數目多少排名
$ git shortlog -sn

# 顯示指定檔案何時被何人修改過
$ git blame [file]

# 顯示暫存區和工作區的檔案差別
$ git diff

# 顯示暫存區和上一次提交的差別
$ git diff --cached [file]

# 顯示工作區和當前分支的最近一次提交的差別
$ git diff HEAD

# 顯示指定兩次提交的差別
$ git diff [first-branch]...[second-branch]

# 顯示今天提交了多少程式碼
$ git diff --shortstat "@{0 day ago}"

# 顯示特定提交的提交資訊和更改的內容
$ git show [commit]

# 新手某次提交改動了哪些檔案
$ git show --name-only [commit]

# 顯示某個提交的特定檔案的內容
$ git show [commit]:[filename]

# 顯示當前分支的最新提交
$ git reflog

8. 遠端同步

# 從遠端分支下載所有變動
$ git fetch [remote]

# 顯示所有遠端倉庫
$ git remote -v

# 顯示某個遠端參考的資訊
$ git remote show [remote]

# 新建一個遠端倉庫,並命名
$ git remote add [shortname] [url]

# 檢索遠端儲存庫的更改,並與本地分支合併
$ git pull [remote] [branch]

# 將本地分支提交到遠端倉庫
$ git push [remote] [branch]

# 將當前分支強制提交到遠端倉庫,即使有衝突存在
$ git push [remote] --force

# 將所有分支提交到遠端倉庫
$ git push [remote] --all

9. 撤銷操作

# 將暫存區中的指定檔案還原到工作區,保留檔案變動
$ git checkout [file]

# 將指定檔案從某個提交還原到暫存區和工作區
$ git checkout [commit] [file]

# 將暫存區中的所有檔案還原到工作區
$ git checkout .

# 重置暫存區中的指定檔案,與先前的提交保持一致,但保持工作空間的變動不變
$ git reset [file]

# 重置暫存區和工作區中的指定檔案,並與最近一次提交保持一致,工作空間檔案變動不會保留
$ git reset --hard

# 重置暫存區,指向指定的某次提交,工作區的內容不會被覆蓋
$ git reset [commit]

# 重置暫存區和工作區中的指定檔案,並與指定的某次提交保持一致,工作區的內容會被覆蓋
$ git reset --hard [commit]

# 將 HEAD 重置為指定的某次提交,保持暫存區和工作區的內容不變
$ git reset --keep [commit]

# 新建新提交以撤消指定的提交
# All changes of the latter will be offset by the former and applied to the current branch.
$ git revert [commit]

# 暫存為提交的變動,並在稍後移動它們
$ git stash
$ git stash pop

10. 其他

# 生成用於釋出的存檔
$ git archive

參考:
1、https://juejin.im/post/5adb1720f265da0b80704fb8
2、https://www.cnblogs.com/tsingke/p/7350490.html
3、https://www.tutorialdocs.com/article/git-basic-command-list.html


你的關注是對我最大的鼓勵!

最近蒐集到傳智播客 2018 最新 Python 和 Java 教程!關注本公眾號,後臺回覆「2018」即可獲取下載地址。

公眾號提供CSDN資源免費下載服務!