1. 程式人生 > >【版本管理】Git push與pull的預設行為

【版本管理】Git push與pull的預設行為

git push

通常對於一個本地的新建分支,例如git checkout -b develop, 在develop分支commit了程式碼之後,如果直接執行git push命令,develop分支將不會被push到遠端倉庫(但此時git push操作有可能會推送一些程式碼到遠端倉庫,這取決於我們本地git config配置中的push.default預設行為,下文將會逐一詳解)。

因此我們至少需要顯式指定將要推送的分支名,例如git push origin develop,才能將本地新分支推送到遠端倉庫。

當我們通過顯式指定分支名進行初次push操作後,本地有了新的commit,此時執行git push

命令會有什麼效果呢?

如果你未曾改動過git config中的push.default屬性,根據我們使用的git不同版本(Git 2.0之前或之後),git push通常會有兩種截然不同的行為:

  1. develop分支中本地新增的commit被push到遠端倉庫
  2. push失敗,並收到git如下的警告
fatal: The current branch new has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin develop

為什麼git版本不同會有兩種不同的push行為?

因為在git的全域性配置中,有一個push.default屬性,其決定了git push操作的預設行為。在Git 2.0之前,這個屬性的預設被設為'matching',2.0之後則被更改為了'simple'。

我們可以通過git version確定當前的git版本(如果小於2.0,更新是個更好的選擇),通過git config --global push.default 'option'改變push.default的預設行為(或者也可直接編輯~/.gitconfig檔案)。

push.default 有以下幾個可選值:
nothing, current, upstream, simple, matching

其用途分別為:

  • nothing - push操作無效,除非顯式指定遠端分支,例如git push origin develop(我覺得。。。可以給那些不願學git的同事配上此項)。

  • current - push當前分支到遠端同名分支,如果遠端同名分支不存在則自動建立同名分支。

  • upstream - push當前分支到它的upstream分支上(這一項其實用於經常從本地分支push/pull到同一遠端倉庫的情景,這種模式叫做central workflow)。

  • simple - simple和upstream是相似的,只有一點不同,simple必須保證本地分支和它的遠端
    upstream分支同名,否則會拒絕push操作。

  • matching - push所有本地和遠端兩端都存在的同名分支。

因此如果我們使用了git2.0之前的版本,push.default = matching,git push後則會推送當前分支程式碼到遠端分支,而2.0之後,push.default = simple,如果沒有指定當前分支的upstream分支,就會收到上文的fatal提示。

upstream & downstream

git中存在upstream和downstream,簡言之,當我們把倉庫A中某分支x的程式碼push到倉庫B分支y,此時倉庫B的這個分支y就叫做A中x分支的upstream,而x則被稱作y的downstream,這是一個相對關係,每一個本地分支都相對地可以有一個遠端的upstream分支(注意這個upstream分支可以不同名,但通常我們都會使用同名分支作為upstream)。

初次提交本地分支,例如git push origin develop操作,並不會定義當前本地分支的upstream分支,我們可以通過git push --set-upstream origin develop,關聯本地develop分支的upstream分支,另一個更為簡潔的方式是初次push時,加入-u引數,例如git push -u origin develop,這個操作在push的同時會指定當前分支的upstream。

注意push.default = current可以在遠端同名分支不存在的情況下自動建立同名分支,有些時候這也是個極其方便的模式,比如初次push你可以直接輸入 git push 而不必顯示指定遠端分支。

git pull

弄清楚git push的預設行為後,再來看看git pull

當我們未指定當前分支的upstream時,通常git pull操作會得到如下的提示:

There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> new1

git pull的預設行為和git push完全不同。當我們執行git pull的時候,實際上是做了git fetch + git merge操作,fetch操作將會更新本地倉庫的remote tracking,也就是refs/remotes中的程式碼,並不會對refs/heads中本地當前的程式碼造成影響。

當我們進行pull的第二個行為merge時,對git來說,如果我們沒有設定當前分支的upstream,它並不知道我們要合併哪個分支到當前分支,所以我們需要通過下面的程式碼指定當前分支的upstream:

git branch --set-upstream-to=origin/<branch> develop
// 或者git push --set-upstream origin develop 

實際上,如果我們沒有指定upstream,git在merge時會訪問git config中當前分支(develop)merge的預設配置,我們可以通過配置下面的內容指定某個分支的預設merge操作

[branch "develop"]
    remote = origin
    merge = refs/heads/develop // [1]為什麼不是refs/remotes/develop?

或者通過command-line直接設定:

git config branch.develop.merge refs/heads/develop

這樣當我們在develop分支git pull時,如果沒有指定upstream分支,git將根據我們的config檔案去merge origin/develop;如果指定了upstream分支,則會忽略config中的merge預設配置。

以上參考原文:https://segmentfault.com/a/1190000002783245

最近使用git pull的時候多次碰見下面的情況:
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

git branch --set-upstream-to=origin/<branch> release

其實,輸出的提示資訊說的還是比較明白的。

使用git在本地新建一個分支後,需要做遠端分支關聯。如果沒有關聯,git會在下面的操作中提示你顯示的新增關聯。

關聯目的是在執行git pull, git push操作時就不需要指定對應的遠端分支,你只要沒有顯示指定,git pull的時候,就會提示你。

解決方法就是按照提示新增一下:

git branch --set-upstream-to=origin/remote_branch  your_branch

其中,origin/remote_branch是你本地分支對應的遠端分支;your_branch是你當前的本地分支。

相關推薦

版本管理Git pushpull預設行為

