1、基礎瞭解
- 跟蹤分支(tracking branch)
- 遠程跟蹤 分支(remote tracking branch)
- 分支只是指向某個commit對象的引用,
2、深入理解跟蹤分支與遠程跟蹤分支
- 假設遠程倉庫有兩個commit(提交),分別是C1與C2,並且當前分支是master指向這個最新提交C2.
- 通過命令:
git clone 遠程倉庫地址
,將這個遠程倉庫克隆到本地中,會在本地倉庫生成一個origin/master的引用並且指向最新的提交C2(此處對應遠程倉庫的分支master指向的最新提交的C2),此時這個origin/master即爲遠程跟蹤分支,它是用戶只讀。
- 建立了這樣的引用後還會根據origin/master生成一個master分支指向同一個C2,這個分支即爲跟蹤分支,這個是用戶可寫的。
- 我們在本地新添加一個commit(提交)C3,這時master的應用就指向了這個C3,即master所指向的內容是我們本地提交的時候可以改變的(也就是如果本地提交了C3此時master就指向C3,如果本地又提交了C4此時master就指向C4)
- 本地提交C3後master指向了C3,那麼origin/master是如何變更呢?此時我們通過命令:git push,將本地倉庫推送到遠程倉庫中,此處遠程倉庫中的分支master也指向了最新的提交C3。
- 此時git push還會做一件事情,它會將本地的origin/master指向本地的C3,我們本地是不能修改origin/master的指向的。
- 遠程跟蹤分支用戶只讀還有一層意思就是:我們咋git本地操作中,可以通過命令:git checkout master來切換到master分支,這時相當於吧HEAD引用指向了master分支。但是如果我們使用:git checkout origin/master的時候我們的HEAD引用並不會指向origin/master,當我們執行了git checkout origin/master這個操作後我們是處於detached Head狀態下,在這種狀態下繼續提交的話再切換爲master分支那我們這些提交只能通過reflog這個記錄來尋回了,而不能通過origin/master來找回我們的提交。
3、實戰講解
- 準備工作:現在遠程倉庫中新建一個test01倉庫,新建一個001.txt文件,文件內容爲111111;在本地任意磁盤中新建一個文件用於存放遠程倉庫(此處爲E:\github_test),將遠程倉庫克隆到本地倉庫中。
- 進入到克隆下來的倉庫文件夾中,查看當前歷史歷史,可以看到origin/master與master均指向藍色線處的提交。
- 新建一個提交:修改001.txt文件,並提交。此時再次查看歷史,即可看到分支master已經比origin/master前進了一個提交。通過命令:
git push origin master
,把分支maste推送到遠程倉庫中。再次查看本地歷史,即可看到分支master與origin/master已經同時指向了新的提交。
- 此時當我們通過命令:
git checkout origin/master
切換到origin/master分支時,會看到一段提示:當前處於detached HEAD狀態,你可以在這個狀態下繼續提交,但是當你切換到別的分支的時候你在detached HEAD狀態下的這些提交就比較難尋回了,這是由於我們的HEAD應用無法指向origin/master引用(這就是遠程跟蹤分支用戶只讀的另一意思)
4、如何獲取遠程倉庫最新提交
- 加上別人給遠程倉庫test01新添加了一個C4,此時遠程倉庫的分支master就指向這個最新的提交C4。通過命令:
git fetch
獲取遠程倉庫最新提交C4,此時本地倉庫origin/master比分支master前進了一個提交(即:origin/master已經指向了最新提交C4)
- 通過命令:git merge origin/master將新的提交合並單本地的分支master上,此時分支master指向C4。(這裏我們可能講解時比較順利,時間本地可能還有別的提交,可能還會報衝突,此時需要我們解決衝突後才能合併)
- 實戰講解:在github遠程倉庫中手動修改001.txt文件(此處是新增了一行333333),通過命令:
git fetch origin
獲取遠程最新提交,通過命令:git merge origin/master
將新的提交合併到本地的分支master上
- 通過命令:git pull origin命令也可獲取遠程最新提交,但是在獲取後會自動合併到本地的分支master上。即git pull相當於git fetch + git merger這兩個操作。一般建議是用git fetch和git merger。因爲我們再進行git fetch後可以看到跟蹤分支與遠程跟蹤分支的一個差異。