Git命令大全

以下內(nèi)容是我在學(xué)習(xí)和研究Git時,對Git操作的特性、重點(diǎn)和注意事項(xiàng)的提取、精練和總結(jié),可以做為Git操作的字典,方便大家查閱;如果你從未接觸過Git,希望看一個入門級別的教程,請移步到《Git基礎(chǔ)教程》

備注:本文會不斷更新完善;

目錄

內(nèi)容

1. 語法格式描述

本文采用BNF語法格式描述規(guī)范描述命令行的語法,BNF語法格式的元字符及其含義如下:
[ ]:可選內(nèi)容;
< >:必須給出內(nèi)容;
{ }:可重復(fù)0至無數(shù)次的內(nèi)容;
a|b|c:多選一;
:可以有多個;

備注:關(guān)于BNF的詳細(xì)內(nèi)容可參考《語法格式描述規(guī)范BNF、EBNF、ABNF

2. 存放git環(huán)境變量的幾個位置

git支持多級配置,如:系統(tǒng)級、用戶級、項(xiàng)目級、工作區(qū)級;它們的優(yōu)先級如下:工作區(qū)級配置 > 項(xiàng)目級配置 > 用戶級配置 > 系統(tǒng)級配置;每級配置記錄在對應(yīng)的配置文件中,通過 git config 命令設(shè)置的配置項(xiàng) 也都會寫在對應(yīng)的配置文件中,配置文件的具體信息如下:

  • /etc/gitconfig :系統(tǒng)級配置文件;對系統(tǒng)中所有用戶都普遍適用的配置。若使用 git config 時用 --system 選項(xiàng),讀寫的就是這個文件。
  • ~/.gitconfig :用戶級配置文件;用戶目錄下的配置文件只適用于該用戶。若使用 git config 時用 --global 選項(xiàng),讀寫的就是這個文件。
  • 當(dāng)前項(xiàng)目的 git倉庫目錄中的配置文件(也就是工作目錄中的 .git/config 文件):這里的配置僅僅針對當(dāng)前項(xiàng)目有效。若使用 git config 時用 --local 選項(xiàng) 或 省略,讀寫的就是這個文件。
  • 工作區(qū)級配置文件 :這里的配置僅僅針對當(dāng)前工作區(qū)有效。若使用 git config 時用 --worktree 選項(xiàng),讀寫的就是這個文件。

3. 配置

3.1. 用戶信息

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

如果用了 --global 選項(xiàng),那么更改的配置文件就是位于你用戶主目錄下的那個,以后你所有的項(xiàng)目都會默認(rèn)使用這里配置的用戶信息。如果要在某個特定的項(xiàng)目中使用其他名字或者電郵,只要去掉 --global 選項(xiàng)重新配置即可,新的設(shè)定保存在當(dāng)前項(xiàng)目的 .git/config 文件里。

3.2. 查看配置信息

git config --list

有時候會看到重復(fù)的變量名,那就說明它們來自不同的配置文件(比如 /etc/gitconfig~/.gitconfig),不過最終 Git 實(shí)際采用的是最后一個

也可以直接查閱某個環(huán)境變量的設(shè)定,只要把特定的名字跟在后面即可,像這樣:

git config user.name Scott Chacon

3.3. 文本編輯器

Git 需要你輸入一些額外消息的時候,會自動調(diào)用一個外部文本編輯器給你用。默認(rèn)會使用操作系統(tǒng)指定的默認(rèn)編輯器,一般可能會是 Vi 或者 Vim。如果你有其他偏好,比如 Emacs 的話,可以重新設(shè)置:

git config --global core.editor emacs

3.4. 差異分析工具

在解決合并沖突時使用哪種差異分析工具。比如要改用 vimdiff 的話:

git config --global merge.tool vimdiff

Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的輸出信息。當(dāng)然,你也可以指定使用自己開發(fā)的工具;

4. 獲取幫助

想了解 Git 的各式工具該怎么用,可以閱讀它們的使用幫助,方法有三:

  • git help [命令]
  • git [命令] --help
  • man git

比如,要學(xué)習(xí) config 命令可以怎么用,運(yùn)行:

git help config

5. Git常用命令

5.1. 獲得項(xiàng)目的Git倉庫

有2種獲得 Git 項(xiàng)目倉庫的方法:

  1. 通過Git的init命令初始化一個新倉庫;
  2. 通過Git的clone命令從已有的 Git 倉庫(可以是本地的,也可以是遠(yuǎn)程的)克隆出一個新的鏡像倉庫來。

5.1.1. 在工作目錄中初始化新倉庫

要對現(xiàn)有的某個項(xiàng)目開始用 Git 管理,只需到此項(xiàng)目所在的目錄,執(zhí)行:

