前几篇博客陆陆续续的讲了好多关于Git操作的内容, 其中在上篇博客聊了《Git中的merge、rebase、cherry-pick以及交互式rebase》,本篇博客仍然也不例外,不过本篇博客的主题是关于git的远程操作的。依照之前博客的风格,我们依然依托于LearningGitBranch中的相关内容来探究一下Git的远程操作。今天这篇博客算是Git系列博客的结尾了。

一、PUSH到远端

1、将本地的Merge操作推送给远端

下方左边是我们的git分支的初始状态,我们从master分支上分别创建了三个不同的分支side1、side2、side3。并且在每个分支上都有新的提交。右边是远端的状态,在我们从远端Clone后,团队的其他小伙伴往远端提了一个新的提交C8。

  

下方就是我们经过远端代码的pull,然后在本地进行merge, 最终进行push的效果。下方我们就通过具体的分支操作来达到下方的目标。

  

上述的目标其实很简单,就是将上述的side1、side2、side3分支合入到master分支,然后再push到远端。下方是完成目标的具体操作。

  • git pull: 因为要合入到master分支,所有先我们通过 checkout 命令切换到master分支,然后通过 pull 命令获取到远端master分支上的所有提交。

  • git merge: 接下来就是在 master分支上一系列的merge操作了,最终side1、side2、side3的分支都会合入到master分支。

  • git push: 然后通过git push 操作将本地合并好的master分支push到远端进行共享。

使用场景:上述操作在日常开发中经常用到,比如你本地针对不同的问题开出了不同的分支,然后在各个分支上分别做了不同的事情。当这些事情做完时需要合并到主分支,和其他同事进行共享。在合入之前,需要先拉取远端master分支的最新代码,然后在本地进行合并,合并后在进行push操作。有的小伙伴文为啥要拉取最新的代码,因为拉取代码是为了保证本地的master分支与远端一致,并在代码merge时极有可能会产生冲突,需要我们在本地merge的过程中将这些冲突进行解决掉,然后再push到远端。

  

2、推送远端前的rebase操作

上面代码合并时的分支看上去是非常乱的,我们可以不选择使用merge命令来合并分支,可以使用rebase-变基操作。变基操作在之前的博客中已经介绍过了,本篇博客就不做具体讲解了,下方只是对rebase操作的具体实践。

下方的内容也是比较简单的,就是使用rebase操作来代替上方的merge操作。下方的截图就是我们要完成的目标。此处的目标与上述merge操作后的结果对比一下,不难发现,下方经过rebase操作后的分支并没有那么杂乱,而是成线性的操作,push到远端的话,看上去就好像是基于master分支来开发的一样。

  

下方的操作也是比较简单的,就是将上一部分的merge操作换成了rebase操作,不过在执行rebase操作时要区分好一个分支变基到那个分支上。下方是具体操作的描述:

  • git fetch: 首先投过git fetch抓取远端的代码。

  • git rebase: 然后就一系列的git rebase操作,先使用git rebase o/master side1 操作将side1分支上的提交内容变基到o/master分支上,然后是将side2变基到side1上,接着是将side3变基到side2上。最后是将master分支变基到side3上,这一步操作也就是快速前进的操作,目的是将master分支指向目前rebase后的分支的最后一个提交上。

  • git push: 最后就是通过git push将整理好的分支push到远端。远端的分支看上去就是一个线性的提交了,而不会保留我们本地之前的那三个分支的具体提交。

通过merge和rebase操作都能完成我们将本地的代码进行合并到主分支然后push到远端的目标,但是其具体整理分支方式不同。rebase使得分支的合并更线性一些,而merge操作就使的分支的合并呈现二维的一个结构。

至于rebase好还是merge好,个人感觉merge的优点是能更好的保存你的操作历史,而rebase则会丢弃掉一些操作历史。但是merge的缺点是多个分支进行合并时,其合并历史看上去会比较繁杂,而rebase操作显得就比较干净利索。至于在合并分支时时用merge还是rebase,没有具体的要求。

  

二、远端分支追踪和push

1、分支的远程追踪

