目录

一、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远程仓库高级操作篇)相关推荐

  1. Learn Git Branching 学习笔记(移动提交记录篇)

    目录 一.移动提交记录篇 1.Git Cherry-pick 2.交互式rebase Git用法高级篇在上一篇文章中Learn Git Branching 学习笔记(高级篇)_流年--by gone的 ...

  2. Learn Git Branching 学习笔记(高级话题篇)

    目录 一.高级话题篇 1.多分支rebase 2.选择父提交记录 3.纠缠不清的分支 Git的一些技术.技巧与贴士集合在上一篇文章中 Learn Git Branching 学习笔记(Git 技术.技 ...

  3. Git 个人学习笔记及心得

    作为程序员如果你还不知道 Git 和 GitHub,说不过去吧,赶紧来学习一波. 一.认识GitHub Git 是个版本控制系统,说明白点就是进行代码的各种管理,比如你写错代码进行回滚啊.追寻 Bug ...

  4. 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 相 ...

  5. learn git branching学习整理3

    介绍 learn git branching是一个非常好的git学习网站,它与传统的文字讲解相比较起来有一个非常大的亮点----图形化的git提交树可以实时的反馈并告诉你当前所做的git操作在对于代码 ...

  6. git的学习笔记(二):git远程操作

    git的学习笔记(一):git本地操作 1.创建ssh key ssh-keygen -t rsa -C "your_email@example.com" 执行命令后会在用户的家目 ...

  7. git/github学习笔记

    原文地址为: git/github学习笔记 请移步到:http://www.testclass.net/git/ ----- 我重新对git/github教程进行了编排和整理. 1. git 版本控制 ...

  8. 《Got Git》学习笔记(一)

    <Got Git>学习笔记(一) 最近想对自己的代码和文档进行归档整理,需要一个版本控制系统来进行 处理.自然而然的想到了目前流行的GitHub. GitHub,是一个面向开源及私有软件项 ...

  9. Git剑客学习笔记-待完善

    Git 学习 前言 一.Git基础 01|安装 安装成功后,打开powershell窗口, 检查 git 版本 PS C:\Users\lvzb3> git --version git vers ...

  10. Git Github学习笔记

    Git && Github 一.本地库操作命令 本地初始化 git init # 选择一个目录进入 helin9s@LAPTOP-M719A9K6 MINGW64 /d/DEVELOP ...

最新文章

  1. ssh连接服务器出现:ssh: connect to host 192.168.1.107 port 22: Connection refused 的解决方法
  2. how to write a cover letter
  3. HighNewTech—2019CES:历史性!百度用自家的自动驾驶物流,把一个快递送到了 2019CES会场
  4. Charm Bracelet(0-1)
  5. qt中下拉列表使用函数setCurrentText()设置当前显示值不能设置成功
  6. 国美处罚“摸鱼员工”,错在什么地方
  7. mysql添加有效值_物理数据库设计 - 限定列的有效值
  8. 57、剑指offer--二叉树的下一结点
  9. PyTorch学习笔记——语言模型
  10. CBCGPToolBarImages和CImageList创建与使用
  11. win10加入域环境
  12. 需要使用新应用以打开此mswindowsstore解决办法
  13. [渝粤教育] 四川轻化工大学 化工设备机械基础 参考 资料
  14. Ubuntu14.04网易云音乐的下载及安装 ssh安装 卸载 安装输入法
  15. activemq、rabbitmq、kafka原理和比较
  16. 香港汇丰银行个人开户资料及流程
  17. 聚焦计算机视觉前沿,蚂蚁技术研究院4篇论文入选顶会NeurIPS
  18. 【php学习笔记】文件系统---制作备忘录和修改配置文件
  19. 网络传真服务器位置,网络传真服务器_什么传真传真服务器?
  20. 个体工商户核名查询_秒懂!个体工商户注册无需到窗口“预先核名”,自主申报“15图搞定”!...

热门文章

  1. SMM框架的图片上传
  2. java合并果子_【单调队列】合并果子
  3. 【IOS】获取iOS设备唯一标识的演进UDID, MAC Address,UUID,IDFA,IDFV,OpenUDID
  4. [数据可视化] 柱状图
  5. Android系统固件包解包、修改(涉及root提权)、打包
  6. Flink 实时计算 - 进阶篇(如何自定义 Data Source 与 Data Sink)
  7. 干货丨1.3万字简述,PRD到底怎么写
  8. 【BZOJ】2101: [Usaco2010 Dec]Treasure Chest 藏宝箱(dp)
  9. java根据经纬度得出中心点的经纬度
  10. 9N90-ASEMI大功率场效应管9A 900V