git init

5.1.2. 從現(xiàn)有倉庫克隆

命令格式:

$ git clone [url]

比如,要克隆 Ruby 語言的 Git 代碼倉庫 Grit,可以用下面的命令:

git clone git://github.com/schacon/grit.git

如果希望在克隆的時候,自己定義要新建的項(xiàng)目目錄名稱,可以在上面的命令末尾指定新的名字:

git clone git://github.com/schacon/grit.git mygrit

如果希望克隆時直檢出指定的分支,可以指定 -b <分支名> 選項(xiàng),如下:

git clone  -b Tool  https://gitee.com/guobinyong/Opus.git 工具

通常clone命令會把整個倉庫的(包含所有分支的)版本數(shù)據(jù)給克隆下來,如果只想獲取某個分支的版本數(shù)據(jù),只需要加上 --single-branch選項(xiàng),如下:

git clone  --single-branch  -b Tool  https://gitee.com/guobinyong/Opus.git 工具

如果你想在克隆倉庫時給倉庫設(shè)置一些不同于全局的git配置,可以通過 --config 選項(xiàng),其簡寫選項(xiàng)是 -c,比如,你想給克隆的倉庫設(shè)置 用戶名 和 郵箱:

git clone  --config user.name=郭斌勇 -c user.email=guobinyong@qq.com  https://gitee.com/guobinyong/Opus.git 工具

5.2. 添加跟蹤文件、暫存

git add  文件名

這是個多功能命令,根據(jù)目標(biāo)文件的狀態(tài)不同,此命令的效果也不同:可以用它開始跟蹤新文件,或者把已跟蹤的文件放到暫存區(qū),還能用于合并時把有沖突的文件標(biāo)記為已解決狀態(tài)等;
其實(shí) git add 的潛臺詞就是把目標(biāo)文件快照放入暫存區(qū)域,也就是 add file into staged area,同時未曾跟蹤過的文件標(biāo)記為需要跟蹤。

5.3. 檢查當(dāng)前文件狀態(tài)

git status

5.4. 忽略某些文件

在工作區(qū)根目錄下創(chuàng)建一個名為 .gitignore 的文件,列出要忽略的文件模式;

文件 .gitignore 的格式規(guī)范如下:

  • 所有空行或者以注釋符號 # 開頭的行都會被 Git 忽略。
  • 在一行的末尾添加注釋,會使該行被Git忽略,所以注釋只能獨(dú)占一行,不能添加在行的末尾;
  • 可以使用標(biāo)準(zhǔn)的 glob 模式匹配。
  • 匹配模式最后跟反斜杠(/)說明要忽略的是目錄。
  • 要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(!)取反。

所謂的 glob 模式是指 shell 所使用的簡化了的正則表達(dá)式。

.gitignore 文件的例子:

# 此為注釋 – 將被 Git 忽略

# 忽略所有 .a 結(jié)尾的文件
*.a

# 但 lib.a 除外
!lib.a

# 僅僅忽略項(xiàng)目根目錄下的 TODO 文件,不包括 subdir/TODO
/TODO

# 忽略 build/ 目錄下的所有文件
build/

# 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt

5.5. 查看已暫存和未暫存的更新

git diff

此命令比較的是工作目錄中當(dāng)前文件和暫存區(qū)域快照之間的差異,也就是修改之后還沒有暫存起來的變化內(nèi)容。
若要看已經(jīng)暫存起來的文件和上次提交時的快照之間的差異,可以用 git diff --cached 命令。(Git 1.6.1 及更高版本還允許使用 git diff --staged,效果是相同的,但更好記些。)。

5.6. 提交更新

git commit

這種方式會啟動文本編輯器以便輸入本次提交的說明。(默認(rèn)會啟用 shell 的環(huán)境變量 $EDITOR 所指定的軟件,一般都是 vim 或 emacs。當(dāng)然也可以使用 git config --global core.editor 命令設(shè)定你喜歡的編輯軟件。)

另外也可以用 -m 參數(shù)后跟提交說明的方式,在一行命令中提交更新:

git commit -m “說明文字"

Git 提供了一個跳過使用暫存區(qū)域的方式,只要在提交的時候,給 git commit 加上-a 選項(xiàng),Git 就會自動把所有已經(jīng)跟蹤過的文件暫存起來一并提交,從而跳過 git add 步驟:

git commit -a -m ‘文字說明'

5.7. 移除文件

要從 Git 中移除某個文件,就必須要從已跟蹤文件清單中移除(確切地說,是從暫存區(qū)域移除),然后提交??梢杂?git rm 命令完成此項(xiàng)工作,并連帶從工作目錄中刪除指定的文件,這樣以后就不會出現(xiàn)在未跟蹤文件清單中了,如:

