当前位置: 首页 > news >正文

对 Git 分支 master 和 origin/master 的一些认识

首先要明确一点,对 Git 的操作是围绕 3 个大的步骤来展开的(其实几乎所有的 SCM 都是这样)

  1. 从 git 取数据(git clone
  2. 改动代码
  3. 将改动传回 git(git push

这 3 个步骤又涉及到两个 repository,一个是 remote repository,在远程服务器上,一个是 local repository,在自己工作区上。其中 1, 3 两个步骤涉及到 remote server/remote repository/remote branch,2 涉及到 local repository/local branch。git clone 会根据你指定的 remote server/repository/branch,拷贝一个副本到你本地,在 git push 之前,你对所有文件的改动都是在你自己本地的 local repository 来做的,你的改动 local branch 和 remote branch 是独立(并行)的。Gitk 显示的就是 local repository。

在 clone 完成之后,Git 会自动为你将此远程仓库命名为 origin(origin 只相当于一个别名,运行 git remote –v 或者查看 .git/config 可以看到 origin 的含义),并下载其中所有的数据,建立一个指向它的 master 分支的指针,我们用 (远程仓库名)/(分支名) 这样的形式表示远程分支,所以 origin/master 指向的是一个 remote branch(从那个 branch 我们 clone 数据到本地),但你无法在本地更改其数据。

同时,Git 会建立一个属于你自己的本地 master 分支,它指向的是你刚刚从 remote server 传到你本地的副本。随着你不断的改动文件,git add , git commit,master 的指向会自动移动,你也可以通过merge(fast forward)来移动 master 的指向。

查看所有分支:

$ git branch -a (to show all the branches git knows about)

* master
remotes/origin/HEAD -> origin/master
remotes/origin/master

查看远程分支:

$ git branch -r (to show remote branches git knows about)

origin/HEAD -> origin/master
origin/master

可以发现,master 就是 local branch,origin/master 是 remote branch(master is a branch in the local repository. remotes/origin/master is a branch named master on the remote named origin)。

$ git diff origin/master master

=> show me the changes between the remote master branch and my master branch

需要注意的是,remotes/origin/master 和 origin/master 的指向是相同的,可以运行以下命令看效果:

$ git diff origin/master remotes/origin/master

 

$ git push origin master

origin 指定了你要 push 到哪个 remote。

master 其实是一个“refspec”,正常的“refspec”的形式为“+<src>:<dst>”,冒号前表示 local branch 的名字,冒号后表示 remote repository 下 branch 的名字。注意,如果你省略了<dst>,git就认为你想 push 到 remote repository 下和 local branch 相同名字的 branch。听起来有点拗口,再解释下,push 是怎么个 push 法,就是把本地 branch 指向的 commit push 到 remote repository 下的 branch,比如:

$ git push origin master:master

=> 在 local repository 中找到名字为 master 的 branch,使用它去更新 remote repository 下名字为 master 的 branch,如果 remote repository 下不存在名字是 master 的 branch,那么新建一个。

$ git push origin master

=> 省略了<dst>,等价于“git push origin master:master”。

$ git push origin master:refs/for/mybranch

=> 在 local repository 中找到名字为 master 的 branch,用它去更新 remote repository 下面名字为 mybranch 的 branch。

$ git push origin HEAD:refs/for/mybranch

=> HEAD 指向当前工作的 branch,master 不一定指向当前工作的 branch,所以我觉得用 HEAD 还比 master 好些。

$ git push origin :mybranch

=> 在 origin repository 里面查找 mybranch,删除它。用一个空的去更新它,就相当于删除了。

相关文章:

  • 不要做干自己没时间做的事
  • @Not - Empty-Null-Blank
  • vagrant学习笔记
  • jquery widgets 弹框
  • Linux系统管理命令之权限管理
  • ReactNative开发常用的三方模块
  • Linq to entity 执行多个字段排序的方法
  • maven学习:java编译插件与去除测试插件
  • 机器的自我进化
  • 取汉子拼音首字母的VB.Net方法
  • TP90 95 99指标
  • 阿里双十一大促,技术准备只做了这两件事情?
  • 很反感
  • 6410键盘应用程序的开发
  • String.format()的用法(C++ .net)
  • 【知识碎片】第三方登录弹窗效果
  • CentOS 7 修改主机名
  • javascript 总结(常用工具类的封装)
  • js递归,无限分级树形折叠菜单
  • opencv python Meanshift 和 Camshift
  • Python进阶细节
  • REST架构的思考
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 番外篇1:在Windows环境下安装JDK
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 技术胖1-4季视频复习— (看视频笔记)
  • 七牛云假注销小指南
  • 一份游戏开发学习路线
  • #Spring-boot高级
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Note)C++中的继承方式
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (力扣)1314.矩阵区域和
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (四) 虚拟摄像头vivi体验
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net 7 上传文件踩坑
  • .net framework4与其client profile版本的区别
  • .net 发送邮件
  • .NET 设计一套高性能的弱事件机制
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .Net6使用WebSocket与前端进行通信
  • .Net环境下的缓存技术介绍
  • .net通用权限框架B/S (三)--MODEL层(2)
  • /dev下添加设备节点的方法步骤(通过device_create)
  • /etc/sudoers (root权限管理)
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @Transactional 详解
  • [2544]最短路 (两种算法)(HDU)
  • [AAuto]给百宝箱增加娱乐功能
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)