Learn Git Branching 学习笔记(关于origin和它的周边——Git远程仓库高级操作篇)
目录
一、Git远程仓库高级操作篇
1.推送主分支
2.合并远程仓库
3.远程追踪分支
4.git push 参数
5.git push 参数2
6.git fetch 参数
7.没有source的source
8.git pull参数
Git的远程仓库集合在上一篇文章中Learn Git Branching 学习笔记(Git远程仓库篇)_流年--by gone的博客-CSDN博客
这篇文章主要介绍git关于origin和它的周边——Git远程仓库高级操作。
一、Git远程仓库高级操作篇
1.推送主分支
在大型项目中开发人员通常会在(从 main 上分出来的)特性分支上工作,工作完成后只做一次集成。这跟前面课程的描述很相像(把 side 分支推送到远程仓库),不过本节我们会深入一些。
但是有些开发人员只在 main 上做 push、pull —— 这样的话 main 总是最新的,始终与远程分支 (o/main) 保持一致。
对于接下来这个工作流,我们集成了两个步骤:
- 将特性分支集成到 main 上
- 推送并更新远程分支
快速地更新main分支并推送到远程。
输入git pull --rebase;git push
我们执行了两个命令:
- 将我们的工作rebase到远程分支的最新提交记录
- 向远程仓库推送我们的工作
题目:
这个关卡的 Boss 很厉害 —— 以下是通关提示:
这里共有三个特性分支 —— side1 side2 和 side3,我需要将这三分支按顺序推送到远程仓库。因为远程仓库已经被更新过了,所以我们还要把那些工作合并回来
答案:
git fetch //拿回本地
git rebase o/main side1 // rebase to o/main from side1
git rebase side1 side2
git rebase side2 side3
git rebase side3 main
git push
2.合并远程仓库
在开发社区里,有许多关于 merge 与 rebase 的讨论。以下是关于 rebase 的优缺点:
- 优点: Rebase 使你的提交树变得很干净, 所有的提交都在一条线上
- 缺点: Rebase 修改了提交树的历史
比如, 提交 C1 可以被 rebase 到 C3 之后。这看起来 C1 中的工作是在 C3 之后进行的,但实际上是在 C3 之前。
一些开发人员喜欢保留提交历史,因此更偏爱 merge。而其他人(比如我自己)可能更喜欢干净的提交树,于是偏爱 rebase。
题目:
解决上一关卡的问题,但要用merge替换rebase。
答案:
git checkout main
git pull //C8拿回本地,并且origin/main指向它,main也指向它!
git merge side1
git merge side2
git merge side3
git push
3.远程追踪分支
在前几节课程中有件事儿挺神奇的,Git 好像知道main与o/main 是相关的。当然这些分支的名字是相似的,可能会让你觉得是依此将远程分支main 和本地的main 分支进行了关联。这种关联在以下两种情况下可以清楚地得到展示:
- pull 操作时, 提交记录会被先下载到 o/main 上,之后再合并到本地的 main 分支。隐含的合并目标由这个关联确定的。
- push 操作时, 我们把工作从 main 推到远程仓库中的 main 分支(同时会更新远程分支 o/main) 。这个推送的目的地也是由这种关联确定的!
main和 o/main 的关联关系就是由分支的“remote tracking”属性决定的。main被设定为跟踪 o/main这意味着为main分支指定了推送的目的地以及拉取后合并的目标。当你克隆仓库的时候, Git 就自动帮你把这个属性设置好了。
当你克隆时, Git 会为远程仓库中的每个分支在本地仓库中创建一个远程分支(比如 o/main)。然后再创建一个跟踪远程仓库中活动分支的本地分支,默认情况下这个本地分支会被命名为 main。
克隆完成后,你会得到一个本地分支(如果没有这个本地分支的话,你的目录就是“空白”的),但是可以查看远程仓库中所有的分支(如果你好奇心很强的话)。这样做对于本地仓库和远程仓库来说,都是最佳选择。
这也解释了为什么会在克隆的时候会看到下面的输出:
local branch "main" set to track remote branch "o/main"
可以让任意分支跟踪 o/main, 然后该分支会像 main 分支一样得到隐含的 push 目的地以及 merge 的目标。 这意味着你可以在分支 totallyNotMain 上执行 git push,将工作推送到远程仓库的 main 分支上。
有两种方法设置这个属性,第一种就是通过远程分支检出一个新的分支,执行:
git checkout -b totallyNotmain o/main 就可以创建一个名为 totallyNotmain 的分支,它跟踪远程分支 o/main。我们检出一个名叫 foo 的新分支,让其跟踪远程仓库中的 main。
输入git checkout -b foo o/main;git pull
我们使用了隐含的目标 o/main 来更新 foo 分支。需要注意的是 main 并未被更新!
输入git checkout -b foo o/main;git commit;git push,效果相同。
我们将一个并不叫 main 的分支上的工作推送到了远程仓库中的 main 分支上。
另一种方法就是使用:git branch -u o/main foo(这个命令更明确!)这样 foo 就会跟踪 o/main 了。如果当前就在 foo 分支上, 还可以省略 foo:
直接使用git branch -u o/main
输入git branch -u foo o/main;git commit;git push
题目:
本节我们在不检出 main 分支的情况下将工作推送到的远程仓库中的 main 分支上。
答案:
git checkout -b side o/main //local branch "side" set to track remote branch "o/main"
git commit
git pull --rebase
git push
4.git push 参数
在远程跟踪中,Git通过当前检出分支的属性来确定远程仓库以及要 push 的目的地。
是未指定参数时的行为,我们可以为 push 指定参数,语法是:
git push <remote> <place>
git push origin main这个命令是切到本地仓库中的“main”分支,获取所有的提交,再到远程仓库“origin”中找到“main”分支,将远程仓库中没有的提交记录都添加上去,搞定之后告诉我。
“place”参数告诉 Git 提交记录来自于 main, 要推送到远程仓库中的main。它实际就是要同步的两个仓库的位置。
需要注意的是,因为我们通过指定参数告诉了 Git 所有它需要的信息, 所以它就忽略了我们所检出的分支的属性!
输入git checkout C0;git push origin main
通过指定参数, 远程仓库中的 main 分支得到了更新。如果不指定参数会发生什么呢?
输入git checkout C0;git push
命令失败了(正如你看到的,什么也没有发生)! 因为我们所检出的 HEAD 没有跟踪任何分支。
题目:
本关我们要更新远程仓库中的 foo 和 main, 但是 git checkout 被禁用了!
注意:远程分支使用 o/ 开头是因为 origin/ 对于 UI 来说太长了。不用太在意这个,直接用 origin 作为远程仓库的名称就可以了。
答案:
git push origin main
git push origin foo
5.git push 参数2
如果来源和去向分支的名称不同呢?比如你想把本地的 foo 分支推送到远程仓库中的 bar 分支。要同时为源和目的地指定 <place> 的话,只需要用冒号 : 将二者连起来就可以了:
git push origin <source>:<destination>
这个参数实际的值是个 refspec,“refspec” 是一个自造的词,意思是 Git 能识别的位置(比如分支 foo 或者 HEAD~1)
如果你要推送到的目的分支不存在,Git 会在远程仓库中根据你提供的名称帮你创建这个分支!记住,source 可以是任何 Git 能识别的位置:
输入git push origin foo^:main
这是个令人困惑的命令,但是它确实是可以运行的 —— Git 将 foo^ 解析为一个位置,上传所有未被包含到远程仓库里 main 分支中的提交记录。
如果你要推送到的目的分支不存在会怎么样呢?没问题!Git 会在远程仓库中根据你提供的名称帮你创建这个分支!
输入git push origin foo:newBranch
题目:
答案:
git push origin main^:foo
git push origin foo:main
6.git fetch 参数
git fetch 的参数和 git push 极其相似。他们的概念是相同的,只是方向相反罢了(因为现在你是下载,而非上传)
如果你像如下命令这样为 git fetch 设置 的话:
git fetch origin foo
Git 会到远程仓库的 foo 分支上,然后获取所有本地不存在的提交,放到本地的 o/foo 上。
输入git fetch origin foo
我们只下载了远程仓库中 foo 分支中的最新提交记录,并更新了 o/foo。
为何 Git 会将新提交放到 o/foo 而不是放到我本地的 foo 分支呢?
本例中 Git 做了一些特殊处理,因为你可能在 foo 分支上的工作还未完成,你也不想弄乱它。fetch它不会更新你的本地的非远程分支, 只是下载提交记录(这样, 你就可以对远程分支进行检查或者合并了)。
如果你觉得直接更新本地分支很爽,那你就用冒号分隔的 refspec 吧。不过,你不能在当前检出的分支上干这个事,但是其它分支是可以的。
注意:source 现在指的是远程仓库中的位置,而 <destination> 才是要放置提交的本地仓库的位置。它与 git push 刚好相反,这是可以讲的通的,因为我们在往相反的方向传送数据。理论上虽然行的通,但开发人员很少这么做。
输入git fetch origin foo~1:bar
Git 将 foo~1 解析成一个 origin 仓库的位置,然后将那些提交记录下载到了本地的 bar 分支(一个本地分支)上。注意由于我们指定了目标分支,foo 和 o/foo 都没有被更新。
如果执行命令前目标分支不存在会怎样呢?我们看一下上个对话框中没有 bar 分支的情况。
输入git fetch origin foo~1:bar
跟 git push 一样,Git 会在 fetch 前自己创建立本地分支, 就像是 Git 在 push 时,如果远程仓库中不存在目标分支,会自己在建立一样。
如果 git fetch 没有参数,它会下载所有的提交记录到各个远程分支……
输入git fetch
题目:
要完成本关,抓取目标窗口中指定的提交记录,使用这些魔幻的命令吧!使用 fetch 时, 你必须指定 source 和 destination。 注意一下目标窗口, 因为提交对象的 ID 可能会变哦!
答案:
git fetch origin main~1:foo
git fetch origin foo:main
git checkout foo
git merge main
7.没有source的source
Git 有两种关于 <source> 的用法是比较诡异的,即你可以在 git push 或 git fetch 时不指定任何 source,方法就是仅保留冒号和 destination 部分,source 部分留空。
- git push origin :side
- git fetch origin :bugFix
如果 push 空 <source> 到远程仓库会如何呢?它会删除远程仓库中的分支!
输入git push origin :foo
我们通过给 push 传空值 source,成功删除了远程仓库中的 foo 分支, 这真有意思...
如果 fetch 空 <source> 到本地,会在本地创建一个新分支。
输入git fetch origin :bar
很神奇吧!但无论怎么说, 这就是 Git!
题目:
这个关卡很容易 ——只要删除一个远程的分支, 再用 git fetch 在本地创建一个新分支就可以!
答案:
git push origin :foo
git fetch origin :bar
8.git pull参数
既然你已经掌握关于 git fetch 和 git push 参数的方方面面了,关于 git pull 几乎没有什么可以讲的了。因为 git pull 到头来就是 fetch 后跟 merge 的缩写。你可以理解为用同样的参数执行 git fetch,然后再 merge 你所抓取到的提交记录。
以下命令在 Git 中是等效的:
git pull origin foo 相当于:git fetch origin foo; git merge o/foo
git pull origin bar~1:bugFix 相当于:git fetch origin bar~1:bugFix; git merge bugFix
看到了? git pull 实际上就是 fetch + merge 的缩写, git pull 唯一关注的是提交最终合并到哪里(也就是为 git fetch 所提供的 destination 参数)
如果我们指定要抓取的 place,所有的事情都会跟之前一样发生,只是增加了 merge 操作。
输入git pull origin main
看到了吧! 通过指定 main 我们更新了 o/main。然后将 o/main merge 到我们的检出位置,无论我们当前检出的位置是哪。
pull 也可以用 source:destination
输入git pull origin main:foo
这个命令做的事情真多。它先在本地创建了一个叫 foo 的分支,从远程仓库中的 main 分支中下载提交记录,并合并到 foo,然后再 merge 到我们的当前检出的分支 bar 上。
题目:
请按照目标窗口中的状态进行操作。你需要下载一些提交,然后创建一些新分支,再合并这些分支到其它分支。
答案:
git pull origin bar:foo
git pull origin main:side
Git远程仓库高级操作篇完结撒花~
Learn Git Branching 学习笔记(关于origin和它的周边——Git远程仓库高级操作篇)相关推荐
- Learn Git Branching 学习笔记(移动提交记录篇)
目录 一.移动提交记录篇 1.Git Cherry-pick 2.交互式rebase Git用法高级篇在上一篇文章中Learn Git Branching 学习笔记(高级篇)_流年--by gone的 ...
- Learn Git Branching 学习笔记(高级话题篇)
目录 一.高级话题篇 1.多分支rebase 2.选择父提交记录 3.纠缠不清的分支 Git的一些技术.技巧与贴士集合在上一篇文章中 Learn Git Branching 学习笔记(Git 技术.技 ...
- Git 个人学习笔记及心得
作为程序员如果你还不知道 Git 和 GitHub,说不过去吧,赶紧来学习一波. 一.认识GitHub Git 是个版本控制系统,说明白点就是进行代码的各种管理,比如你写错代码进行回滚啊.追寻 Bug ...
- Git Learning 学习笔记
文章目录 1. 前言 2. 基础篇 2.1 Git Commit 2.2 Git Branch 2.3 Git Merge 2.4 Git Rebase 3. 高级篇 3.1 分离HEAD 3.2 相 ...
- learn git branching学习整理3
介绍 learn git branching是一个非常好的git学习网站,它与传统的文字讲解相比较起来有一个非常大的亮点----图形化的git提交树可以实时的反馈并告诉你当前所做的git操作在对于代码 ...
- git的学习笔记(二):git远程操作
git的学习笔记(一):git本地操作 1.创建ssh key ssh-keygen -t rsa -C "your_email@example.com" 执行命令后会在用户的家目 ...
- git/github学习笔记
原文地址为: git/github学习笔记 请移步到:http://www.testclass.net/git/ ----- 我重新对git/github教程进行了编排和整理. 1. git 版本控制 ...
- 《Got Git》学习笔记(一)
<Got Git>学习笔记(一) 最近想对自己的代码和文档进行归档整理,需要一个版本控制系统来进行 处理.自然而然的想到了目前流行的GitHub. GitHub,是一个面向开源及私有软件项 ...
- Git剑客学习笔记-待完善
Git 学习 前言 一.Git基础 01|安装 安装成功后,打开powershell窗口, 检查 git 版本 PS C:\Users\lvzb3> git --version git vers ...
- Git Github学习笔记
Git && Github 一.本地库操作命令 本地初始化 git init # 选择一个目录进入 helin9s@LAPTOP-M719A9K6 MINGW64 /d/DEVELOP ...
最新文章
- ssh连接服务器出现:ssh: connect to host 192.168.1.107 port 22: Connection refused 的解决方法
- how to write a cover letter
- HighNewTech—2019CES:历史性!百度用自家的自动驾驶物流,把一个快递送到了 2019CES会场
- Charm Bracelet(0-1)
- qt中下拉列表使用函数setCurrentText()设置当前显示值不能设置成功
- 国美处罚“摸鱼员工”,错在什么地方
- mysql添加有效值_物理数据库设计 - 限定列的有效值
- 57、剑指offer--二叉树的下一结点
- PyTorch学习笔记——语言模型
- CBCGPToolBarImages和CImageList创建与使用
- win10加入域环境
- 需要使用新应用以打开此mswindowsstore解决办法
- [渝粤教育] 四川轻化工大学 化工设备机械基础 参考 资料
- Ubuntu14.04网易云音乐的下载及安装 ssh安装 卸载 安装输入法
- activemq、rabbitmq、kafka原理和比较
- 香港汇丰银行个人开户资料及流程
- 聚焦计算机视觉前沿,蚂蚁技术研究院4篇论文入选顶会NeurIPS
- 【php学习笔记】文件系统---制作备忘录和修改配置文件
- 网络传真服务器位置,网络传真服务器_什么传真传真服务器?
- 个体工商户核名查询_秒懂!个体工商户注册无需到窗口“预先核名”,自主申报“15图搞定”!...
热门文章
- SMM框架的图片上传
- java合并果子_【单调队列】合并果子
- 【IOS】获取iOS设备唯一标识的演进UDID, MAC Address,UUID,IDFA,IDFV,OpenUDID
- [数据可视化] 柱状图
- Android系统固件包解包、修改(涉及root提权)、打包
- Flink 实时计算 - 进阶篇(如何自定义 Data Source 与 Data Sink)
- 干货丨1.3万字简述,PRD到底怎么写
- 【BZOJ】2101: [Usaco2010 Dec]Treasure Chest 藏宝箱(dp)
- java根据经纬度得出中心点的经纬度
- 9N90-ASEMI大功率场效应管9A 900V