首先我们来看一个示例:

  • 首先我们通过 git clone 操作克隆了一份代码,然后在本地的master分支上通过 git checkout -b bugfix01分支并切换到该分支上,并且在远端通过fakeTeamwork操作创建了一个远端提交。

  • 接着我们在bugfix01分支上做了一次提交。

  • 此时此刻我们在bugfix01分支上想拉取远端最新的代码,执行了git pull操作。从下方来看,是不被允许的,并给出了提示 “bugfix01 is not a remote tracking branch! I dont know where to push”,大概意思是bugfix01没有一个正在追踪的远程分支,不知道从哪个分支上进行拉取。

  

接下来要做的事情是在创建分支就给我们创建的新的分支指定一个追踪的远程分支,这样就可在我们创建的新分支上来pull远端分支中的内容了。下方是具体操作:

  • 首先我们通过 git checkout -b bugfix02 o/master 命令创建并切换到了bugfix02上,后边所添加的o/master分支名就是bugfix02所要追踪的远程分支。

  • 因为我们为bugfix02添加和远程追踪分支,我们就可以在bugfix02分支上通过 git pull 命令来拉取 o/master分支上的相关内容。具体如下所示。

  

  

 2、push到远端

接下来我们要聊到就是在当前操作分支上将将本地的其他分支push到远端。具体操作如下所示:

  • 下方的操作我们事先将HEAD指针指向了C0。

  • 然后执行 git push origin foo 操作将foo分支上的内容push到远端,push完毕后,本地的o/foo分支也会跟着变动,如下所示。

  • 同样,使用 git push origin master 命令,可以将本地的master分支上的提交push到远端的master分支,并修改本地的远端o/master分支的指向。

因为在该操作中foo追踪了远端的o/foo分支,所以可以push到远端的foo分支上。

  

上面将相关分支同步到远端所对应的分支上,比如将本地的master分支push到远端的o/master分支上。而接下来要做的事情是将本地的 a分支push到远端的b分支上,将本地的b分支push到远端的a分支上。具体导致如下所示:

  • 下方我们通过 git push origin foo:master 操作将本地foo分支上的提交push到远端的master分支上。

  • 通过 git push origin master^:foo 操作,将本地的master分支之前的所有分支提交到远端的foo分支上。

上述冒号后方的分支名所对应的就是远端的分支。

  

三、抓取远端操作

1. fetch origin

上面演示了push origin 的操作,接下来我们可以看一下fetch origin的操作。

  • 我们可以通过 git fetch origin foo:master 来将远端的master分支上的内容同步到本地的foo分支上,当然这个foo分支也要有对应的追踪远端的。

  

我们还可以通过fetch origin或者push origin来创建和删除相关分支。下方左图是我们要完成的目标,右图是目前现状。我们要做的是通过 fetch origin 命令来删除foo分支,然后也是通过fetch origin命令来创建一个barf分支。

  

接下来我们就通过相关命令来完成上述目标:

  • 首先我们通过git push origin :foo 操作来删除远端的foo分支。

  • 然后在通过git fetch origin :bar操作来创建一个本地的bar分支。

具体如下所示:

  

四、本地分支跟踪远端其他分支

本关其实就是在拉取分支时顺便创建一个追踪远端相关分支的本地分支。下方截图就是本关要完成的任务。图左边是我们要完成的目标,右边是现有状态。要完成最终的目标,需执行下方的几步:

  • 当前状态是在master分支上有一个新的提交C4并未push到远端, 若要达到目标,需要在master分支上线pull远端的bar分支,然后在pull远端的master分支。

  • 在pull远端分支时,分别创建了不同的分支跟踪远端的分支。下方会有具体的命令操作。

  

下方是具体的命令操作:

  • 首先通过 git pull origin bar:foo 命令拉取远端的 bar 分支,在拉取远端分支后,在本地创建一个 foo 分支来跟踪远端的bar分支。

  • 然后再通过 git pull origin master:side 命令拉取远端的 master 分支,然后创建一个本地side分支来跟踪远端的master分支。

最终操作如下所示:

  

陆陆续续的也聊了好多git相关操作,git相关内容先到这儿,以后如果还有其他内容再做补充。

