常用git命令

配置

在 Git 中有 3 種配置範圍,慶幸的是每臺計算機上只需要配置一次,程序升級時會自動保留配置信息,當然你也可以在任何時候通過運行命令來修改它們。這 3 種配置範圍分別是:

  • 通用配置:/etc/gitconfig,包含系統上每一個用戶及他們倉庫的通用配置,如果使用帶有 --system 選項的 git
    config 命令則會讀寫此配置範圍。
  • 用戶配置:~/.gitconfig,針對當前用戶,可以傳遞 --global 選項讓 Git 讀寫此配置文件。
  • 倉庫配置:.git/config,僅針對該倉庫,可使用 --local 選項進行修改。

Git工作流程
在這裏插入圖片描述
下面是我整理的常用 Git 命令清單。幾個專用名詞的譯名如下。

Workspace:工作區
Index / Stage:暫存區
Repository:倉庫區(或本地倉庫)
Remote:遠程倉庫

設置用戶郵箱

$ git config --global user.name "Jorly"
$ git config --global user.email "[email protected]"

默認文本編輯器

$ git config --global core.editor vim

啓用着色設置

$ git config --global color.ui true

設置行尾結束符

$ git config --global core.autocrlf false
$ git config --global core.safecrlf true

注意: 每一個級別覆蓋上一級別的配置。如果你想要檢查配置,可以使用 git config --list 命令來列出所有配置,也可以通過 git config 命令來檢查某一項配

設置別名

由於 Git 並不會在你輸入部分命令時自動推斷出你想要的命令,如果不想每次都輸入完整的命令,可以通過 git config 爲每一條命令設置一個別名,比如:

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status

這意味着,當要輸入 git commit 命令時,只需要輸入 git ci 命令即可。而且創建別名對於解決一些技術問題非常必要,比如,爲了解決取消暫存文件的易用性問題而添加的別名:

$ git config --global alias.unstage 'reset HEAD --'

這會使下面的 2 個命令等價:

$ git unstage fileA
$ git reset HEAD -- fileA

可以看出,Git 只是簡單地將別名替換爲對應的命令,如果你想要執行外部命令,則可以在命令前面加入 ! 符號,比如 git config --global alias.visual ‘!gitk’,這將使 git visual 定義爲 gitk 的別名。

一、新建代碼庫


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

# 新建一個目錄,將其初始化爲Git代碼庫
$ git init [project-name]

#  下載一個項目和它的整個代碼歷史
$ git clone [url]

二、配置

Git的設置文件爲.gitconfig,它可以在用戶主目錄下(全局配置),也可以在項目目錄下(項目配置)。

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

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

# 設置提交代碼時的用戶信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

三、增加/刪除文件


# 添加指定文件到暫存區
$ 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]
四、代碼提交
# 提交暫存區到倉庫區
$ git commit -m [message]

# 提交暫存區的指定文件到倉庫區
$ git commit [file1] [file2] ... -m [message]

# 提交工作區自上次commit之後的變化,直接到倉庫區
$ git commit -a

# 提交時顯示所有diff信息
$ git commit -v

# 使用一次新的commit,替代上一次提交
# 如果代碼沒有任何新變化,則用來改寫上一次commit的提交信息
$ git commit --amend -m [message]

# 重做上一次commit,幷包括指定文件的新變化
$ git commit --amend [file1] [file2] ...

五、分支


# 列出所有本地分支
$ git branch

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

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

# 新建一個分支,但依然停留在當前分支
$ git branch [branch-name]

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

# 新建一個分支,指向指定commit
$ 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]

# 選擇一個commit,合併進當前分支
$ git cherry-pick [commit]

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

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

六、標籤


# 列出所有tag
$ git tag

# 新建一個tag在當前commit
$ git tag [tag]

# 新建一個tag在指定commit
$ git tag [tag] [commit]

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

# 刪除遠程tag
$ git push origin :refs/tags/[tagName]

