前几篇博客陆陆续续的讲了好多关于 Git 操作的内容, 其中在上篇博客聊了 Git 中的 mergerebasecherry-pick 以及交互式 rebase, 本篇博客仍然也不例外, 不过本篇博客的主题是关于 git 的远程操作的依照之前博客的风格, 我们依然依托于 LearningGitBranch 中的相关内容来探究一下 Git 的远程操作今天这篇博客算是 Git 系列博客的结尾了
一 PUSH 到远端
1 将本地的 Merge 操作推送给远端
下方左边是我们的 git 分支的初始状态, 我们从 master 分支上分别创建了三个不同的分支 side1side2side3 并且在每个分支上都有新的提交右边是远端的状态, 在我们从远端 Clone 后, 团队的其他小伙伴往远端提了一个新的提交 C8
下方就是我们经过远端代码的 pull, 然后在本地进行 merge, 最终进行 push 的效果下方我们就通过具体的分支操作来达到下方的目标
上述的目标其实很简单, 就是将上述的 side1side2side3 分支合入到 master 分支, 然后再 push 到远端下方是完成目标的具体操作
git pull: 因为要合入到 master 分支, 所有先我们通过 checkout 命令切换到 master 分支, 然后通过 pull 命令获取到远端 master 分支上的所有提交
git merge: 接下来就是在 master 分支上一系列的 merge 操作了, 最终 side1side2side3 的分支都会合入到 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 分支上的相关内容具体如下所示
2push 到远端
接下来我们要聊到就是在当前操作分支上将将本地的其他分支 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 相关内容先到这儿, 以后如果还有其他内容再做补充
来源: https://www.cnblogs.com/ludashi/p/8323617.html