0%

本地Git仓库和远程仓库的创建及关联

git本地新建一个分支后,必须要做远程分支关联。如果没有关联,git会在下面的操作中提示你显示的添加关联。关联目的是如果在本地分支下操作: git pull, git push ,不需要指定在命令行指定远程的分支.推送到远程分支后,你只要没有显示指定,git pull的时候,就会提示你。

跟踪远程分支

使用--set-upstream去跟踪远程分支:

$ git branch --set-upstream
  master
* source

新建本地仓库

需要做关联,操作如下:

git init
git add xxx
git ci -m "log"
git remote add origin git@github.com:zzz/xxx.git
git push -u origin master
  • origin:远程仓库名字; master:分支
  • 第一次push的时候,加上-u参数, Git就会把本地的master分支和远程的master分支进行关联起来,我们以后的push操作就不再需要加上-u参数了
  • 分支可以将 master 修改为其他分支

git clone 分支

直接 git clone 某个分支:

git clone -b <branch> <remote_repo>
git clone -b source <remote_repo>

默认分支为 master-b 可以指定分支。

git push

当执行 git push 时出现如下提示:

warning: push.default 尚未设置,它的默认值在 Git 2.0 已从 'matching' 变更为 'simple'。若要不再显示本信息并保持传统习惯,进行如下设置:

git config --global push.default matching

若要不再显示本信息并从现在开始采用新的使用习惯,设置:

git config --global push.default simple

当 push.default 设置为 'matching' 后,git 将推送和远程同名的所有本地分支。

从 Git 2.0 开始,Git 默认采用更为保守的 'simple' 模式,只推送当前分支到远程关联的同名分支,即 'git push' 推送当前分支。

设置如下:

git config --global push.default simple

git pull

执行i 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?

config文件

最终所有的修改都是修改 config 文件,如下:

[core]                                                                                                                             
    repositoryformatversion = 0                                               
    filemode = true                                                           
    bare = false                                                              
    logallrefupdates = true                                                   
[remote "origin"]                                                             
    url = xxx.github.io.git      
    fetch = +refs/heads/*:refs/remotes/origin/*                               
[branch "master"]                                                             
    remote = origin                                                           
    merge = refs/heads/master                                                 
[branch "source"]                                                             
    remote = origin                                                           
    merge = refs/heads/source     

ref

  1. Git push与pull的默认行为
  2. Git远程操作详解