git rm 文件

如果刪除之前修改過并且已經(jīng)放到暫存區(qū)域的話,則必須要用強(qiáng)制刪除選項(xiàng) -f(譯注:即 force 的首字母),以防誤刪除文件后丟失修改的內(nèi)容。

另外一種情況是,我們想把文件從 Git 倉庫中刪除(亦即從暫存區(qū)域移除),但仍然希望保留在當(dāng)前工作目錄中。換句話說,僅是從跟蹤清單中刪除。比如一些大型日志文件或者一堆.a 編譯文件,不小心納入倉庫后,要移除跟蹤但不刪除文件,以便稍后在 .gitignore 文件中補(bǔ)上,用 --cached 選項(xiàng)即可:

git rm --cached 文件

后面可以列出文件或者目錄的名字,也可以使用 glob 模式。比方說:

git rm log/\*.log

注意到星號 * 之前的反斜杠 \,因?yàn)?Git 有它自己的文件模式擴(kuò)展匹配方式,所以我們不用 shell 來幫忙展開(譯注:實(shí)際上不加反斜杠也可以運(yùn)行,只不過按照 shell 擴(kuò)展的話,僅僅刪除指定目錄下的文件而不會遞歸匹配。上面的例子本來就指定了目錄,所以效果等同,但下面的例子就會用遞歸方式匹配,所以必須加反斜杠。)。此命令刪除所有l(wèi)og/ 目錄下擴(kuò)展名為 .log 的文件。類似的比如:

git rm \*~

會遞歸刪除當(dāng)前目錄及其子目錄中所有 ~ 結(jié)尾的文件。

5.8. 移動文件

git mv 文件_from  文件_to

其實(shí),運(yùn)行 git mv 就相當(dāng)于運(yùn)行了下面三條命令:

mv  文件_from  文件_to 
git rm  文件_from 
git add  文件_to

5.9. 查看提交歷史

git log

選項(xiàng)說明:

-p 按補(bǔ)丁格式顯示每個更新之間的差異。
--stat 顯示每次更新的文件修改統(tǒng)計信息。
--shortstat 只顯示 --stat 中最后的行數(shù)修改添加移除統(tǒng)計。
--name-only 僅在提交信息后顯示已修改的文件清單。
--name-status 顯示新增、修改、刪除的文件清單。
--abbrev-commit 僅顯示 SHA-1 的前幾個字符,而非所有的 40 個字符。
--relative-date 使用較短的相對時間顯示(比如,“2 weeks ago”)。
--graph 顯示 ASCII 圖形表示的分支合并歷史。
--pretty 使用其他格式顯示歷史提交信息。可用的選項(xiàng)包括 oneline,short,full,fuller 和 format(后跟指定格式)。
-(n)    僅顯示最近的 n 條提交
--since, --after 僅顯示指定時間之后的提交。
--until, --before 僅顯示指定時間之前的提交。
--author 僅顯示指定作者相關(guān)的提交。
--committer 僅顯示指定提交者相關(guān)的提交。

5.10. 撤消操作

5.10.1. 修改最后一次提交

git commit --amend

此命令將使用當(dāng)前的暫存區(qū)域快照提交。如果剛才提交完沒有作任何改動,直接運(yùn)行此命令的話,相當(dāng)于有機(jī)會重新編輯提交說明,但將要提交的文件快照和之前的一樣。
如果剛才提交時忘了暫存某些修改,可以先補(bǔ)上暫存操作,然后再運(yùn)行 --amend 提交:

git commit -m 'initial commit'
git add forgotten_file
git commit --amend

上面的三條命令最終只是產(chǎn)生一個提交,第二個提交命令修正了第一個的提交內(nèi)容。

5.10.2. 取消已經(jīng)暫存的文件

git reset HEAD <file>…

5.10.3. 取消對文件的修改

git checkout -- <file>…

5.11. 遠(yuǎn)程倉庫

5.11.1. 查看當(dāng)前的遠(yuǎn)程庫

git remote

查看當(dāng)前配置的遠(yuǎn)程倉庫。它會列出每個遠(yuǎn)程庫的簡短名字。在克隆完某個項(xiàng)目后,至少可以看到一個名為 origin 的遠(yuǎn)程庫,Git 默認(rèn)使用這個名字來標(biāo)識你所克隆的原始倉庫;

 -v :(譯注:此為 --verbose 的簡寫,取首字母),顯示對應(yīng)的克隆地址;

5.11.2. 添加遠(yuǎn)程倉庫

 git remote add [倉庫名] [url]

