推送远程分支到同一个server

比方首先建立gitserver,顺便clone出两个副本

mkdir server
cd server
git init --bare
cd ..
git clone server git1
git clone server git2

眼下git branch是空的。

我们提交一点东西建立master分支。

cd git1
touch a.txt
git add .
git commit -m "init"
git push origin master

如今git branch -a 显示:

* master
remotes/origin/master

当前系统处于master分支,远程origin的repository上也有一个master分支。两个是tracking的。

我们切到git2以下

cd ../git2
git pull origin

这时候git2跟git1全然同步了。

如今我们開始尝试建立还有一个分支并推送到server。

习惯的,我们还是切回git1

cd ../git1
git checkout -b source

这时候我们已经有了一个本地分支了,假设这个分支不须要共享,那么你能够一直在这个分支上commit可是不push到server。直到这个分支被合并回主分支或者丢弃。

git branch 显演示样例如以下:

  master
* source

我们终于决定把这个分支push到server上与其它人共享。例如以下:

git push origin source:source

这时候git branch -a 能看到当前repository里面全部的分支,包含两个本地的,两个远程的,本地和远程的都处于tracking状态。

  master
* source
remotes/origin/master
remotes/origin/source

切到还有一个副本。

cd ../git2
git pull origin

显演示样例如以下:

 * [新分支]          source      -> origin/source

git branch -a显示本地已经有了一个远程分支的指针,可是没有tracking这个分支的本地分支:

* master
remotes/origin/master
remotes/origin/source

相同我们能够在.git/refs/remotes/origin下看到分支的名字,可是refs/heads以下并没有。我们来检出这个远程分支:

git checkout -b source origin/source

这时候git branch -a 显示就跟git1一致了。git2下也能够编辑source分支并同步。这些都是比較常见的操作,我们须要注意的是。多分支下默认的參数。比方,在两个分支都改动一点东西:

cd ../git1
git checkout master
//modify
git add .
git commit -m "master modify"
git checkout source
//modify
git add .
git commit -m "source modify"

这时候git push origin 是针对当前分支的,所以两个分支同一时候push更新仅仅能

git push origin
git checkout master
git push origin

pull更新的时候

cd ../git2
git checkout master
git pull origin

这会同一时候更新两个分支的指针。可是不会merge还有一个分支,我们去还有一个分支下

git checkout source
git pull origin

可是出错例如以下:

You asked to pull from the remote 'origin', but did not specify
a branch. Because this is not the default configured remote
for your current branch, you must specify a branch on the command line.

问题在于没有给当前分支配置merge的路径,git不知道去merge哪个分支。(尽管我认为既然是tracking的不应该不知道啊)。

假设你有 1.6.2 以上版本号的 Git。—track 选项能够同一时候配置merge的路径:

git checkout --track origin/serverfix

这里我们改动配置文件增加branch “source”:

[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
[remote "origin"]
url = /media/cxh/backup/work/ceshi/git/server
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master"这里指server上的refs/heads/master
[branch "source"]
remote = origin
merge = refs/heads/source

这意味着每次fetch origin的时候更新全部remotes/origin的头指针到refs/heads/以下,详细能够去.git下查阅这个文件夹,可是头指针都是仅仅读的。

merge是由所在branch定义的。

我们加了branch “source”的配置指定当前source的merge策略是使用server端的refs/heads/source来合并到当前分支。

这样就能够顺利的git pull origin了。

推送远程分支到不同server

我们先建立新的repo:

cd ..
mkdir server2
cd server2
git init --bare

增加git1副本,并提交

git remote add server xxx/server2
git push server

上面过程的本质是提交当前分支头指针到server。相当于拷贝refs/head/xxx到refs/remotes/server/下并提交。

git push server会被展开成

git push server 当前分支名:当前分支名

我们能够在git2副本相同增加该repository并更新引用

git remote add server xxx/server2
git fetch server

能够看到refs下文件夹结构例如以下:

├── heads
│   ├── master
│   └── source
├── remotes
│   ├── origin
│   │   ├── master
│   │   └── source
│   └── server
│   └── source
└── tags

总结一下

  • update

    • fetch操作的本质是更新repo所指定远程分支的头指针(server->refs/remotes/xxx/)

    • merge操作的本质是合并当前分支和指定的头指针(refs/remotes/xxx->refs/heads)

    • pull操作的本质是fetch + merge

  • commit

    • commit的本质是改动了当前分支的头指针(refs/heads)

    • push操作本质是提交当前分支头指针到server,顺便也改动了本地存储的server头指针(refs/remotes/xxx)

  • checkout

    • 复制本地分支的本质是拷贝了refs/heads/下的一个头指针

    • push本地分支到server的本质是把这个头指针上传服务器,顺便拷贝了本地存储的server头指针(refs/remotes/xxx)

    • tracking远程分支的本质是把refs/remotes/下的指针复制到了refs/heads下

注:以上过程都没有涉及数据流。

Git远程分支和refs文件具体解释的更多相关文章

  1. git远程分支创建,本地分支关联远程分支,第一次发布、更新分支

    git远程分支创建,本地分支关联远程分支,第一次发布.更新分支 github托管服务器地址为https://github.com git提交更新代码示意图: 本地与远程进行免密码配置(本地与远程关联) ...

  2. git 远程分支和tag标签的操作

    git远程分支操作:1.创建远程分支git push --set-upstream origin develop:develop2在服务器创建远程分支devlop2,让本地的develop分支和dev ...

  3. git 远程分支创建与推送

    git 远程分支创建与推送   原文地址:http://hi.baidu.com/lingzhixu/blog/item/4a9b830bb08a329fe850cd5b.html 本地分支的创建 本 ...

  4. Git 远程分支的pull与push

    Git 远程分支的pull与push 远程分支信息查看 git branch -r #查看远程分支 git branch -a #查看所有分支,本地和远程 git remote show [remot ...

  5. git远程分支不显示问题解决

    因为项目太大,然后直接git clone拉不下来代码 会报error: RPC failed; HTTP 504 curl 22 The requested URL returned error: 5 ...

  6. Git 远程分支的查看及相关问题

    命令:git ls-remote -t 或者 git ls-remote --tag 运行结果如下: 0975ebc0f9a6b42ecbe066a50a26a678a0753b4d refs/tag ...

  7. git 删除分支和删除文件夹

    1.删除分支 1.1查看所有分支: git branch -a 得到结果: 1.2删除HEAD分支 git push origin --delete HEAD 2.删除文件夹 2.1 查看本地分支下的 ...

  8. git远程分支--remote

    查看所有远程引用: $ git ls-remote From ssh://someone@example/testgit ebf3ef7551603cd57a699e80db0bfab36d1aa7b ...

  9. git 远程分支回滚

    git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id [本地代码库回滚]: git reset --hard commit-id :回滚到commit-id,讲commit-id ...

随机推荐

  1. Vue Cli3.0 使用jquery

    参考链接:https://blog.csdn.net/ai520587/article/details/84098601

  2. python第二部分

    什么数据类型? int 1, 2, 3 用来运算的 float 1.2 str 用来存储一定的信息"" '' list =[1,2 ,3 "有", 是]用来存储 ...

  3. Linux中tftp安装及使用笔记

    tftp命令用在本机和tftp服务器之间使用TFTP协议传输文件. TFTP是用来下载远程文件的最简单网络协议,它其于UDP协议而实现. linux服务器端tftp-server的配置 1.安装tft ...

  4. Java基础部分 2

    一. Java基础部分 2 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 2 2.Java有没有goto? 2 3.说说&和&&am ...

  5. Oracle的查询-子查询

    --子查询 --子查询返回一个值 --查询出工资和scott一样的员工信息 select * from emp where sal in (select sal from emp where enam ...

  6. 【计算机网络】-传输层-Internet传输协议-UDP

    [计算机网络]-传输层-UDP 简介 Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,UserDatagram Protocol) .UDP为应用程序提供了一-种无需 ...

  7. 剑指offer19:按照从外向里以顺时针的顺序依次打印出每一个数字,4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

    1 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印 ...

  8. DecodingGenome(CodeForces-222E)【矩阵快速幂】

    题目链接:https://vjudge.net/contest/333591#problem/L 题意:用m个字符构成长度为n的串,其中存在形如“ab”(表示a后不能放置b)的条件约束,问共有多少种构 ...

  9. python如何切割字符串

    python字符串的分割方法如下 str.split():字符串分割函数 通过指定分隔符对字符串进行切片,并返回分割后的字符串列表. 语法: str.split(s, num)[n] 参数说明: s: ...

  10. 《精通Windows API-函数、接口、编程实例》——第4章文件系统

    第4章文件系统 4.2 磁盘和驱动器管理 文件系统的基本概念:包括磁盘分区,卷,目录,文件对象,文件句柄,文件映射1.磁盘分区:物理磁盘,逻辑磁盘2.卷:也称逻辑驱动器,是NTFS,FAT32等文件系 ...