Git常見分支問題各個擊破

本文首發於公衆號“AntDream”,歡迎微信搜索“AntDream”或掃描文章底部二維碼關注,和我一起每天進步一點點

Git系列

爲什麼已經推到遠程的分支,我本地checkout的時候還是提示找不到分支?

首先我們要弄清楚的是,checkout 是本地命令,不跟遠程倉庫打交道。我們基於遠程分支新建一個分支時一般會這樣操作:

git checkout -b XXX origin/XXX

實際上,上面的命令並不是從遠程倉庫拉分支下來切換,而是從我們本地的遠程引用中切換新分支,也就是從我們本地的Git倉庫中的 refs/remotes 目錄下面。

而本地的遠程引用只有在和遠程倉庫溝通時纔會更新。換句話說,我們的本地倉庫很多時候並不是最新的,其他小夥伴推到遠程的分支我們如果不拉取是沒有的。

所以我們需要先更新一下,把新的分支拉到我們的本地倉庫中,執行一下 git fetch 就好了。

Git fetch和Git pull

git fetch 是從遠程倉庫拉取本地沒有的數據,不會修改工作目錄的內容。獲取的數據包括遠程新的分支、新的提交等,更新的是遠程引用。

git pull 基本就相當於 git fetch 加上 git merge,也就是除了拉取新的數據外,它還會把當前分支對應的遠程分支上的內容 merge 到當前分支。所以很多時候,我們用 git pull 以後都會報衝突,就是因爲Git自己執行了merge操作。

非常重要的是,如果我們是和其他小夥伴在同一個分支合作開發,我們在 push 之前,必須先拉取一下。

回滾遠程倉庫時,git push origin HEAD --force的原理是什麼?實際上是做了啥操作?

實際上是把本地分支指向的 commit 強制更新到了遠程對應的分支。

如何用命令刪除遠程分支?刪除遠程倉庫分支實際是幹了啥?(謹慎操作)

// -D 大寫,表示強制刪除
git branch -d branchName

我們知道分支實際上是 resf/heads/下面的一個文件,裏面保存的是最新的一次 commit 的SHA-1值。實際上,刪除分支就是刪除了這個引用文件,那刪除遠程倉庫的分支也就是刪除遠程倉庫下面的對應分支的引用。

明白了刪除遠程倉庫分支的原理,我們來看看刪除遠程倉庫分支的命令:

git push origin :branchName

上面命令的意思就是將遠程倉庫的 branchName 的分支引用置爲空。

引用規格

上面的命令實際上是一種引用規格的應用,引用規格的形式爲 <src>:<dst>,其中 <src><dst> 是一個模式(pattern)。之前在講到 git fetch 的時候我們提到了 Git倉庫目錄下的 config文件:

[remote "origin"]
    url = https://github.com/schacon/simplegit-progit
    fetch = +refs/heads/*:refs/remotes/origin/*

上面的 fetch實際上就是應用到了引用規格,含義之前已經提到過,就是把遠程倉庫 refs/heads/ 目錄下的引用更新到本地倉庫的 refs/remotes/origin/

實際上,我們還可以設置 push 操作的引用規格。比如我們想將當前的 master 分支推送到遠程倉庫的mymaster 分支,我們就可以這樣:

git push origin master:refs/heads/mymaster

更進一步的,如果我們想把自己分支都推送到遠程倉庫的 KAE 目錄下,我們就可以在 config 目錄下更新一條關於 push 操作的引用規格:

[remote "origin"]
    url = https://github.com/schacon/simplegit-progit
    //fetch中冒號前面的表示是遠程倉庫的引用,後面的表示那些遠程引用在本地所對應的位置
    fetch = +refs/heads/*:refs/remotes/origin/*
    //push相反,前面的是本地的引用位置,後面的表示遠程倉庫的地址
    push = refs/heads/*:refs/heads/ant/*

經過上面的設置以後,我們每次 push 都會把本地的分支推送到遠程倉庫的 ant/* 分支。


                         歡迎關注我的公衆號查看更多精彩文章!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章