天天看点

GIT远程分支和变基1、远程分支2、远程分支的推送与删除3、GIT变基

1、远程分支

远程引用是对远程仓库的引用,包括分支、标签等。

使用命令git ls-remote (remote) 来显式地获得远程引用的完整列表,或者通过git remote show (remote)获得远程分支的更多信息。

远程跟踪分支是远程分支状态的引用。它们是你不能移动的本地引用,当你做任何网络通信操作时(fetch pull push),他们会自动移动。它们以(remote)/(branch)形式命名。

让我们来看一个例子: 假设你的网络里有一个在 git.ourcompany.com 的GIT服务器。如果你从这里克隆,GIT的 clone 命令会自动为你将其命名为origin,拉取它的所有数据,创建一个指向它的master分支指针,并且在本地将其命名为origin/master。GIT也会给你一个与它指向相同的本地 master 指针,如下图:

GIT远程分支和变基1、远程分支2、远程分支的推送与删除3、GIT变基

如果你在本地的master 分支做了一些工作,然而在同一时间,其他人推送提交到git.ourcompany.com并更新了它的master分支,那么你的提交历史将向不同的方向前进。只要你不与origin服务器连接,你的origin/master指针就不会移动。如下图:

GIT远程分支和变基1、远程分支2、远程分支的推送与删除3、GIT变基

如果现在我们执行git fetch origin命令。这个命令会查找“origin”是哪一个服务器,并从中抓取本地没有的数据,并且更新本地数据库,移动oring/master指针指向新的、更新后的位置。如下图:

GIT远程分支和变基1、远程分支2、远程分支的推送与删除3、GIT变基

之后就需要我们自己进行分支合并了,使用命令git merge origin/branch

当 git fetch 命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。 它只会获取数据然后让你自己合并。 然而,有一个命令叫作 git pull 在大多数情况下它的含义是一个 git fetch 紧接着一个 git merge 命令。

2、远程分支的推送与删除

使用命令git push (remote) (branch),把内容推送到branch分支上。通常是不写的,在执行git clone时,会有默认值。

假设你已经通过远程分支做完了所有的工作,可以运行带有–delete 选项的git push命令来删除一个远程分支。如

git push origin --delete testing
           

3、GIT变基

之前在说分支整合时,只介绍了merge,其实还有一种方式rebase,这种方式就是变基。

使用命令 git merge 合并之后,类似这样的快照。如下图:

GIT远程分支和变基1、远程分支2、远程分支的推送与删除3、GIT变基

现在使用命令rebase将提交到某一分支上的所有修改都移动到另一分支上,就好像“重新播放”一样。

在上面这个例子中,运行:

git checkout experiment
git rebase master
           

执行后,它首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master)的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用。如下图:

GIT远程分支和变基1、远程分支2、远程分支的推送与删除3、GIT变基

现在回到 mater 分支,进行一次快进合并。

git checkout master
git merge experiment
           
GIT远程分支和变基1、远程分支2、远程分支的推送与删除3、GIT变基

此时,C4’ 指向的快照就和上面使用 merge 命令的例子中 C5 指向的快照一模一样了。 这两种整合方法的最终结果没有任何区别,但是变基使得提交历史更加整洁。 你在查看一个经过变基的分支的历史记录时会发现,尽管实际的开发工作是并行的,但它们看上去就像是串行的一样,提交历史是一条直线没有分叉。

变基操作的实质是丢弃一些现有的提交,然后相应地新建一些内容一样但实际上不同的提交。所以使用变基时有一条准则:不要对在你的仓库外有副本的分支执行变基。意思就是确保这个分支只有你自己在用,和别人一起使用时,最好不要使用变基操作。

感谢大家,我是假装很努力的YoungYangD(小羊)。

参考资料:GIT官网