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。
将更改推送到远程仓库
我的远程仓库的简写名为 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 pull
。git 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
,系统将获取 origin
的 master
分支上的所有 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 提交到远程仓库。
上一篇: 学生信息管理系统c#(sqlsever)
下一篇: BUUCTF web部分writeup