Git常見分支問題各個擊破

本文首發於公衆號「AntDream」,歡迎微信搜索「AntDream」或掃描文章底部二維碼關注,和我一塊兒天天進步一點點git

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

git checkout -b XXX origin/XXX
複製代碼

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

而本地的遠程引用只有在和遠程倉庫溝通時纔會更新。換句話說,咱們的本地倉庫不少時候並非最新的,其餘小夥伴推到遠程的分支咱們若是不拉取是沒有的。微信

因此咱們須要先更新一下,把新的分支拉到咱們的本地倉庫中,執行一下 git fetch 就行了。markdown

Git fetch和Git pull

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/* 分支。


歡迎關注個人公衆號查看更多精彩文章!
複製代碼

AntDream
相關文章
相關標籤/搜索