Git知识总览(六) Git分支中的远程操作实践相关推荐

  1. git 删除本地分支中,远程仓库不存在的分支。

    git已经删除了远程分支,本地仍然能看到 1.使用 git branch -a 命令可以查看所有本地分支和远程分支,发现很多在远程仓库已经删除的分支在本地依然可以看到. 2.使用命令 git remo ...

  2. JS学习笔记六:js中的DOM操作

    1. JS学习笔记六:js中的DOM操作 文章目录 1. JS学习笔记六:js中的DOM操作 1.1. 获取Dom节点 1.2. 元素属性的操作方式 1.3. DOM节点的创建.插入和删除 1.4. ...

  3. 【GIT 基础篇六】分支管理(创建与合并)

    上篇我们整理了如何创建远程仓库,以及如何将本地文件上传至远程仓库,仓库创建好了,我们接下来就要准备开发了,对于使用git而言,通常的习惯就是一人一个分支,等测试无误再合并:又或者根据需求创建分支,整体 ...

  4. Git学习系列(六)解决分支冲突及分支管理策略

    2019独角兽企业重金招聘Python工程师标准>>> 解决分支冲突 通常当Git无法自动合并分支时,就必须首先解决冲突后,再提交. 下面咱们先创建一个分支并切换到b1分支: 修改咱 ...

  5. IC基础知识(六)SV中default input #1 output #1的解释

    目录 1. clocking-endclocking块 2. clocking shew的含义 3. 实例代码 4. clocking event 5. clock cycle延时 '##' 6. d ...

  6. 吴恩达机器学习学习笔记第六章:机器学习中的线性代数操作python3版(含numpy、panda库的使用)

    pracitice1:是针对矩阵元素的基本运算 #practice1是针对矩阵元素的基本运算 import numpy as np A=np.array([[1,2,3],[3,4,5]])#列表转换 ...

  7. 你怎么得到git总是从特定的分支拉?

    我不是一个git master,但是我已经和它一起工作了一段时间,有几个不同的项目. 在每个项目中,我总是git clone [repository] , git clone [repository] ...

  8. Git的具体使用,包括安装Git工具,把Git和IDEA结合,使用分支

    文章目录 Git的具体使用,包括安装Git工具,把Git和IDEA结合,使用分支 git安装及环境配置 git的必要配置 git config -l git config --system --lis ...

  9. git如何选择性合并_Git分支合并选择

    用Git进行多人协作开发时,必然会合并代码,解决冲突.然而合并代码也是需要点技巧的,如果对一些关键命令没有理解去使用的话,git的版本演进路线就会变得很乱,从而造成了日后维护的一些麻烦. Git上合并 ...

最新文章

  1. Case study:在数据库网页中设计数据排序工具
  2. LeetCode Integer to Roman(数字转罗马)
  3. 终于不用手撸了,解放你的双手,教你用数学建模的方式对答题卡进行有效识别
  4. 嵌入式linux root免密码,给嵌入式linux串口添加密码的一些总结
  5. 程序员面试系列——冒泡排序
  6. erlang精要(27)-异常处理
  7. 【深度学习】什么是目标检测中的平均精度均值(mAP)?
  8. [图神经网络] 图节点Node表示---GraphSAGE与PinSAGE
  9. c# redis 如何设置过期时间_Redis 过期时间与内存管理
  10. 乔治敦大学计算机专业排名,2020USNEWS数据科学与分析专业综合排名(上)
  11. 图解 ElasticSearch 原理,太牛了
  12. new 一个结构体数组_C语言结构体到底占多少内存?简单!一文助你解决结构体内存问题...
  13. get s 数组c语言,(完整版)C语言题库数组.pdf
  14. 班级量化考核系统php代码,学生信息量化考核管理系统
  15. lanproxy搭建内网穿透
  16. ISP芯片架构及算法初理解
  17. tier1和tier2_数据中心Tier1-Tier2-Tier3-Tier4
  18. torch.nn.functional.normalize详解
  19. SQL 给时间字段增加一固定时间
  20. android drawText()方法中x,y坐标值真正的 意义

热门文章

  1. VCL组件之TLabel、TStaticText和TLabeledEdit
  2. DataSet操作数据库
  3. 近期工作:Updater Application Block (UAB)继续
  4. python 倒计时_Excel制作竞答倒计时器
  5. Log binomial 回归在队列中的应用
  6. python抢票代码_教你用Python动刷新抢12306火车票,附源码!
  7. 实践操作--云端深度学习工作站配置指南(转)
  8. C语言 | C语言实现十六进制转八进制
  9. socket缓冲区以及阻塞模式详解
  10. sqoop mysql hadoop_使用sqoop将mysql数据导入到hadoop