本文首發於公衆號「AntDream」,歡迎微信搜索「AntDream」或掃描文章底部二維碼關注,和我一塊兒天天進步一點點git
首先咱們要弄清楚的是,checkout
是本地命令,不跟遠程倉庫打交道。咱們基於遠程分支新建一個分支時通常會這樣操做:github
git checkout -b XXX origin/XXX
複製代碼
實際上,上面的命令並非從遠程倉庫拉分支下來切換,而是從咱們本地的遠程引用中切換新分支,也就是從咱們本地的Git倉庫中的 refs/remotes
目錄下面。bash
而本地的遠程引用只有在和遠程倉庫溝通時纔會更新。換句話說,咱們的本地倉庫不少時候並非最新的,其餘小夥伴推到遠程的分支咱們若是不拉取是沒有的。微信
因此咱們須要先更新一下,把新的分支拉到咱們的本地倉庫中,執行一下 git fetch
就行了。markdown
git fetch
是從遠程倉庫拉取本地沒有的數據,不會修改工做目錄的內容。獲取的數據包括遠程新的分支、新的提交等,更新的是遠程引用。fetch
git pull
基本就至關於 git fetch
加上 git merge
,也就是除了拉取新的數據外,它還會把當前分支對應的遠程分支上的內容 merge
到當前分支。因此不少時候,咱們用 git pull
之後都會報衝突,就是由於Git本身執行了merge
操做。url
很是重要的是,若是咱們是和其餘小夥伴在同一個分支合做開發,咱們在 push
以前,必須先拉取一下。spa
git push origin HEAD --force
的原理是什麼?其實是作了啥操做?其實是把本地分支指向的 commit
強制更新到了遠程對應的分支。code
// -D 大寫,表示強制刪除 git branch -d branchName 複製代碼
咱們知道分支其實是 resf/heads/
下面的一個文件,裏面保存的是最新的一次 commit 的SHA-1值。實際上,刪除分支就是刪除了這個引用文件,那刪除遠程倉庫的分支也就是刪除遠程倉庫下面的對應分支的引用。orm
明白了刪除遠程倉庫分支的原理,咱們來看看刪除遠程倉庫分支的命令:
git push origin :branchName
複製代碼
上面命令的意思就是將遠程倉庫的 branchName
的分支引用置爲空。
上面的命令其實是一種引用規格的應用,引用規格的形式爲 :,其中 <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/*
分支。
歡迎關注個人公衆號查看更多精彩文章!
複製代碼