git push 通常對於一個本地的新建分支,例如git checkout -b develop, 在develop分支commit了程式碼之後,如果直接執行git push命令,develop分支將不會被push到遠端倉庫(但此時git push操作有可能會推送一些

版本管理Git使用

git init      在本地新建一個repo,進入一個專案目錄,執行git init,會初始化一個repo,並在當前資料夾下建立一個.git資料夾. git clone      獲取一個url對應的遠端Git repo, 建立一個local copy.      一般的格式是git clone [u

Git pushpull預設行為

最近使用git pull的時候多次碰見下面的情況: There is no tracking information for the current branch. Please specify which branch you want to merge with

專案管理git和碼雲的使用

緣起 說了那麼多關於git和碼雲相關的事,一直都沒給大夥講解這個碼雲究竟是個啥玩意兒。 今天就給大夥說說如何通過git和碼雲搭建屬於自己的程式碼庫。 碼雲 碼雲([email protected])是開源中國社群團隊推出的基於Git的快速的、免費的、穩定

SVN版本管理

svn版本管理第1章 SVN希望大家可以一起學習,可以加筆者QQ864161921.1 SVN簡介SVN是Subversion的簡稱,是一個開放源代碼的版本控制系統。Subversion管理著隨時間改變的數據。這些數據放置在一個中央資料檔案庫(repository)中。這個檔案庫很像一個普通的文件服務器,不過

版本管理工具gitsvn簡介

clear 碼代碼 check fig 常用指令 ons 自己的 開發 1.0 版本管理工具 版本管理工具簡介 常見版本管理工具 cvs(Concurrent Versions System) vss(Visual SourceSafe) svn 常用的版本管理工具 g

Git衝突解決方法 Git衝突解決方法

本文轉載自:https://www.cnblogs.com/gavincoder/p/9071959.html Git衝突與解決方法 1、git衝突的場景 情景一:多個分支程式碼合併到一個分支時; 情景二:多個分支向同一個遠端分支推送程式碼時; 實際上,push操作即是將

Git專案管理git新手入門——基礎教程

一、Git工作流程   直接上手看圖,瞭解Git工具的工作流程:   以上包括一些簡單而常用的命令,但是先不關心這些,先來了解下面這4個專有名詞。 Workspace:工作區 Index / Stage:暫存區 Repository:

已解決 git本地不能push到github上

Updates were rejected because a pushed branch tip is behind its remotehint: counterpart. Check out this branch and integrate the remote ch

專案管理Jenkins+Maven+Git專案持續構建之前言

         接下來的幾篇部落格,想系統的整理一下基於Jenkins+Maven+Git的專案持續構建自動部署系列。其實Jenkins、Nexus早在好幾年前就已經在使用了,這一次是想作為系統性的

版本管理-圖解Git的分支管理原理,深度分析fetch和pull區別

1分散式與集中式 1)Git是分散式,無SVN那樣的“中央伺服器”; 2)Git每個人電腦裡都有完整的版本庫,但是SVN的中央伺服器出了問題,所有人都沒法幹活了;Git除了每人都有一個版本庫外,還有一個遠端倉庫,SVN只有一個版本庫; 3)SVN適合於區域

專案管理Jenkins+Maven+Git專案持續構建之搭建git伺服器

gitlab和github兩者都是基於web的Git repositories(倉庫),擁有流水線型的web開發流程,它們為開發團隊儲存、分享、釋出、測試和合作web開發專案提供了中心化的、雲端儲存的場所。Git版本控制——對於多人共同開發一個project來說

Android開發之FragmentAcitvity通信

對象 p s ets roi mit blog () open findview   上一篇我們講到與Fragment有關的經常使用函數,既然Fragment被稱為是“小Activity”。如今我們來講一下Fragment怎樣與Acitivity通信。

Source教程VTFEdit安裝使用方法

協議 gre 方式 installer tar 有意 menu get 也會 返回【Source教程】文章目錄 一、下載與安裝 下載地址在這裏。 首先打開VTFEdit的下載地址。 找到網頁上的Download,點擊Installer,下載VTFEdit安裝版。

幹貨Jquery.DatablesBootstrap3的組合使用

rec btn over pac .cn 拼接 blank com lin 官方地址 datatables官方網址:www.datatables.net 下載bootstrap3與datables文件包 引用文件 css:bootstrap.css、da

研發管理從技術到管理,思維轉變是關鍵

轉變 問題 時間 感覺 希望 思維方式 的人 思維 clas IT研發的管理人員大多是從公司內部的技術人員提拔的,在快速發展的公司裏,這樣的機會更多。然而這種“半路出家”的轉型也給我們帶來了很多挑戰,其中最關鍵部分在於思維方式的轉變。 1、 從個人成就到團隊成就。無論是

Jmeter----Mac電腦環境配置打開Jmeter界面

ron nes acl 配置 tool height 一個 sdk open 前提條件:打開Jmeter界面,首先需要安裝java並配置環境變量。 第一步:下載並安裝jdk和環境配置   java jdk下載:http://www.oracle.com/technetwor

知識小結Git 個人學習筆記及心得

art over round TP 緩存 PE QQ 的區別 rda https://mp.weixin.qq.com/s/D96dXYfu3XAA4ac456qo0g git架構 工作區:就是你在電腦裏能看到的目錄。 版本庫:工作區有一個隱藏目錄.git,,而是

學習筆記連通分量Tarjian

空格 top set dfs memset ridge ins define 同學 連通分量與Tarjian 所以Tarjian到底怎麽讀 強連通分量 基本概念 強連通 如果兩個頂點可以相互通達,則稱兩個頂點強連通 強連通圖 如果有向圖G的每兩個頂點都強連通,稱G

機器視覺 概率模型計算機視覺

 概率模型與計算機視覺” 林達華 美國麻省理工學院(MIT)博士 上世紀60年代, Marvin Minsky 在MIT讓他的本科學生 Gerald Jay Sussman用一個暑假的時間完成一個有趣的Project : “link a camera to a comput