# 查看tag信息
$ git show [tag]

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

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

# 新建一個分支,指向某個tag
$ git checkout -b [branch] [tag]

七、查看信息

# 顯示有變更的文件
$ git status

# 顯示當前分支的版本歷史
$ git log

# 顯示commit歷史,以及每次commit發生變更的文件
$ git log --stat

# 搜索提交歷史,根據關鍵詞
$ git log -S [keyword]

# 顯示某個commit之後的所有變動,每個commit佔據一行
$ git log [tag] HEAD --pretty=format:%s

# 顯示某個commit之後的所有變動,其"提交說明"必須符合搜索條件
$ git log [tag] HEAD --grep feature

# 顯示某個文件的版本歷史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]

# 顯示指定文件相關的每一次diff
$ git log -p [file]

# 顯示過去5次提交
$ git log -5 --pretty --oneline

# 顯示所有提交過的用戶,按提交次數排序
$ git shortlog -sn

# 顯示指定文件是什麼人在什麼時間修改過
$ git blame [file]

# 顯示暫存區和工作區的差異
$ git diff

# 顯示暫存區和上一個commit的差異
$ git diff --cached [file]

# 顯示工作區與當前分支最新commit之間的差異
$ 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

八、遠程同步

# 下載遠程倉庫的所有變動
$ 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

九、撤銷


# 恢復暫存區的指定文件到工作區
$ git checkout [file]

# 恢復某個commit的指定文件到暫存區和工作區
$ git checkout [commit] [file]

# 恢復暫存區的所有文件到工作區
$ git checkout .

# 重置暫存區的指定文件,與上一次commit保持一致,但工作區不變
$ git reset [file]

# 重置暫存區與工作區,與上一次commit保持一致
$ git reset --hard

# 重置當前分支的指針爲指定commit,同時重置暫存區,但工作區不變
$ git reset [commit]

# 重置當前分支的HEAD爲指定commit,同時重置暫存區和工作區,與指定commit一致
$ git reset --hard [commit]

# 重置當前HEAD爲指定commit,但保持暫存區和工作區不變
$ git reset --keep [commit]

# 新建一個commit,用來撤銷指定commit
# 後者的所有變化都將被前者抵消,並且應用到當前分支
$ git revert [commit]

# 暫時將未提交的變化移除,稍後再移入
$ git stash
$ git stash pop

十、其他

生成一個可供發佈的壓縮包
$ git archive

Git 的 4 個階段的撤銷更改!

在這裏插入圖片描述

GIT基本概念

3個步驟
在這裏插入圖片描述
正常情況下,我們的工作流就是3個步驟,對應上圖中的3個箭頭線:

git add .
git commit -m "comment"
git push

git add .把所有文件放入暫存區;
git commit把所有文件從暫存區提交進本地倉庫;
git push把所有文件從本地倉庫推送進遠程倉庫。

4個區

工作區(Working Area)
暫存區(Stage)
本地倉庫(Local Repository)
遠程倉庫(Remote Repository)

5種狀態
以上4個區,進入每一個區成功之後會產生一個狀態,再加上最初始的一個狀態,一共是5種狀態。以下我們把這5種狀態分別命名爲:

未修改(Origin)
已修改(Modified)
已暫存(Staged)
已提交(Committed)
已推送(Pushed)

檢查修改

瞭解了基本概念之後,我們來談一談犯錯誤之後如何撤銷的問題。首先,我們要了解如何檢查這3個步驟當中每一個步驟修改了什麼,然後纔好判斷有沒有修改成功。檢查修改的二級命令都相同,都是diff,只是參數有所不同。
已修改,未暫存

git diff

首先,我們來看一下,如果我們只是簡單地在瀏覽器裏保存了一下文件,但是還沒有做git add .之前,我們如何檢查有哪些修改。我們先隨便拿一個文件來做一下實驗:
在這裏插入圖片描述
我們在文件開頭的第2行胡亂加了4個數字1234,存盤,這時文件進入了已修改狀態,但是還沒有進入暫存區,我們運行git diff,結果如下:

