使用 Git 远程仓库

来源:互联网 发布:我爱网球网淘宝店 编辑:程序博客网 时间:2024/05/01 09:02

[Git] 使用 Git 远程仓库 (Remote repositories)

之前,我们所有的 Git 操作都是在本地机器上。这是 Git 的特性之一,因为其它的一些版本控制系统 (version control system) 会要求拥有网络访问。Git 并不强制要求,但是能够强大的功能。接下来就看看吧。

首先需要的是另外一台,想要共享我们项目的电脑。我刚好有另外一台已经安装了 Git 运行 Ubuntu Luck Lynx 的系统。如果没有也没关系,因为 GitHub 可以为你提供这一切。

一些设置

在我们开始之前,需要确保在主机 (the client) 和保存远程仓库的机器 (the server) 的 SSH 配置正确。有很多不错的教程:比如这个 LifeHacker 上的讲解设置本地网络,还有 GitHub 上关于设置 SSH keys (Mac, Windows, Linux) 的 。可以先忽略给 GitHub 添加 keys,稍候详细说明。

Git Clone

虽然之前,我提到说两台电脑,一个为 client 一个为 server,但事实上没有区别,Git 视所有拥有给定仓库 (repository) 复本的电脑是一样的。我们可以复制项目目录到其它电脑,比如使用 Dropbox,压缩在发送邮件,或者直接移动存储拷贝。

我已经复制把示例仓库复制到 Ubuntu 的 /home/shawn/project 目录下。现在,在主机上,打开命令提示符,移动到想要保存仓库的位置。

再来使用 Git 命令 clone

$ git clone shawn@192.168.2.18:project theProject

使用 git clone 命令会在本地建立一个远程项目的复本,就是克隆。命令的下一个部分是需要 clone 的远程仓库,在局域网内;使用 ‘shawn’ 登录到远程主机,并且获取用户主目录 (home directory) 下的自目录 ‘project’ 下的仓库 (repository)。当你使用 GitHub 的时候,会给你一个 URL 进行 clone:与上面的很相似,或者是正常的 http URL。其实,参数只是另一个仓库的路径,也可以在同一台主机上。

命令的最后一部分 (‘the project’) 是完全可选的:git clone 命令将给需要克隆的仓库建立目录。这个参数是目录名,如果留空,Git 将会使用远程目录名作为本地仓库目录名。

Git Remote

从远程电脑获取仓库 (repository)的复本是很容易的。现在已经克隆了仓库 (repo),运行如下代码:

$ git branch -a* masterremotes/origin/HEAD -> origin/masterremotes/origin/authorizationremotes/origin/master

你已经了解了 git branch 命令,通过这个命令列出仓库中的所有分支 (branch)。这一次,我添加了 -a 标志 (flag),来显示所有本地分支和远程跟踪分支 (remote-tracking branches)。现在的问题是,到底什么是远程跟踪分支呢 (remote-tracking branch)?首先,你需要了解远程 (remote):远程简单的说就是指向我们克隆的远程仓库的一个指针 (pointer)。远程跟踪分支 (remote tracking branches) 指向指定的远程仓库上的分支,这样允许我们保持跟踪远程仓库上的改变,并且按我们的需要进行整合 (integrate)。正如上面所看到的,已经有了远程跟踪分支:一个跟踪远程仓库 (remote repo) 的主分支 (master branch),一个跟踪认证分支 (authorization branch),以及一个跟踪它的  HEAD。

添加其它跟踪分支也是很容易的 (尤其是在与他人协同项目,和他人共享他们仓库的公共复本时,更加有用)。如下:

$ git remote add remoteName remoteURL

事实上,你可以在 Git 配置文件 (config file) 中看到远程 (remotes),在项目目录下,Windows 下用记事本 (noptead.exe) 打开 .git/config;如果时 Mac 用户,在项目目录下运行 cat .git/config。应该看到类似如下的信息:

[remote “origin”]fetch = +refs/heads/*:refs/remotes/origin/*url = andrew@192.168.2.18:project

可以看到远程仓库 (remote repository) 的 URL 地址,就是跟踪的远程分支。

Git Fetch / Git Pull

我已经在远程仓库 (remote repository) 做了一些改变,现在想要下载到本地仓库中 (local repo)。以下就是如何实现的:第一步是从远程获得这些改变:

$ git fetch origin masterandrew@192.168.2.18’s password:remote: Counting objects: 5, done.remote: Compressing objects: 100% (3/3), done.remote: Total 3 (delta 2), reused 0 (delta 0)Unpacking objects: 100% (3/3), done.From 192.168.2.18:project3d0b0a4..2d418e6 master    -> origin/master

运行 git fetch 命令,参数为远程名称 (origin) 以及它的分支 (master)。可以通过 gitk –all 查看树状提交 (tree view of commits)。

可以看到,远程跟踪分支 “remotes/origin/master” (指向远程仓库的 master 分支) 已经向前移动了一个提交。可以通过在本地 master 分支 (branch) 运行 diff 命令查看分支内的改变,和远程 master 分支的改变。

如果我们喜欢远程上的改变,如何合并到本地的 master branch 呢?非常的简单,首先,确保是在想要合并改变的本地分支上:

$ git checkout masterAlready on ‘master’Your branch is behind ‘origin/master’ by 1 commit, and canbe fast-forwarded.$git merge origin/masterUpdating 3d0b0a4..2d418e6Fast-forwardcontact.html |    4 ++++1 files changed, 4 insertions(+), 0 deletions(-)

注意到 checkout 主分支 (master branch),Git 发现已经取得但没有使用的改变,并通知用户,这样,是在 “origin/master” 后的提交。接下来,一个很简单的合并操作来带入这些改变。

有一个快捷命令操作,来代替运行 git fetch remoteName branchName 和 git merge remoteName/branchName,如下所示:

$ git pull origin master

这样就可以获得 (fetch) 指定远程分支上的改变,自动合并当前分支。如果你明白你需要做什么,当然最好;但是必须要注意,特别是应用到 master branch 时。当使用 pull 命令时,最好时放到另外的分支进行测试。

Git Push

如果使用 GitHub 作为远程 (remote),在这个例子中,你将不会对远程仓库进行改变,而是在本地进行改变,再拖送 (push up) 到GitHub。

让我们尝试推送一些改变到远程仓库。

$ git push origin masterandrew@192.168.2.18’s password:Counting objects: 5, done.Delta compression using up to 2 threads.Compressing objects: 100% (3/3), done.Writing objects: 100% (3/3), 389 bytes, done.Total 3 (delta 1), reused 0 (delta 0)To andrew@192.168.2.18:project80bf94a..02afb67 master -> master

这一操作将会推送当前分支到指定远程分支,如指定远程 (origin) 的主分支 (master branch)。

这里就算是使用 Git 远程仓库的一个小结了,在使用 GitHub 的时候再进行练习。