Git 使用远程仓库

远程仓库

什么是远程仓库

Git 是一个分布式版本控制系统,这意味着不存在一个主信息仓库。每位开发者使用的都是仓库的一个副本。因此,你可以拥有仓库的一个副本(它包含发布的 commit 和版本历史记录),并且你的朋友也可以拥有相同仓库的一个副本。每个仓库包含的信息与其他副本完全相同,没有哪一个是主要的。

在此之前,你可能一直使用的都只是本地仓库。而远程仓库与你的本地 Git 仓库一样,只是它位于其他地方(github 或其他电脑上)。

访问远程仓库的方式

访问远程仓库的方式有多个:

  • 使用 URL
  • 使用系统文件的路径

虽然你也可以在自己的文件系统上创建远程仓库,但这种做法极少见。到目前为止,访问远程仓库的最常见方式是通过位于 Web 上的仓库的 URL

我们与远程仓库交互和控制远程仓库的方式,是使用 Git 远程命令:

$ git remote
  • 可以连接到多个不同的远程仓库。
  • 简写名是用于指代远程仓库位置的名称。通常该位置为 URL,但也可能是同一台计算机上的文件路径。
  • git remote add 用于添加到新的远程仓库的连接。
  • git remote -v 用于查看远程仓库与连接之间的详细信息。

为何需要多个远程仓库

简单来说,如果你跟多个开发者合作,那么你就需要在他们合并到 master 分支之前,在项目中获取他们在各自的分支上所做的更改。如果你想在决定实施自己的更改前,测试一下他们的更改,则需要这么做。

添加远程仓库

git remote 命令可以让你管理远程仓库和与之交互。

这里写图片描述

git remote 的输出只是一个单词 origin。”origin” 一词称为”简写名”。简写名只是远程仓库所在位置的简略表示。简写名仅局部用于当前仓库(如在你的本地仓库中)。”origin” 一词是指代主远程仓库的专用名称。你也可以将它重命名为别的东西,但通常会被命名为 “origin”。

我们为何关心引用远程仓库路径的简便性?这是因为,你很快会发现我们将在很多命令中,用到远程仓库的路径。而这时,只使用一个名称就比使用远程仓库的完整路径简单多了。

如果你想查看远程仓库的完整路径,只需使用 -v 选项即可。

在 GitHub 上托管

GitHub 与 Git 非常相似,有时候人们会将 Git 和 GitHub 混淆,认为它们是完全一样的,而事实上它们大相径庭。

  • Git 是一个版本控制工具(命令行)
  • GitHub 是一个托管 Git 项目的服务
git remote add origin https://github.com/huabinzhang427/my-travel-plans.git

首先自己在 GitHub 上创建仓库,然后通过上面的命令,在我的本地仓库与 GitHub 帐户上刚创建的远程仓库之间创建连接

通过 git clone 克隆的仓库,无法更改在 GitHub 上的项目,因为它不是该远程仓库的所有者。

这里写图片描述

git remote add 用于创建一个 origin 简写名,添加了一个远程仓库的链接,指向 GitHub 上的项目。
git remote -v 会显示简写名和 URL。

git remote 命令

将更改推送到远程仓库

这里写图片描述

我的远程仓库的简写名为 origin,并且我想推送的 commit 位于 master 分支上。那么,我要使用以下命令将我的 commit 推送到 GitHub 上的远程仓库:

$ git push origin master

git push 命令需要:

  • 你想向其推送 commit 的远程仓库的简写名
  • 包含你想推送的 commit 的分支名

这里写图片描述

有几点需要注意:

  • 你可能需要输入用户名和密码,这取决于你如何配置 GitHub 的以及使用的远程 URL 。如果你使用的是 HTTP 版本(而不是 ssh 版本)的远程仓库,就需要提供用户名和密码。如果你配置 GitHub 使用 SSH 协议,并提供过 SSH 密匙,就不需要执行上一步。如果你对使用 SSH 连接 GitHub 感兴趣,请参阅使用 SSH 连接 GitHub 文档
  • 如果你要输入用户名和密码,用户名会在输入后显示出来,但密码不会显示。只需继续输入密码,完成后按 Enter 键即可。
  • Git 会压缩文件使之变小,然后将其推送至远程仓库。
  • 这里创建了一个新分支,在页面底部可看到 [new branch],后面是 master -> master

这里写图片描述

