git 关于分支,关于远程分支,关于push pull 的时机

来源:互联网 发布:软件著作权加急 编辑:程序博客网 时间:2024/06/11 11:51

远程分支(remote branch)是对远程仓库状态的索引。它们是一些无法移动的本地分支;只有在进行 Git 的网络活动时(push ,pull,fetch clong)才会更新。远程分支就像是书签,提醒着你上次连接远程仓库时上面各分支的位置。

         我们用 (远程仓库名)/(分支名)这样的形式表示远程分支。比如我们想看看上次同 origin仓库通讯时master的样子,就应该查看 origin/master分支。如果你和同伴一起修复某个问题,但他们先推送了一个iss53分支到远程仓库,虽然你可能也有一个本地的 iss53分支,但指向服务器上最新更新的却应该是 origin/iss53分支。

      假设你们团队有个地址为 git.ourcompany.com的 Git 服务器。如果你从这里克隆,Git 会自动为你将此远程仓库命名为origin,并下载其中所有的数据,建立一个指向它的 master分支的指针,在本地命名为 origin/master,但你无法在本地更改其数据。接着,Git 建立一个属于你自己的本地master分支,始于 originmaster分支相同的位置,你可以就此开始工作(如下图)

要是你在本地 master分支做了会儿事情,与此同时,其他人向 git.ourcompany.com推送了内容,更新了上面的master分支,那么你的提交历史会开始朝不同的方向发展。不过只要你不和服务器通讯,你的 origin/master指针不会移动 (如下图)

        我们这个时候是不能进行push 操作的,因为我们的origin/master 指针并不与服务器上的master  指针同步,也就是说我们过时了,

要进行push 操作,我们需要下载服务器上的最新源码,在本地进行合并后,进行push .

可以运行 git fetch origin来进行同步。该命令首先找到 origin是哪个服务器(本例为 git.ourcompany.com),从上面获取你尚未拥有的数据,更新你本地的数据库,然后把 origin/master的指针移到它最新的位置(见图 3-24)。

为了演示拥有多个远程分支(不同的远程服务器)的项目是个什么样,我们假设你还有另一个仅供你的敏捷开发小组使用的内部服务器 git.team1.ourcompany.com。可以用第二章中提到的git remote add命令把它加为当前项目的远程分支之一。我们把它命名为 teamone,表示那一整串 Git 地址(见图 3-25)。

现在你可以用 git fetch teamone来获取小组服务器上你还没有的数据了。由于当前该服务器上的内容是你 origin服务器上的子集,Git 不会下载任何数据,而只是简单地创建一个名为teamone/master的分支来指向 teamone服务器上 master所指向的更新31b8e(见图 3-26)。

要想和其他人分享某个分支,你需要把它推送到一个你拥有写权限的远程仓库。你的本地分支不会被自动同步到你引入的远程分支中,除非你明确执行推送操作。换句话说,对于无意分享的,你尽可以保留为私人分支,而只推送那些协同工作的特性分支。

然后进行merge 操作,将master  与origin/master 合并成为一条线,将这条线push 到origin服务器上。

=================================================================================

push操作    (语法git push  服务器   本地分支:远程分支)

jixiuf@jf repos $ git push origin master    是git push origin master:master的简写
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 226 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (2/2), done.
To /home/git/repos.git/
   585c480..bb7e69f  master -> master
jixiuf@jf repos $ git push origin master:master
Everything up-to-date

git checkout -b test2

等同于git branch test2

          git checkout test2 两条命令

============================================================================

关于fetch ,merge ,pull

我们想把origin 上的test2 分支合并到本地的master 分支上

==============================================================================

跟踪分支

从远程分支检出的本地分支,称为_跟踪分支(tracking branch)_。跟踪分支是一种和远程分支有直接联系的本地分支。在跟踪分支里输入 git push,Git 会自行推断应该向哪个服务器的哪个分支推送数据。反过来,在这些分支里运行git pull会获取所有远程索引,并把它们的数据都合并到本地分支中来。

在克隆仓库时,Git 通常会自动创建一个 master分支来跟踪 origin/master。这正是 git pushgit pull一开始就能正常工作的原因。当然,你可以随心所欲地设定为其它跟踪分支,比如 origin上除了 master之外的其它分支。刚才我们已经看到了这样的一个例子:git checkout -b [分支名] [远程名]/[分支名]。如果你有 1.6.2 以上版本的 Git,还可以用--track选项简化:

$ git checkout --track origin/serverfix       (作用与 git checkout -b serverfix    origin/serverfix 同  ,在本地建立一个同名的serverfix 分支,与origin/serverifix 同步)Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.Switched to a new branch "serverfix"jixiuf@jf repos $ git checkout -b test2222 origin/test2Branch test2222 set up to track remote branch test2 from origin.Switched to a new branch 'test2222'jixiuf@jf repos $ git push  (默认向origin/test2 推数据)Everything up-to-date

删除远程分支

如果不再需要某个远程分支了,比如搞定了某个特性并把它合并进了远程的 master分支(或任何其他存放稳定代码的地方),可以用这个非常无厘头的语法来删除它:git push [远程名] :[分支名]如果想在服务器上删除serverfix分支,运行下面的命令:

$ git push origin :serverfix

To git@github.com:schacon/simplegit.git

- [deleted]         serverfix

咚!服务器上的分支没了。你最好特别留心这一页,因为你一定会用到那个命令,而且你很可能会忘掉它的语法。有种方便记忆这条命令的方法:记住我们不久前见过的git push [远程名] [本地分支]:[远程分支]语法,如果省略[本地分支],那就等于是在说“在这里提取空白然后把它变成[远程分支]”。