Git知识总览(六) Git分支中的远程操做实践

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

1、PUSH到远端git

一、将本地的Merge操做推送给远端ide

下方左边是咱们的git分支的初始状态,咱们从master分支上分别建立了三个不一样的分支side一、side二、side3。而且在每一个分支上都有新的提交。右边是远端的状态,在咱们从远端Clone后,团队的其余小伙伴往远端提了一个新的提交C8。post

  

 

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

  

 

上述的目标其实很简单,就是将上述的side一、side二、side3分支合入到master分支,而后再push到远端。下方是完成目标的具体操做。url

  • git pull: 由于要合入到master分支,全部先咱们经过 checkout 命令切换到master分支,而后经过 pull 命令获取到远端master分支上的全部提交。
  • git merge: 接下来就是在 master分支上一系列的merge操做了,最终side一、side二、side3的分支都会合入到master分支。
  • git push: 而后经过git push 操做将本地合并好的master分支push到远端进行共享。

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

  

 

二、推送远端前的rebase操做3d

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

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

  

 

下方的操做也是比较简单的,就是将上一部分的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,没有具体的要求。

  

 

 

2、远端分支追踪和push

一、分支的远程追踪

首先咱们来看一个示例:

  • 首先咱们经过 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分支上的相关内容。具体以下所示。

  

  

 二、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分支上。

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

  

 

 

3、抓取远端操做

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分支。

具体以下所示:

  

 

 

4、本地分支跟踪远端其余分支

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

  • 当前状态是在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相关内容先到这儿,之后若是还有其余内容再作补充。

相关文章
相关标签/搜索