以下內(nèi)容是我在學(xué)習(xí)和研究Git時,對Git操作的特性、重點(diǎn)和注意事項(xiàng)的提取、精練和總結(jié),可以做為Git操作的字典,方便大家查閱;如果你從未接觸過Git,希望看一個入門級別的教程,請移步到《Git基礎(chǔ)教程》
備注:本文會不斷更新完善;
目錄
- 1. 語法格式描述
- 2. 存放git環(huán)境變量的幾個位置
- 3. 配置
- 4. 獲取幫助
-
5. Git常用命令
- 5.1. 獲得項(xiàng)目的Git倉庫
- 5.2. 添加跟蹤文件、暫存
- 5.3. 檢查當(dāng)前文件狀態(tài)
- 5.4. 忽略某些文件
- 5.5. 查看已暫存和未暫存的更新
- 5.6. 提交更新
- 5.7. 移除文件
- 5.8. 移動文件
- 5.9. 查看提交歷史
- 5.10. 撤消操作
- 5.11. 遠(yuǎn)程倉庫
- 5.12. 標(biāo)簽
- 5.13. 新建分支
- 5.14. 切換分支
- 5.15. 新建并切換分支
- 5.16. 合并分支
- 5.17. 刪除分支
- 5.18. 強(qiáng)制刪除分支
- 5.19. 查看當(dāng)前分支列表
- 5.20. 查看各個分支最后一次提交對象的信息
- 5.21. 查看已經(jīng)合并到當(dāng)前所在分支的分支
- 5.22. 查看未合并到當(dāng)前所在分支的分支
- 5.23. 跟蹤遠(yuǎn)程分支
- 5.24. 刪除遠(yuǎn)程分支
- 5.25. 分支的變基(衍合)
- 6. 分支、HEAD、ref的區(qū)別
- 7. 遠(yuǎn)程分支、遠(yuǎn)程跟蹤分支、跟蹤分支的區(qū)別
- 8. 命令詳解
- 9. 技術(shù)及Git問題解決方案
- 10. 相關(guān)文章
內(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 [命令] --helpman git
比如,要學(xué)習(xí) config 命令可以怎么用,運(yùn)行:
git help config
5. Git常用命令
5.1. 獲得項(xiàng)目的Git倉庫
有2種獲得 Git 項(xiàng)目倉庫的方法:
- 通過Git的init命令初始化一個新倉庫;
- 通過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技巧和問題解決方案