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

我?guī)缀趺刻於际褂?Git,但仍然無法記住很多命令。

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

Git 流
Git 流

Git 相關術語

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

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

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

Git 術語
Git 術語

工作區(qū)

我們寫代碼的地方就是工作區(qū),就是在電腦里能看到的目錄,我們當前的工作空間。

暫存區(qū)

暫存區(qū)(stage)就是每次 git add 時,文件的修改存放的地方。

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

本地倉庫

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

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

respository
respository

遠程倉庫

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

比如,GitHub、Gitlab 等都屬于遠程倉庫。


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

比如我們在逛著某寶:

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

2、接著我們挑的七七八八了,接著我們就要提交我們的訂單了,點擊提交訂單(commit),接著會生成一個商品的訂單列表(快照),我們還可以在提交的時候添加點備注信息,比如要什么顏色(commit -m "顏色"),好的,此時訂單提交了,但是我們還沒支付(Push),我們可以在自己的賬戶未支付訂單列表(本地倉庫)中找到我們的這個訂單訂單(快照),也可以看到自己以前的一些訂單記錄;

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

其他一些重要概念

HEAD

HEAD 就是當前活躍分支的游標,你現(xiàn)在在哪兒,HEAD 就指向哪兒。

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

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

標簽

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

其他要點

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


Git 常用命令

1. 創(chuàng)建一個新的倉庫

# 在當前目錄新建一個 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. 添加/刪除文件

# 將指定文件添加到暫存區(qū)中
$ git add [file1] [file2] ...

# 將指定目錄添加到暫存區(qū)中,包括子目錄
$ git add [dir]

# 將當前目錄中的所有文件添加到暫存區(qū)中
$ git add .

# 在添加每個更改之前都進行確認
# 對于同一個文件的多個更改,建議分開提交
$ git add -p

# 將指定文件從工作區(qū)刪除,并將本次刪除添加到暫存區(qū)
$ git rm [file1] [file2] ...

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

# 對指定文件進行重命名,并添加到暫存區(qū)中
$ git mv [file-original] [file-renamed]

4. 代碼提交相關

# 將暫存區(qū)中的文件提交到代碼倉庫
$ git commit -m [message]

# 將指定的文件從暫存區(qū)中提交到倉庫
$ git commit [file1] [file2] ... -m [message]

# 將工作區(qū)的更改直接提交到倉庫
$ 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]

# 創(chuàng)建一個新分支,并與指定的遠程分支建立跟蹤關系
$ git branch --track [branch] [remote-branch]

# 切換到指定分支,并更新工作區(qū)
$ 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

# 在當前提交上創(chuàng)建一個新標簽
$ git tag [tag]

# 在指定提交上創(chuàng)建一個新標簽
$ 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

# 創(chuàng)建一個新分支,指向特定的標簽
$ 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

# 顯示所有的提交用戶,已提交數(shù)目多少排名
$ git shortlog -sn

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

# 顯示暫存區(qū)和工作區(qū)的文件差別
$ git diff

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

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

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

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

# 顯示特定提交的提交信息和更改的內(nèi)容
$ git show [commit]

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

# 顯示某個提交的特定文件的內(nèi)容
$ 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. 撤銷操作

# 將暫存區(qū)中的指定文件還原到工作區(qū),保留文件變動
$ git checkout [file]

# 將指定文件從某個提交還原到暫存區(qū)和工作區(qū)
$ git checkout [commit] [file]

# 將暫存區(qū)中的所有文件還原到工作區(qū)
$ git checkout .

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

# 重置暫存區(qū)和工作區(qū)中的指定文件,并與最近一次提交保持一致,工作空間文件變動不會保留
$ git reset --hard

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

# 重置暫存區(qū)和工作區(qū)中的指定文件,并與指定的某次提交保持一致,工作區(qū)的內(nèi)容會被覆蓋
$ git reset --hard [commit]

# 將 HEAD 重置為指定的某次提交,保持暫存區(qū)和工作區(qū)的內(nèi)容不變
$ 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. 其他

# 生成用于發(fā)布的存檔
$ 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資源免費下載服務!

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容