本文首發於公衆號“AntDream”,歡迎微信搜索“AntDream”或掃描文章底部二維碼關注,和我一起每天進步一點點
Git系列
- Git原理之時光機和分佈式
- Git的三個工作區和文件的三種狀態
- Git branch 命令 分支顯示不全
- Git倉庫目錄探祕
- Git是如何保存文件名和目錄關係的---樹對象
- Git是如何保存和記錄數據的——數據對象
- Git是如何保存作者和時間等信息的---提交對象
- 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/*
分支。
歡迎關注我的公衆號查看更多精彩文章!