添加一個新的遠(yuǎn)程倉庫,指定名字為 倉庫名,以便將來引用;

5.11.3. 從遠(yuǎn)程倉庫抓取數(shù)據(jù)

git fetch [遠(yuǎn)程倉庫名]

此命令會到名為 遠(yuǎn)程倉庫名 的遠(yuǎn)程倉庫中拉取所有你本地倉庫中還沒有的數(shù)據(jù)。運(yùn)行完成后,你就可以在本地訪問該遠(yuǎn)程倉庫中的所有分支,將其中某個分支合并到本地,或者只是取出某個分支,一探究竟。

如果是克隆了一個倉庫,此命令會自動將遠(yuǎn)程倉庫歸于 origin 名下。所以,git fetch origin 會抓取從你上次克隆以來別人上傳到此遠(yuǎn)程倉庫中的所有更新(或是上次 fetch 以來別人提交的更新)。有一點(diǎn)很重要,需要記住,fetch 命令只是將遠(yuǎn)端的數(shù)據(jù)拉到本地倉庫,并不自動合并到當(dāng)前工作分支,只有當(dāng)你確實(shí)準(zhǔn)備好了,才能手工合并。
如果設(shè)置了某個分支用于跟蹤某個遠(yuǎn)端倉庫的分支,可以使用 git pull 命令自動抓取數(shù)據(jù)下來,然后將遠(yuǎn)端分支自動合并到本地倉庫中當(dāng)前分支。在日常工作中我們經(jīng)常這么用,既快且好。實(shí)際上,默認(rèn)情況下 git clone 命令本質(zhì)上就是自動創(chuàng)建了本地的 master 分支用于跟蹤遠(yuǎn)程倉庫中的 master 分支(假設(shè)遠(yuǎn)程倉庫確實(shí)有 master 分支)。所以一般我們運(yùn)行 git pull,目的都是要從原始克隆的遠(yuǎn)端倉庫中抓取數(shù)據(jù)后,合并到工作目錄中的當(dāng)前分支。

5.11.4. 推送數(shù)據(jù)到遠(yuǎn)程倉庫

git push [遠(yuǎn)程倉庫S] [本地分支L]:[遠(yuǎn)程分支R]

表示:把 本地分支L 推送到 遠(yuǎn)程倉庫S遠(yuǎn)程分支R 中,如果 遠(yuǎn)程倉庫S 中不存在 遠(yuǎn)程分支R,則會在 遠(yuǎn)程倉庫S 中 創(chuàng)建 遠(yuǎn)程分支R 并把 本地分支L 推送到 遠(yuǎn)程分支R 中;如果本地分支L和遠(yuǎn)程分支R名字相同,則可以簡寫為:

git push [遠(yuǎn)程倉庫S] [本地分支L]

只有在所克隆的服務(wù)器上有寫權(quán)限,或者同一時刻沒有其他人在推數(shù)據(jù),這條命令才會如期完成任務(wù)。如果在你推數(shù)據(jù)前,已經(jīng)有其他人推送了若干更新,那 你的推送操作就會被駁回。你必須先把他們的更新抓取到本地,合并到自己的項(xiàng)目中,然后才可以再次推送。

5.11.5. 刪除遠(yuǎn)程分支

git push [遠(yuǎn)程倉庫S] :[遠(yuǎn)程分支R]

這個命令的格式意義比較無理頭,為了方便記憶,可以這樣理解:它是省略了本地分支名的推送命令 git push [遠(yuǎn)程倉庫S] [本地分支L]:[遠(yuǎn)程分支R],省略 本地分支L 表示:在這里提取空白然后把它變成 遠(yuǎn)程分支R。

5.11.6. 查看遠(yuǎn)程倉庫信息

git remote show [遠(yuǎn)程倉庫名]

查看名為 遠(yuǎn)程倉庫名 的遠(yuǎn)程倉庫的詳細(xì)信息

5.11.7. 遠(yuǎn)程倉庫的重命名

 git remote rename  [遠(yuǎn)程倉庫舊名]   [遠(yuǎn)程倉庫新名]

修改某個遠(yuǎn)程倉庫在本地的名稱(新版 Git 中支持);
注意,對遠(yuǎn)程倉庫的重命名,也會使對應(yīng)的分支名稱發(fā)生變化;

5.11.8. 遠(yuǎn)程倉庫的刪除

git remote rm  [遠(yuǎn)程倉庫名]

5.12. 標(biāo)簽

5.12.1. 列出已有的標(biāo)簽

git tag

5.12.2. 新建標(biāo)簽