现在我们输出中有一个标记 (marker)!该标记为 origin/master,并被称为跟踪分支。跟踪分支的名称包含远程仓库的简写名及分支名称。所以跟踪分支 origin/master 告诉我们远程仓库 origin 有一个 master 分支,指向 commit 5590046(并包含 5590046 前的所有 commit )。这非常有用,因为这意味着我们可以在本地仓库跟踪远程仓库的信息!

需要注意的一点是,这个 origin/master 跟踪分支并不能实时表现被跟踪分支在远程仓库上的位置。如果我们之外的其他人对远程仓库做了更改,我们本地仓库中的 origin/master 跟踪分支不会移动。我们必须告诉它检查更新,它才会移动。

从远程仓库拉取修改

这里写图片描述

做出这样操作的情况是本地仓库与远程仓库的状态不一致,我们需要同步远程仓库的状态到本地仓库。

这里写图片描述

本地仓库中出现的分支实际上在跟踪远程仓库中的一个分支(例如,本地仓库中的 origin/master 称为跟踪分支,因为它在跟踪远程仓库上简写名为 “origin” 的 master 分支)。

添加远程更改

使用 git pull 拉取更改

git push 会同步远程仓库与本地仓库。要执行相反操作(将本地仓库与远程仓库同步),我们需要使用 git pullgit pull 的格式与 git push 的非常相似 - 提供远程仓库的简写名,以及你要拉取 commit 的分支名称。

$ git pull origin master

在运行 git pull 时,会发生以下活动:

  • 远程分支上的 commit 会被复制到本地仓库。
  • 本地跟踪分支(origin/master)移到指向最新的 commit。
  • 本地跟踪分支(origin/master)合并到本地分支(master)。

这里写图片描述

运行 git pull origin master 会检索 origin 远程仓库 master 分支中的 commit。

运行此代码时需要注意几点:

  • 格式与 git push 非常相似 - 要对项目计数、压缩和打包。
  • 它有一个短语 “fast-forward”,这意味着 Git 进行了快进合并。
  • 它显示类似于 git log --stat 的信息,其中显示更改的文件以及添加或删除了多少行。

如果你不想自动将本地分支与跟踪分支合并,则不应使用 git pull,而是使用另一个命令 git fetch。当远程仓库包含你没有的 commit ,但本地仓库也包含远程仓库所没有的 commit 时。

注意,可以在 GitHub 上手动添加更改(但不建议这样做,所以别这样做)。

Pull 和 Fetch

git fetch 用于从远程仓库分支检索 commit ,但不会在收到这些 commit 之后,自动将本地分支与远程跟踪分支合并。

$ git fetch origin master

运行 git fetch 后,会发生以下活动:

  • 远程分支上的 commit 会复制到本地仓库
  • 本地跟踪分支(例如,origin/master)移到指向最新的 commit

需要注意的一点是,本地分支完全不会被改变。你可以将 git fetch 想象成 git pull 它的一半操作,而 git pull 的另一半是合并。

现在的状况是远程仓库上具有本地仓库没有的 commit。

这里写图片描述

运行 git fetch origin master,系统将获取 originmaster 分支上的所有 commit。并移动至 origin/master 跟踪分支,使其指向这些 commit。

这里写图片描述

就这样,并没有让本地 master 分支移动。如果我们希望本地 master 分支具有 origin/master 中的 commit,则需要进行手动合并(merge)。如果我们位于 master 分之上,则需要运行 git merge origin/master 以更新本地 master 分支。

这里写图片描述

使用 git fetch 而不是 git pull 的一个主要情形是当你的远程分支和本地分支都拥有对方所没有的更改时。在这种情况下,你要获取远程更改,将它们存储到本地分支中,然后手动执行合并。最后,你可以将新的合并 commit 推送会远程仓库。

本地仓库落后于远程仓库。

这里写图片描述

现在假设我们没有注意到这一点,然后在本地仓库做了一次提交。现在我们两个仓库,前几个提交相同,但现在他们的 master 分支指向不同提交。如果我们试着运行 git pull 命令并不起作用。

这里写图片描述

但是我们可以使用 git fetch 在不合并的情况下获取远程仓库的提交。所以如果我们执行 git fetch origin master 命令就会获取远程仓库的提交,并且将 origin/master 指向它们。

这里写图片描述

由于我们在 master 分支上,我们可以运行 git merge origin/master 命令,把远程做的修改更新到我们的 master 分支上。

这里写图片描述

现在本地仓库拥有一些远程仓库没有的提交,所以我们需要推送这些提交。在 origin/master 分支上执行 git push 命令将会推送更新后的本地 commit 提交到远程仓库。

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值