diff --git a/index.md b/index.md
index 73ff1ba..1066758 100644
--- a/index.md
+++ b/index.md
@@ -1,5 +1,5 @@
---
-layout: main
+1234layout: main
color: black
---

git diff的結果告訴我們哪些文件已經做了哪些修改。
已暫存,未提交

git diff --cached

現在我們把修改放入暫存區看一下。先執行git add .,然後執行git diff,你會發現沒有任何結果:
在這裏插入圖片描述
這說明git diff這個命令只檢查我們的工作區和暫存區之間的差異,如果我們想看到暫存區和本地倉庫之間的差異,就需要加一個參數git diff --cached:

diff --git a/index.md b/index.md
index 73ff1ba..1066758 100644
--- a/index.md
+++ b/index.md
@@ -1,5 +1,5 @@
---
-layout: main
+1234layout: main
color: black
---

這時候我們看到的差異是暫存區和本地倉庫之間的差異。
已提交,未推送

git diff master origin/master

現在,我們把修改從暫存區提交到本地倉庫,再看一下差異。先執行git commit,然後再執行git diff --cached,沒有差異,執行git diff master origin/master,可以看到差異:
在這裏插入圖片描述
在這裏,master就是你的本地倉庫,而origin/master就是你的遠程倉庫,master是主分支的意思,因爲我們都在主分支上工作,所以這裏兩邊都是master,而origin就代表遠程。

撤銷修改

瞭解清楚如何檢查各種修改之後,我們開始嘗試各種撤銷操作。
已修改,未暫存
如果我們只是在編輯器裏修改了文件,但還沒有執行git add .,這時候我們的文件還在工作區,並沒有進入暫存區,我們可以用:

git checkout .

或者

git reset --hard

來進行撤銷操作。
在這裏插入圖片描述
可以看到,在執行完git checkout .之後,修改已被撤銷,git diff沒有任何內容了。

一對反義詞 git add .的反義詞是git checkout .。做完修改之後,如果你想向前走一步,讓修改進入暫存區,就執行git add .,如果你想向後退一步,撤銷剛纔的修改,就執行git checkout 

已暫存,未提交
你已經執行了git add .,但還沒有執行git commit -m “comment”。這時候你意識到了錯誤,想要撤銷,你可以執行:

git reset
git checkout .

或者

git reset --hard

git reset只是把修改退回到了git add .之前的狀態,也就是說文件本身還處於已修改未暫存狀態,你如果想退回未修改狀態,還需要執行git checkout .。

或許你已經注意到了,以上兩個步驟都可以用同一個命令git reset --hard來完成。是的,就是這個強大的命令,可以一步到位地把你的修改完全恢復到未修改的狀態。
已提交,未推送
你的手太快,你既執行了git add .,又執行了git commit,這時候你的代碼已經進入了你的本地倉庫,然而你後悔了,怎麼辦?不要着急,還有辦法。

git reset --hard origin/master

還是這個git reset --hard命令,只不過這次多了一個參數origin/master,正如我們上面講過的,origin/master代表遠程倉庫,既然你已經污染了你的本地倉庫,那麼就從遠程倉庫把代碼取回來吧。

git reset --hard HEAD^
git push -f

在這裏插入圖片描述

總結

以上4種狀態的撤銷我們都用到了同一個命令git reset --hard,前2種狀態的用法甚至完全一樣,所以只要掌握了git reset --hard這個命令的用法,從此你再也不用擔心提交錯誤了。

參考鏈接 :
Git 的 4 個階段的撤銷更改! :https://mp.weixin.qq.com/s/a4Ruv8iZyj3ARU7k2dbA5w

來源:
http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html

Git 安裝配置https://www.jianshu.com/p/18e73a31647d

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章