Git 使用的標(biāo)簽有兩種類型:輕量級的(lightweight)和含附注的(annotated)。輕量級標(biāo)簽就像是個不會變化的分支,實(shí)際上它就是個指向特 定提交對象的引用。而含附注標(biāo)簽,實(shí)際上是存儲在倉庫中的一個獨(dú)立對象,它有自身的校驗(yàn)和信息,包含著標(biāo)簽的名字,電子郵件地址和日期,以及標(biāo)簽說明,標(biāo) 簽本身也允許使用 GNU Privacy Guard (GPG) 來簽署或驗(yàn)證。一般我們都建議使用含附注型的標(biāo)簽,以便保留相關(guān)信息;當(dāng)然,如果只是臨時性加注標(biāo)簽,或者不需要旁注額外信息,用輕量級標(biāo)簽也沒問題。

含附注的標(biāo)簽:
創(chuàng)建一個含附注類型的標(biāo)簽非常簡單,用 -a (譯注:取 annotated 的首字母)指定標(biāo)簽名字即可:

git tag -a v1.4 -m 'my version 1.4’

而 -m 選項(xiàng)則指定了對應(yīng)的標(biāo)簽說明,Git 會將此說明一同保存在標(biāo)簽對象中。如果沒有給出該選項(xiàng),Git 會啟動文本編輯軟件供你輸入標(biāo)簽說明。

可以使用 git show 命令查看相應(yīng)標(biāo)簽的版本信息,并連同顯示打標(biāo)簽時的提交對象。

git show v1.4

輕量級標(biāo)簽:
輕量級標(biāo)簽實(shí)際上就是一個保存著對應(yīng)提交對象的校驗(yàn)和信息的文件。要創(chuàng)建這樣的標(biāo)簽,一個 -a,-s 或 -m 選項(xiàng)都不用,直接給出標(biāo)簽名字即可:

git tag v1.4-lw

5.12.3. 簽署標(biāo)簽

如果你有自己的私鑰,還可以用 GPG 來簽署標(biāo)簽,只需要把之前的 -a 改為 -s (譯注: 取 signed 的首字母)即可:

git tag -s v1.5 -m 'my signed 1.5 tag’

5.12.4. 驗(yàn)證標(biāo)簽

可以使用 git tag -v [標(biāo)簽名] (譯注:取 verify 的首字母)的方式驗(yàn)證已經(jīng)簽署的標(biāo)簽。此命令會調(diào)用 GPG 來驗(yàn)證簽名,所以你需要有簽署者的公鑰,存放在 keyring 中,才能驗(yàn)證:

5.12.5. 后期加注標(biāo)簽

我們忘了在提交 “updated rakefile” 后為此項(xiàng)目打上版本號 v1.2,沒關(guān)系,現(xiàn)在也能做。只要在打標(biāo)簽的時候跟上對應(yīng)提交對象的校驗(yàn)和(或前幾位字符)即可:

git tag -a v1.2 9fceb02

5.12.6. 分享標(biāo)簽

默認(rèn)情況下,git push 并不會把標(biāo)簽傳送到遠(yuǎn)端服務(wù)器上,只有通過顯式命令才能分享標(biāo)簽到遠(yuǎn)端倉庫。其命令格式如同推送分支,運(yùn)行 git push origin [tagname] 即可;
如果要一次推送所有本地新增的標(biāo)簽上去,可以使用 --tags 選項(xiàng);

5.13. 新建分支

git branch  [分支名]

注意:此命令僅僅是建立了一個新的分支,但不會自動切換到這個分支中去;

5.14. 切換分支

switch 和 checkout 都可以切換分支

  • git switch 分支名推薦,版本 2.23 才有 switch 命令;
  • git checkout 分支名

5.15. 新建并切換分支

switch 和 checkout 都可以新建并切換分支

  • git switch 分支名 | git switch -c [分支名]推薦,版本 2.23 才有 switch 命令;
  • git checkout -b [分支名]

相當(dāng)于以下2條命令:

git branch [分支名]
git checkout [分支名]

5.16. 合并分支

設(shè)當(dāng)前分支為A

git merge [分支B]

此命令表示,把分支B合并到分支A

5.17. 刪除分支

git branch -d [分支名]

5.18. 強(qiáng)制刪除分支

git branch -D [分支名]

5.19. 查看當(dāng)前分支列表

git branch

返回結(jié)果如下:

iss53
* master
testing

帶有 * 的分支表示是當(dāng)前所在的分支;

5.20. 查看各個分支最后一次提交對象的信息

git branch -v

5.21. 查看已經(jīng)合并到當(dāng)前所在分支的分支

git branch --merged

5.22. 查看未合并到當(dāng)前所在分支的分支

git branch --no-merged

5.23. 跟蹤遠(yuǎn)程分支

git checkout -b [分支名] [遠(yuǎn)程倉庫名]/[分支名]

