4.5.1 上传(Pushing)
当你想与外部世界分享一个分支时,你需要把它上传到一个远端的你有写权限的服务器上。你的本地分支不会自动地与你要写的那个远端服务器同步--你必需显式地上传你想共享的分支。也就是说,你可以用私有分支来做你不想共享的工作,而只是上传那些你想协作的主题分支。
如果你有一个分支命名为serverfix,你想与其它人一起在其上工作,你可以用你上传你的第1个分支相同的方式上传它。运行git push (remote) (branch):
$ git push origin serverfix
Counting objects: 20, done.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (15/15), 1.74 KiB, done.
Total 15 (delta 5), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
* [new branch] serverfix -> serverfix
这是一个捷径。Git自动扩展serverfix分支名为refs/heads/serverfix;refs/heads/serverfix,这意味者:拿我的本地的serverfix分支把它上载到远端的serverfix分支并更新它。我们将在第9章更详细的介绍refs/heads部分,但你通常可以不用理它。你也可以这么做:git push origin serverfix:serverfix,这与上面所做的事情相同--它告诉你,拿我的serverfix把它变成远端的serverfix。你可以用这种格式来把本端的一个分支上传到远端的具有不同名称的分支上。如果你不想它在远端时被称为serverfix,你可以运行git push origin serverfix:awesomebranch来上传你本地的serverfix分支到远端项目的awesomebranch分支上。
下一次你的其中一个协作者从服务器获取更新时,他们将会得到一个参考指向服务器的远端分支origin/serverfix下的serverfix版本:
$ git fetch origin
remote: Counting objects: 20, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 15 (delta 5), reused 0 (delta 0)
Unpacking objects: 100% (15/15), done.
From git@github.com:schacon/simplegit
* [new branch] serverfix -> origin/serverfix
重要的一点是:当你从一个分离了新远端分支的服务器上获取时,你不会自动有一个本地的可编辑的它们的copy。换句话说,在这种情况下,你不会有一个新的serverfix分支--你只会有一个origin/serverfix指针而且你不能修改它。
为了合并这个工作到你当前的工作分支中,你可以运行git merge origin/serverfix。如果你想有一个你自己的serverfix分支并在其上工作,你可以从你的远端分支上创建一个:
$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"
这会给你一个本地的分支你可以在其上工作,该分支起始于origin/serverfix。
4.5.2 跟踪分支(Tracking Branches)
从远端分支检出一个本地分支(checkout)会自动创建一个所谓的跟踪分支(tracking branch)。跟踪分支是本地分支并与一个远端分支有直接的关系。如果你在一个跟踪分支上并输入git push,Git会自动的知道你要push到那个服务器的那个分支上。同样,在其中一个这样的分支上运行git pull获取所有远端的参考并自动合并到相应的远端分支中。
当你clone一个库时,它通常自动创建一个master分支来跟踪origin/master。这就是为什么git push 和git pull可以在没有其它参数时一样工作。然而,如果你希望你可以创建另外的跟踪分支--一个不跟踪origin上的分支及不跟踪master的分支。这个简单的情形就是你刚看到的例子,运行git checkout –b [branch] [remotename]/[branch]。如果是对Git 版本1.6.2或以后,你也可以使用--track缩写:
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"
为了建立一个名称与远端分支不同的本地分支,你可以简单地使用第一个版本并附带一个不同的本地分支名:
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "sf"
现在,你的本地分支sf将自动地从origin/serverfix来push to或者pull from。
4.5.3 删除远端分支(Deleting Remote Branches)
假设你在一个远端分支上的事情做完了--也就是说,你和你的协作者们完成了一个新功能而且把它合并到了你的远端master分支(或者其它什么你的稳定代码所处的分支)。你可以使用一个相当不明确的语法git push [remotename] :[branch]来删除一个远端分支。如果你想从server上删除你的serverfix分支,你可以运行:
$ git push origin :serverfix
To git@github.com:schacon/simplegit.git
- [deleted] serverfix
轰 ! 现在你的服务器上没有别的分支了,你可能会想标记一下本页,因为你会需要这个命令而你很可能会忘了这个语法。记住它的方法是想一下我们早先介绍的git push [remotename] [localbranch]:[remotebranch] 语法。如果你把[localbranch]留空,那么,你就是在说:不要从我这边拿任何东西,把它变成远端的[remotebranch]。