常用命令
雖然 Git 同時提供了 GUI 界面 和 Bash,但是,GUI 界面的功能相對來說還是有點簡陋的。要想熟練掌握 Git 的使用,還是需要了解 Git 一系列的命令!
Git 命令還是比較多的,後面我們以實際用到的功能來介紹。有個需要注意的地方就是命令的參數:參數分爲簡寫和全稱兩種方式,但是功能完全相同! 例如:git clone -b xxxxx
與 git clone --branch xxxxx
其實是一模一樣的,參數 --branch
簡寫爲 -b
!但是,不是每一個參數都有簡寫,且在不同命令下,可能存在相同的簡寫,但是功能含義可能不同。下圖是 Git 官網對於 Git 命令的分類列表
其中,紅色框中的是我們平時常用的一些命令。
初始化倉庫
初始化倉庫有兩種方式:本地新建和克隆遠程倉庫,分別對應 git init
和 git clone
這兩個命令!創建倉庫後,會在指定的目錄下生成一個 .git 的文件夾,其中存儲 Git 管理我們代碼需要的各種配置。
本地新建
創建本地倉庫相對比較簡單,在我們想要建立倉庫的文件夾中打開 Bash 命令框,執行 git init
命令即可。如下圖:
完整的 git init
命令如下:
git init [-q | --quiet] [--bare] [--template=<template_directory>]
[--separate-git-dir <git dir>]
[--shared[=<permissions>]] [directory]
常用參數如下:
-q、--quiet
:僅打印錯誤和警告消息; 所有其他輸出都將被抑制。--bare
:創建一個裸存儲庫。 如果未設置 GIT_DIR 環境,則將其設置爲當前工作目錄。--template=<template_directory>
:指定將使用的模板的目錄[directory]
:用於給出 Git 配置文件的路徑(含名稱)。如果不指定則表示當前目錄。默認生成名字爲 .git 的目錄
執行命令成功之後,在當前目錄下生成一個名爲 .git 的隱藏文件夾,Git 的所有配置文件就存在該文件夾中。接下來就可以在此文件夾(倉庫)中,增刪改自己的文件了。
使用 git init
初始化本地倉庫之後,本地倉庫是空的,連一個分支都是沒有的!如果此時進行創建分支則會報錯。如下圖所示:
[我們也可以打開 .git 目錄進行查看,會發現暫時沒有 master 分支。如下圖所示:
當我們提交一次修改之後,Git 會默認生成一個名爲 master 的分支。
分支的默認名字 master,在 Git 中並沒有任何特別的含義一樣。 同時 “master” 是當你運行 git init 時默認的起始分支名字,原因僅僅是它的廣泛使用。
以上方式創建的本地倉庫只能本地使用,其沒有與任何遠程倉庫關聯!如果要關聯遠程倉庫,則必須使用 git remote
命令進行關聯。
關聯遠程倉庫
Git 通常也會有個遠程倉庫。使用 git init
方式創建的本地倉庫只能本地使用,其沒有與任何遠程倉庫關聯!遠程倉庫的增、刪、改、查都是通過 git remote
命令來實現。
在 Git 中,會爲關聯的遠程倉庫創建一個本地名稱,默認不顯示指定時爲 origin,這樣我們在與遠程倉庫通信時,直接使用本地名稱就可以了!例如,我們要將代碼推送到以上關聯的遠程倉庫,直接使用 git push origin
就可以了。以下是一些常用的命令參數
git remote -v
:參數-v
==--verbose
。用於列出關聯的遠程倉庫,格式爲:本地名稱 + 遠程倉庫地址。如下圖:
git remote add
:命令格式:git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
。關聯一個遠程倉庫 <url>,本地名稱爲 <name>。
git remote rename
:命令格式:git remote rename <old> <new>
。將名爲 的遠程倉庫名重命名爲。git remote rm
:命令格式:git remote remove <name>
。其中,參數--rm
是--remove
的簡寫。刪除關聯的名爲 <name> 的遠程倉庫的關聯信息。
與遠程倉庫相關的配置,均位於 工作目錄下/.git/config
文件中,這是個文本文件,我們也可以直接打開改文件進行修改。
還有一點就是,一個本地倉庫可以關聯多個遠程倉庫! 如下圖所示是增加了一個遠程倉庫之後的情況。
如上所示,建議在關聯遠程倉庫的時候,指定一個本地名稱,這樣我們就可以很容易的知道關聯情況。這個在我們往遠程倉庫提交代碼是很有用處!
更新詳細的說明,見獨立的博文《Git 之五 通信協議(HTTPS、SSH、Git)、使用遠程倉庫(GitHub、GitLab、Gitee等)》!
遠程倉庫名字 “origin” 與分支名字 “master” 一樣,在 Git 中並沒有任何特別的含義一樣。 同時 “master” 是當你運行 git init 時默認的起始分支名字,原因僅僅是它的廣泛使用,“origin” 是當你運行 git clone 時默認的遠程倉庫名字。 如果你運行 git clone -o Gitx,那麼你默認的遠程分支名字將會是 Gitx/master。
克隆遠程倉庫
同樣也非常簡單,在我們想要保存遠程倉庫的文件夾中打開 Bash 命令框,執行 git clone https://github.com/ZCShou/N_W_Z_1.git
命令即可(注意將以上倉庫地址換爲自己的)。如下圖:
該命令將遠程存儲庫克隆到新創建的目錄中,併爲本地存儲庫中的每個分支創建遠程跟蹤分支,並創建和檢出從遠程存儲庫當前活動的分支派生出來的初始分支。該命令的完整格式如下:
git clone [--template=<template_directory>]
[-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror]
[-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>]
[--dissociate] [--separate-git-dir <git dir>]
[--depth <depth>] [--[no-]single-branch] [--no-tags]
[--recurse-submodules[=<pathspec>]] [--[no-]shallow-submodules]
[--[no-]remote-submodules] [--jobs <n>] [--] <repository>
[<directory>]
該命令常用參數如下:
-o <name>、--origin <name>
:指定遠程倉庫的本地名稱爲 <name>,而不使用默認的 origin。-b <name>、--branch <name>
:用於克隆名爲 <name> 的遠程分支,而不是以 HEAD 創建分支。在非空的倉庫中執行該命令,表示將指定的分支同步到當前倉庫!<repository>
:要克隆的(可能是遠程的)存儲庫。<directory>
:指定保存克隆的倉庫的本地目錄名稱。 如果沒有明確給出目錄,則使用遠程庫名字在當前目錄。只有當目錄爲空時,才允許克隆到現有目錄。
克隆之後,默認會使用沒有參數的 git fetch
將更新所有遠程跟蹤分支,並且沒有參數的 git pull
將另外將遠程主分支合併到當前主分支中(如果有的話)。其中也會有個 .git 的文件夾!
使用以上命令之後,本地倉庫就會和以上指定的遠程倉庫管理關聯,且會管理所有遠程分支。在 Git 中,會爲關聯的遠程倉庫創建一個本地名稱,不顯示指定時默認爲 origin。我們可以在以上命令中使用參數 --origin 本地名稱
來指定本地名稱(git clone --origin NWZ_xxx https://github.com/ZCShou/N_W_Z_1.git
)。
分支
使用分支意味着你可以把你的工作從開發主線上分離開來,以免影響開發主線。 Git 的一大特點就是對於分支的支持!Git 的分支可謂是難以置信的輕量級,它的新建操作幾乎可以在瞬間完成,並且在不同分支間切換起來也差不多一樣快。
Git 引入了一個概念:upstream。一個分支的 upstream,其實就是與遠程分支做關聯,告訴 Git,默認此分支爲推送及拉取的遠程分支的信息。如下圖所示:
更新詳細的說明,見獨立的博文《Git 之三 分支管理》!
檢查狀態
當我們修改了倉庫中的文件時,使用 git status
可以列出當前目錄所有還沒有被 Git 管理的文件和被 Git 管理且被修改但還未提交(git commit)的文件。
格式:$ git status <參數>
# git status命令一般不用加參數,可能用到的參數如下:
$ git status -s # 將結果以簡短的形式輸出
如下圖所示:
DIFF
使用 git status
我們僅可以看到文件級別的更改,如果我們想要查看文件內部具體有哪些變動,則需要 git diff
命令。
git diff [<options>] [<commit>] [--] [<path>…]
git diff [<options>] --cached [<commit>] [--] [<path>…]
git diff [<options>] <commit> <commit> [--] [<path>…]
git diff [<options>] <blob> <blob>
git diff [<options>] --no-index [--] <path> <path>
如下圖所示:
添加追蹤
在我們修改了倉庫中的文件後,必須要將修改添加到 Git 中。使用 git add
命令要用於把我們要提交的文件的信息添加到索引庫中。
格式:$ git add <參數> <path> # 文件名或者路徑,支持通配符,多個文件可以用空格來隔開,省略<path>表示用 . (點表示當前目錄)
注意幾個參數的區別:
$ git add . # 監控文件內容修改(modified)以及新文件(new),但不包括被刪除的文件
$ git add -u # 僅監控已經被add的文件(即tracked file),他會將被修改的文件提交到暫存區。add -u 不會提交新文件(untracked file)
$ git add -A # 是上面兩個功能的合集,提交所有變化 等價於 git add *
$ git add -i # 交互式的方式進行添加
$ git add -h # 查看git add的幫助信息
如下圖所示:
提交修改
使用 git commit
命令提交的是暫存區裏面的內容。
格式:$ git commit <參數> <-F file/ -m "msg" ...>
注意幾個參數的區別:
$ git commit -m # 提交說明。不用-m參數的話,git將調到一個文本編譯器(通常是vim)來讓你輸入提交的描述信息
$ git commit -a # -a 選項可只將所有被修改或者已刪除的且已經被git管理的文檔提交倒倉庫中。如果只是修改或者刪除了已被Git 管理的文檔,是沒必要使用git add 命令的。
$ git commit --amend #用來修復最近一次commit. 可以讓你合併你緩存區的修改和上一次commit, 而不是多出提交一個新的快照. 還可以用來編輯上一次的commit描述。注意:生成的commit是一個全新的commit, 之前的老的commit會從項目歷史中被刪除
例如:忘記了add一個文件:先 git add 忘記的文件,然後使用 git commit --amend --no-edit # 描述會是上一次commit的描述, --no-edit能讓我們修復commit,而且不要修改commit描述.
再例如:又或者我們發現在提交時忘記使用 -a 選項,導致 Changes bu not updated 中的內容沒有被提交:直接使用 git commit --amend -a 即可
如下圖所示:
查看記錄
使用 git log
命令列出歷史提交記錄如下:
git log -p -2 # -p 選項展開顯示每次提交的內容差異,用 -2 則僅顯示最近的兩次更新
如下圖所示:
也可以使用 git log --oneline
命令列出歷史提交記錄的精簡版,如下:
使用 git log --graph
命令查看歷史中什麼時候出現了分支、合併
git log --oneline --graph
如果只想查找指定用戶的提交日誌可以使用命令:git log --author=xxx
git log --author=Linus --oneline -5
如果你要指定日期,可以執行幾個選項:–since 和 --before,但是你也可以用 --until 和 --after,如下:
git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges
回退
git reset
命令將當前的分支重設(reset)到指定的或者HEAD(默認,如果不顯示指定 commit,默認是 HEAD,即最新的一次提交)
格式:$ git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]
並且根據 [mode] 有可能更新 index 和 working directory。mode 的取值可以是 hard、soft、mixed、merged、keep。下面來詳細說明每種模式的意義和效果。
- –hard:重設(reset) index和working directory,自從 <commit> 以來在 working directory 中的任何改變都被丟棄,並把HEAD指向<commit>。
- –soft:index和working directory中的內容不作任何改變,僅僅把HEAD指向\ <commit>。這個模式的效果是,執行完畢後,自從 <commit> 以來的所有改變都會顯示在 git status 的 “Changes to be committed” 中。
- –mixed:僅reset index,但是不 reset working directory。這個模式是默認模式,即當不顯示告知 git reset 模式時,會使用 mixed 模式。這個模式的效果是,working directory 中文件的修改都會被保留,不會丟棄,但是也不會被標記成"Changes to be committed",但是會打出什麼還未被更新的報告。
遠程倉庫
這部分見獨立博文《Git 之五 通信協議(HTTPS、SSH、Git)、使用遠程倉庫(GitHub、GitLab、Gitee等)》
參考
- https://git-scm.com/docs
- https://www.cnblogs.com/yelbosh/p/7471979.html
- git的基本架構欣賞 https://zhuanlan.zhihu.com/p/38245039
- Git的原理簡介和常用命令 https://www.cnblogs.com/yelbosh/p/7471979.html
- git工作流程一覽 https://www.cnblogs.com/yinn/archive/2018/01/23/7641507.html
- http://blog.didispace.com/gitflow-info/
- https://nvie.com/posts/a-successful-git-branching-model/