在1.6.2 以上版本的 Git,可以用 --track 選項(xiàng)簡化:

git checkout --track [遠(yuǎn)程倉庫名]/[分支名]

5.24. 刪除遠(yuǎn)程分支

git push [遠(yuǎn)程倉庫S] :[遠(yuǎn)程分支R]

這個命令的格式意義比較無理頭,為了方便記憶,可以這樣理解:它是省略了本地分支名的推送命令 git push [遠(yuǎn)程倉庫S] [本地分支L]:[遠(yuǎn)程分支R],省略 本地分支L 表示:在這里提取空白然后把它變成 遠(yuǎn)程分支R

5.25. 分支的變基(衍合)

git rebase [--onto 基分支] [參考分支 [變基分支]]

表示:將包含在 變基分支 但不包含在 參考分支 的提交 追加到 基分支 后面;注意:這個操作更改的是 變基分支,并不更改 基分支,只是以 基分支 為 基;

  • 如果沒指定 基分支,則 基分支 默認(rèn)為 參考分支
  • 如果指定了 變基分支 ,則 git 在執(zhí)行其它操作之前,會先切換到 變基分支,然后再進(jìn)行接下來的變基操作;如果沒有指定 變基分支,則 變基分支 默認(rèn)為 當(dāng)前分支,并且在當(dāng)前分支進(jìn)行變基操作;
  • 如果沒有指定 參考分支,則 參考分支 默認(rèn)為 變基分支 配置的 上游分支

6. 分支、HEAD、ref的區(qū)別

  • ref 就是引用、指針的意思;
  • Git 中的分支,其實(shí)本質(zhì)上僅僅是個指向 提交(commit) 對象的可變指針;創(chuàng)建分支的過程就是創(chuàng)建分支指針;
  • HEAD 是一個總是指向當(dāng)前本地分支指針的指針,它表示當(dāng)前分支;

7. 遠(yuǎn)程分支、遠(yuǎn)程跟蹤分支、跟蹤分支的區(qū)別

  • 遠(yuǎn)程分支:在遠(yuǎn)程倉庫中的分支,就是像本地分支一樣的普通分支,只不過是在遠(yuǎn)程倉庫里;
  • 遠(yuǎn)程跟蹤分支:本地倉庫中用來代表遠(yuǎn)程分支的本地分支,它是只讀的,只是表示遠(yuǎn)程分支的狀態(tài),本地不可修改;
  • 跟蹤分支:已跟蹤了遠(yuǎn)程跟蹤分支的本地分支,可以通過pull和push命令快捷地獲取合并數(shù)據(jù)和推送數(shù)據(jù);

遠(yuǎn)程跟蹤分支 是 跟蹤分支 與 遠(yuǎn)程分支 之間的跟蹤橋梁;

8. 命令詳解

8.1. 克隆clone

語法:

git clone [-b <遠(yuǎn)程分支>] [--single-branch] <遠(yuǎn)程倉庫> [本地目錄]

說明:
遠(yuǎn)程倉庫 克隆指定的 遠(yuǎn)程分支本地目錄 下;
如果 本地目錄 不存在,則會創(chuàng)建相應(yīng)的本地目錄;

選項(xiàng):
-b <遠(yuǎn)程分支> :創(chuàng)建指定 遠(yuǎn)程分支 的跟蹤分支;如果不指定該選項(xiàng),則會自動創(chuàng)建 master 跟蹤分支;
--single-branch : 僅獲取指定的單個分支的數(shù)據(jù),并且僅創(chuàng)建指定分支的遠(yuǎn)程跟蹤分支和跟蹤分支;如果不指定該選項(xiàng),則會獲取遠(yuǎn)程倉庫的所有分支的數(shù)據(jù),并為遠(yuǎn)程倉庫中的所有分支創(chuàng)建相應(yīng)的遠(yuǎn)程跟蹤分支;

8.2. 遠(yuǎn)程remote

remote 命令用于設(shè)置被當(dāng)前本地倉庫跟蹤的遠(yuǎn)程倉庫;

8.2.1. 顯示遠(yuǎn)程倉庫信息

語法:

git remote [-v | --verbose]

說明:
顯示所有的遠(yuǎn)程倉庫;

選項(xiàng):
-v, --verbose :提供更多的信息;

8.2.2. 添加遠(yuǎn)程倉庫

語法:

git remote add {-t <遠(yuǎn)程分支>]} <遠(yuǎn)程倉庫名> <url>

說明:
添加新的遠(yuǎn)程倉庫并命名為 遠(yuǎn)程倉庫名 ,設(shè)置其倉庫地址為 <url>;
遠(yuǎn)程倉庫被添加之后,就可以用命令 git fetch <遠(yuǎn)程倉庫名> 更新 遠(yuǎn)程跟蹤分支;

