Git远程分支和refs文件具体解释
推送远程分支到同一个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文件具体解释的更多相关文章
- git远程分支创建,本地分支关联远程分支,第一次发布、更新分支
git远程分支创建,本地分支关联远程分支,第一次发布.更新分支 github托管服务器地址为https://github.com git提交更新代码示意图: 本地与远程进行免密码配置(本地与远程关联) ...
- git 远程分支和tag标签的操作
git远程分支操作:1.创建远程分支git push --set-upstream origin develop:develop2在服务器创建远程分支devlop2,让本地的develop分支和dev ...
- git 远程分支创建与推送
git 远程分支创建与推送 原文地址:http://hi.baidu.com/lingzhixu/blog/item/4a9b830bb08a329fe850cd5b.html 本地分支的创建 本 ...
- Git 远程分支的pull与push
Git 远程分支的pull与push 远程分支信息查看 git branch -r #查看远程分支 git branch -a #查看所有分支,本地和远程 git remote show [remot ...
- git远程分支不显示问题解决
因为项目太大,然后直接git clone拉不下来代码 会报error: RPC failed; HTTP 504 curl 22 The requested URL returned error: 5 ...
- Git 远程分支的查看及相关问题
命令:git ls-remote -t 或者 git ls-remote --tag 运行结果如下: 0975ebc0f9a6b42ecbe066a50a26a678a0753b4d refs/tag ...
- git 删除分支和删除文件夹
1.删除分支 1.1查看所有分支: git branch -a 得到结果: 1.2删除HEAD分支 git push origin --delete HEAD 2.删除文件夹 2.1 查看本地分支下的 ...
- git远程分支--remote
查看所有远程引用: $ git ls-remote From ssh://someone@example/testgit ebf3ef7551603cd57a699e80db0bfab36d1aa7b ...
- git 远程分支回滚
git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id [本地代码库回滚]: git reset --hard commit-id :回滚到commit-id,讲commit-id ...
随机推荐
- C#实现自动刷新网页
需要的童鞋可以下载整个项目:http://pan.baidu.com/s/1geMADvP 运行效果图如下:
- Spring 工程分层
- 33.TCP协议概念/scapy模块doos攻击
TCP协议概念/scapy模块: 1,TCP/IP四层协议: 2,TCP数据包的构成: TCP FLAGS:TCP数据包标志位 U:URG,紧急比特 A:ACK,确认比特 P:PSH,推送比特 S:S ...
- Mysql:too many connect
1.问题展现应用端登录出现Too many connections报错 检查发现mysql数据库服务端已经达到了max_connections上限 #查看最大连接数 mysql> show va ...
- sql数据库的基础语句
1, 创建数据库 create database database-name 2, 删除数据库 drop database dbname 3, 备份sql server 创建 备份数据的device ...
- Python 解leetcode:49. Group Anagrams
题目描述:给出一个由字符串组成的数组,把数组中字符串的组成字母相同的部分放在一个数组中,并把组合后的数组输出: 思路: 使用一个字典,键为数组中字符串排序后的部分,值为排序后相同的字符串组成的列表: ...
- LeetCode. 矩阵中的最长递增路径
题目要求: 给定一个整数矩阵,找出最长递增路径的长度. 对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向上移动或移动到边界外(即不允许环绕). 示例: 输入: nums = [ ...
- php中的访问类型(public,private,protected)
类型的访问修饰符允许开发人员对类成员的访问进行限制,这是PHP5的新特性.但却是oop语言的一个好的特性.而且大多数的oop语言都已支持此特性.PHP5支持三种访问修饰符: public(公有的,默认 ...
- NIO总结-----Buffer
Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...
- MACD中短线交易系统
1.MA5.MA10金叉,且股价收盘站稳5日均线 2.MACD金叉 3.MACD红绿柱 a.MACD红柱发散,表示多头力量增强,此时买入或加仓 b.MACD红柱收缩,表示多头力量减弱,此时卖出或减仓 ...