Git遠程操作
一 跟蹤分支與跟蹤遠程分支
當進行Git遠程操作的時候,有兩個概念需要掌握:
跟蹤分支 -- tracking branch
跟蹤遠程分支 -- remote tracking branch
那么在Git本地操作中,分支只是指向某個commit對象的引用,那么跟蹤分支和遠程跟蹤分支在本地倉庫中具體又是指什么呢?
上圖中,https://yourrepohost/project.git是遠程倉庫,此時遠程master分支指向版本C2
git clone https://yourrepohost/project.git是將遠程倉庫clone到本地形成local repo,此時會形成一個origin/master的引用,這個origin/master就是我們所說的遠程跟蹤分支,是用戶只讀的。同時還會根據 origin/master生成一個本地的master分支,同樣也是指向C2,這個master分支就是跟蹤分支,是用戶可寫的。
那么用戶只讀,用戶可寫又是什么意思呢?下面先來看一張圖
當添加一個本地提交C3時,本地的master也將移向C3,當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的,在這樣的狀態下,如果做了一些提交,并切換回master分支,然后 再切換回origin/master,那么上次提交的文件將不會存在,除非使用reflog(維護HEAD引用的變化歷史)去尋回。
二 Git遠程協作的主要命令
除了 git clone 是從服務器初次獲取數據之外,我們還可以通過 git fetch 和 git pull 從服務器獲取數據。git fetch相當于從遠程獲取最新版本到本地,但不會自動merge,而git pull相當于從遠程獲取最新版本并merge到本地,git pull命令相當于git fetch和git merge。而在實際應用中,git fetch是更安全一些的,因為在merge前,我們還可以查看更新的情況,然后再決定是否要合并。
下面來看幾個場景:
場景1 :使用git clone克隆github上的遠程master分支到本地后,再對github上的遠程master分支上的文件做修改,此時如果想要從本地將遠程master分支上的內容獲取到,就可以使用 git fetch 去拉取數據
git fetch后查看歷史信息,可以看到,此時origin/master已經移動到最新的版本,而本地master/HEAD還在原來的位置
那么此時就要使用 git merge origin/maste r 來合并origin/master 讓本地master/HEAD也移動到最新的版本
場景2 : 假設我在本地修改了remote.txt的文件,而另外一個人也對remote.txt做 了修改并git push了到了遠程分支,此時我在本地如果使用git push的話是不行的,因為遠程分支上有一些文件的修改是你本地所沒有的,如果強制push的話,就會覆蓋掉遠程分支上的文件,所以在這樣的情況下就必須 先git pull(git fetch+git merge)從遠程獲取最新的數據到本地
但此時可以看到,本地和遠程都對同一文件做了修改,因此產生了沖突,所在在merge的時候會提示處理沖突
<<<<<<< 和 =====之間的內容是本地所做的修改, ===== 和 >>>>>>之間的內容是遠程分支所做的修改
將不需要的內容刪除后再進行git add - git commit - git push操作就可以將內容推送到遠程倉庫中.
如果git push后還想對此次最新的提交打上tag,可以使用git tag -a v1 -m "tag for v1"給此次提交打上帶注解的tag,git push是默認不將tag 推送到遠程分支上的,所以這里使用git push --tag對遠程分支上的版本打上tag
場景3 :假設本地和遠程倉庫都有一個feacher分支,我們想要刪除該怎么做?
先切換到除feacher分支之外的其他分支,比如master分支,然后使用git branch -d feacher先刪除本地的feacher分支,然后使用git push --delete origin feacher刪除了遠程倉庫中的feacher分支
還有另外一種方法也可以刪除遠程倉庫中的分支, 使用git push origin :feacher去刪除,這條命令的意思,就是在遠程倉庫中使用一個空的分支替代feacher分支,注意origin后面先是一個空格然后再跟上冒號