選項(xiàng):
-t <遠(yuǎn)程分支> :創(chuàng)建指定的 遠(yuǎn)程分支 的遠(yuǎn)程跟蹤分支;可以指定多個 -t <遠(yuǎn)程分支> 創(chuàng)建多個遠(yuǎn)程跟蹤分支;

8.2.3. 設(shè)置遠(yuǎn)程跟蹤分支

語法:

git remote set-branches [--add] <遠(yuǎn)程倉庫> <遠(yuǎn)程分支>...

說明:
重新為 遠(yuǎn)程倉庫遠(yuǎn)程分支 設(shè)置 遠(yuǎn)程跟蹤分支;

選項(xiàng):
--add :為 遠(yuǎn)程倉庫遠(yuǎn)程分支 添加 遠(yuǎn)程跟蹤分支;

8.3. 獲取fetch

語法:

git fetch [選項(xiàng)] [<遠(yuǎn)程倉庫> [[遠(yuǎn)程分支][:<本地分支>]]

說明:
遠(yuǎn)程倉庫 獲取 指定的 遠(yuǎn)程分支 的更新到相應(yīng)的遠(yuǎn)程跟蹤分支,并把數(shù)據(jù)同步到 本地分支;
如果 本地分支 不存在,則會創(chuàng)建該本地分支;

如果省略了 本地分支 (如下)則只是取回指定 遠(yuǎn)程倉庫 的指定 遠(yuǎn)程分支 的更新到到相應(yīng)的遠(yuǎn)程跟蹤分支;

git fetch [選項(xiàng)] <遠(yuǎn)程倉庫> [遠(yuǎn)程分支]

如果省略 遠(yuǎn)程分支本地分支 (如下)則會取回指定 遠(yuǎn)程倉庫 的已被跟蹤的所有遠(yuǎn)程分支的更新到相應(yīng)的遠(yuǎn)程跟蹤分支;

git fetch [選項(xiàng)] <遠(yuǎn)程倉庫>

如果僅省略 遠(yuǎn)程分支 (如下)則會取回指定 遠(yuǎn)程倉庫 的遠(yuǎn) master 遠(yuǎn)程分支的更新到到相應(yīng)的遠(yuǎn)程跟蹤分支,并把數(shù)據(jù)同步到指定的 本地分支;

git fetch [選項(xiàng)] <遠(yuǎn)程倉庫> :<本地分支>

相當(dāng)于:

git fetch [選項(xiàng)] <遠(yuǎn)程倉庫> master:<本地分支>

如果省略 遠(yuǎn)程倉庫遠(yuǎn)程分支本地分支 (如下)則會取回跟蹤的所有倉庫的已被跟蹤的所有分支的更新到相應(yīng)的遠(yuǎn)程跟蹤分支;

git fetch [選項(xiàng)]

8.4. 拉取pull

語法:

git pull [選項(xiàng)] [<遠(yuǎn)程倉庫> [[遠(yuǎn)程分支][:<本地分支>]]

說明:
遠(yuǎn)程倉庫 獲取指定的 遠(yuǎn)程分支 的更新到相應(yīng)的遠(yuǎn)程跟蹤分支,并合并到 本地分支;
如果 本地分支 不存在,則會創(chuàng)建該本地分支;

選項(xiàng):
-f | --force : 強(qiáng)制拉取并合并到 本地分支,如果 遠(yuǎn)程分支本地分支 不一致,則會用 遠(yuǎn)程分支 覆蓋 本地分支
-t | --tags : 從遠(yuǎn)程拉取所有的標(biāo)簽 tag ;
-r | --rebase : 以變基 rebase 的方式進(jìn)行合并;將本地分支中新的提交拼接到上游分支的后面;

8.5. 分支branch

8.5.1. 顯示或刪除分支

語法:

git branch [選項(xiàng)]

說明:
顯示或者刪除(如果指定了刪除選項(xiàng))當(dāng)前倉庫的相關(guān)分支;

選項(xiàng):
-d, --delete :刪除指定的分支;
-D :強(qiáng)制刪除指定的分支;
-a, --all:顯示遠(yuǎn)程跟蹤分支和本地分支;
-r, --remotes :顯示或者刪除遠(yuǎn)程跟蹤分支;
-r, --remotes :顯示或者刪除遠(yuǎn)程跟蹤分支;
-v, -vv, --verbose:提供更多的信息;注意:-v-vv 提供的信息不一樣;

8.5.2. 創(chuàng)建分支

語法:

git branch [--set-upstream | --track] <分支名> [<起始指針>]

說明:
創(chuàng)建新分支并設(shè)置其名這 分支名 ,且設(shè)置該分支的起始指針為 起始指針;

選項(xiàng):
--set-upstream | --track :跟蹤 起始指針 所指向的分支;

8.5.3. 為分支設(shè)置上游分支(遠(yuǎn)程跟蹤分支)

語法:

git branch (--set-upstream-to=<上游分支> | -u <上游分支>) [<分支>]

說明:
為指定的 分支 設(shè)置 上游分支 (即遠(yuǎn)程跟蹤分支); 如果沒有指定 分支 則默認(rèn)使用當(dāng)前所在分支;

8.6. 提交commit

語法:

git commit [--amend] [-m <提交說明>]

說明:
提交暫存的更新;

選項(xiàng):
-m <提交說明> :指定提交說明;如果不指定該選項(xiàng),則會啟動文本編輯器以便輸入本次提交的說明;
--amend :修改最后一次的提交;即不會生成新的提交對象;

8.7. 推送push

語法:

git push [-u | --set-upstream] [--tags] [-f | --force] [--force-with-lease] [遠(yuǎn)程倉庫S] [本地分支L][:<遠(yuǎn)程分支R>]

說明:

  • 表示:把 本地分支L 推送到 遠(yuǎn)程倉庫S遠(yuǎn)程分支R 中,如果 遠(yuǎn)程倉庫S 中不存在 遠(yuǎn)程分支R,則會在 遠(yuǎn)程倉庫S 中 創(chuàng)建 遠(yuǎn)程分支R 并把 本地分支L 推送到 遠(yuǎn)程分支R 中;
  • 如果省略了 遠(yuǎn)程分支R ,即:git push [遠(yuǎn)程倉庫S] [本地分支L],則會把本地分支L 推送到 遠(yuǎn)程倉庫S 中與 本地分支L 同名的遠(yuǎn)程分支中;
  • 如果省略了 本地分支L ,即:git push [遠(yuǎn)程倉庫S] :[遠(yuǎn)程分支R],則會刪除 遠(yuǎn)程倉庫S 中的 遠(yuǎn)程分支R

注意:
只有在所克隆的服務(wù)器上有寫權(quán)限,或者同一時刻沒有其他人在推數(shù)據(jù),這條命令才會如期完成任務(wù)。如果在你推數(shù)據(jù)前,已經(jīng)有其他人推送了若干更新,那 你的推送操作就會被駁回。你必須先把他們的更新抓取到本地,合并到自己的項(xiàng)目中,然后才可以再次推送。

選項(xiàng):
-u | --set-upstream : 為推送的每一個分支設(shè)置設(shè)置上游分支(遠(yuǎn)程跟蹤分支);
--tags : 推送所有本地新增的標(biāo)簽到遠(yuǎn)程倉庫;默認(rèn)情況下,push 并不會把標(biāo)簽推送到遠(yuǎn)程倉庫中,只有通過顯式命令才能推送標(biāo)簽到遠(yuǎn)程倉庫;
-f | --force : 強(qiáng)制推送,如果 遠(yuǎn)程分支本地分支 不一致,則會用 本地分支 覆蓋 遠(yuǎn)程分支;
--force-with-lease : 比 -f | --force 更安全一些強(qiáng)制推送,如果 遠(yuǎn)端倉庫 的 目標(biāo)分支 有其他人推送了新的提交,且這些提交還沒有被 fetch本地倉庫,那么推送將會被拒絕;

9. 技術(shù)及Git問題解決方案

關(guān)于Git的技巧和一些問題的解決方案請看 Git技巧和問題解決方案

10. 相關(guān)文章

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

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

  • Add & Commit git init 初始化一個 Git 倉庫(repository),即把當(dāng)前所在目錄變成...
    冬絮閱讀 5,125評論 0 9
  • 一、 Git 命令初識 在正式介紹Git命令之前,先介紹一下Git 的基本命令和操作,對Git命令有一個總體的認(rèn)識...
    Eenmaal_7a01閱讀 474評論 0 0
  • Git命令 # git知識點(diǎn) ##用命令行創(chuàng)建一個新的存儲庫 echo "# Documents" >> READ...
    呼呼哥閱讀 446評論 0 0
  • Git常用操作命令: 遠(yuǎn)程倉庫相關(guān)命令檢出倉庫:$ git clone git://github.com/jque...
    pauljun閱讀 697評論 0 4
  • 今天是周二,坐標(biāo)北京~ 天氣 霧霾。又是快要一天了。感覺時間過得好快! Git常用命令 查看、添加、提交、刪除、找...
    嗯_新閱讀 471評論 0 14

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