目录
1. git clone 复制远程仓库
2. git fetch 更新远程分支
2.1拉取指定的远程仓库分支
2.2 git fetch origin <source>:<destination> 指定分支进行操作
3. git pull 来拉取远程最新的分支,并与本地的分支合并(组合命令)
3.1 git pull 相当于fetch和merge
3.2 git pull --rebase 相当于fetch和rebase
3.3 上文git fetch能用的git fetch origin <source>:<destination>可以同规律适用于git pull
4. git push 的操作同时会更新远程仓库分支和本地仓库的远程分支
4.1 git push <remote> <place>将指定本地分支提交到远程仓库的同名分支
4.2 git push origin <source>:<destination> 将指定本地分支提交到远程仓库的不同名分支
5. 关联远程的分支
6. 简单案例
1.git clone 复制远程仓库
你可能注意到的第一个事就是在我们的本地仓库多了一个名为 o/master 的分支, 这种类型的分支就叫远程分支。由于远程分支的特性导致其拥有一些特殊属性。
顺带一提,git clone会为远程仓库中每个分支在本地仓库创建一个远程分支和一个关联的分支。(详情请看5.关联远程的分支)
远程分支反映了远程仓库(在你上次和它通信时)的状态。这会有助于你理解本地的工作与公共工作的差别 —— 这是你与别人分享工作成果前至关重要的一步.
image.png远程分支有一个命名规范 —— 它们的格式是:
<remote name>/<branch name>
因此,如果你看到一个名为 o/master 的分支,那么这个分支就叫 master,远程仓库的名称就是 o。
当你用 git clone 某个仓库时,Git 已经会帮你把远程仓库的名称设置为 origin 了。(这边的网站为了方便,设置成了o)
远程分支有一个特别的属性,在你检出时自动进入分离 HEAD 状态。Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在别的地方完成你的工作, (更新了远程分支之后)再用远程分享你的工作成果。
o/master 只有在远程仓库中相应的分支更新了以后才会更新。
2. git fetch 更新远程分支
git fetch 实际上将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态。
git fetch 完成了仅有的但是很重要的两步:
从远程仓库下载本地仓库中缺失的提交记录
更新远程分支指针(如 o/master)
远程分支反映了远程仓库在你最后一次与它通信时的状态,git fetch 就是你与远程仓库通信的方式了!
特别注意:如果git fetch 后面没有任何参数,会下载所有的提交记录到各个远程分支(如果你远程仓库里有多个分支的话,各个分支都会下载)
git fetch 并不会改变你本地仓库的状态。它不会更新你的 master 分支,也不会修改你磁盘上的文件。
所以, 你可以将 git fetch 的理解为单纯的下载操作。
2.1拉取指定的远程仓库分支
git fetch origin foo
image.png
2.2 git fetch origin <source>:<destination> 指定分支进行操作
因为要拉取,这边的source是远程仓库分支(注意区别本地仓库的远程分支),destination是本地仓库的分支
将远程仓库分支foo的上一个节点拉取到本地仓库的bar分支,如果bar分支不存在,会创建一个
git fetch origin foo~1:bar
在本地创建一个新的分支,不建议用,不如直接用 git branch bar 或者git checkout -b bar
git fetch origin :bar
3.git pull 来拉取远程最新的分支,并与本地的分支合并(组合命令)
上面我们提到,git fetch只改变了本地仓库的远程分支,那么如果想要 master与o/master合并,怎么办呢?
又或者,远程仓库的master分支已经超过了本地远程分支(o/master)的进度,这个时候我们执行git push会失败,因为本地没有拉取远程仓库最新的更新。
我们需要先fetch来。然后又因为在本地的master上有提交,我们需要将这个master和o/master合并。这样我们才会被允许提交
3.1 git pull 相当于fetch和merge
git pull 相当于下面这两个操作
git fetch
git merge o/master
image.png
3.2 git pull --rebase 相当于fetch和rebase
image.png3.3 上文git fetch能用的git fetch origin <source>:<destination>可以同规律适用于git pull
image.png举个例子:
image.png
4.git push 的操作同时会更新远程仓库分支和本地仓库的远程分支
image.png image.png4.1 git push <remote> <place>将指定本地分支提交到远程仓库的同名分支
git push <remote> <place>
比如:git push origin master
把这个命令翻译过来就是:
切到本地仓库中的“master”分支,获取所有的提交,再到远程仓库“origin”中找到“master”分支,将远程仓库中没有的提交记录都添加上去,搞定之后告诉我。
4.2git push origin <source>:<destination> 将指定本地分支提交到远程仓库的不同名分支
git push origin <source>:<destination>
如果destination指定的远程仓库分支不存在,会创建一个。
如果source为空,形如git push origin :foo
会删除远程仓库、本地远程分支、本地仓库的foo分支(全灭)
把foo分支的上一个提交push到远程仓库的master分支上
git push origin foo^:master
image.png
5. 关联远程的分支
Git 好像知道 master 与 o/master 是相关的。当然这些分支的名字是相似的,可能会让你觉得是依此将远程分支 master 和本地的 master 分支进行了关联。这种关联在以下两种情况下可以清楚地得到展示:
image.pngpull 操作时, 提交记录会被先下载到 o/master 上,之后再合并到本地的 master 分支。隐含的合并目标由这个关联确定的。
push 操作时, 我们把工作从 master 推到远程仓库中的 master 分支(同时会更新远程分支 o/master) 。这个推送的目的地也是由这种关联确定的!
可以用以下命令进行关联:
git branch -u o/master foo (这个foo必须已经存在)
git checkout -b foo o/master (如果这个foo不存在,会创建一个)
可以用以下命令查看关联关系:
git branch -vv
6.简单案例:
如果你是在一个大的合作团队中工作, 很可能是master被锁定了, 远程服务器拒绝直接推送(push)提交到master, 因为策略配置要求 pull requests 来提交更新.
不允许提交master分支,需要提交其他命名的分支。
你应该按照流程,新建一个分支feature, 推送到远程服务器. 然后reset你的master分支和远程服务器保持一致, 否则下次你pull并且他人的提交和你冲突的时候就会有问题.
git reset --hard o/master (master与远程服务器保持一致)
git checkout -b feature c2 (创建一个新的分支feature,指向c2)
git push origin feature (把feature提交)
下图左边为最终结果,右边为初始状态
image.png
网友评论