面向工资编程,面向面试学习!

使用远程仓库

为了方便和他人协作,我们需要将 git 仓库数据放在其他开发人员能够连接的远程服务器上。以下我们使用 Github 来作为远程仓库,并学习如何管理远程仓库。

添加远程仓库

运行 git remote add 将添加一个新的远程 Git 仓库,并指定了一个便于引用的简写。我们先在在 Github 上创建一个远程仓库,如果你没有 Github 账号可以去 GIThub 官网 https://github.com/注册。
在 github 上添加 SSH key 的步骤: 由于本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的,我们需要在 github 上添加 SSH 公钥。

在 github 上添加 SSH 公钥步骤:

1、首先需要检查本地电脑是否已经有 SSH key

在命令行里面输入如下命令:

ls -al ~/.ssh

这个命令会列出 ~/.ssh 目录下的所有文件,如果发现已经存在 id_rsa.pub 或 id_dsa.pub 文件,说明本地电脑中已经生成了 SSH key,那么你可以跳过步骤2,直接进入步骤3。

2、创建一个 SSH key

在命令行里面输入如下命令:

ssh-keygen -t rsa -C "foxchenxi@foxmail.com" -f ~/.ssh/github_foxchenxi_rsa

参数解释: -t 指定密钥类型,默认是 rsa ,可以省略。
-C 设置注释文字,比如邮箱。
-f 指定密钥文件存储文件名。
以上代码注释里面写的是我自己的邮箱,读者请设置自己的邮箱,密钥的文件名我设置的和我的github账号用户名相关联,因为我有多个github账号,本地已经有了 id_rsa 密钥文件名了,所以我个性化设置了一个避免冲突,请读者也自行设置,运行上面那条命令后会把私钥保存到 ~/.ssh/github_foxchenxi_rsa 文件中。在有多个 github 账号的时候由于一个ssh key只能被一个账号使用,所以生成多个ssh key是很有必要的。

当然,你也可以不输入文件名,使用默认文件名,那么就会生成 id_rsa 和 id_rsa.pub 两个秘钥文件,id_rsa 是私钥文件,id_rsa.pub 是公钥文件。
接着又会提示你输入两次密码(该密码是你push文件的时候要输入的密码,而不是github管理者的密码),当然,你也可以不输入密码,直接按回车。那么push的时候就不需要输入密码,直接提交到github上了,如:

Enter passphrase (empty for no passphrase): 
# Enter same passphrase again:

接下来,就会显示如下代码提示,如:

Your identification has been saved in /c/Users/you/.ssh/id_rsa.
# Your public key has been saved in /c/Users/you/.ssh/id_rsa.pub.
# The key fingerprint is:
# 01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@example.com

当你看到上面的提示信息就说明你的 SSH key 已经创建成功,你只需要添加到 github 的 SSH key 上就可以了。

3、添加你的 SSH 公钥到 github上面去

a、在命令行中打印 id_rsa.pub 文件的内容,然后复制该文件的内容:

cat ~/.ssh/id_rsa.pub

b、登录你的github账号,点击页面右上角你的个人资料照片,然后点击设置。

Github 用户栏中的设置图标

c、在用户设置边栏中,点击SSH和GPG密钥。

Github 认证密钥按钮

d、单击“ 新建SSH密钥”或“ 添加SSH密钥”。

Github SSH密钥按钮

e、在“标题”字段中,为新密钥添加一个描述性标签。例如,如果您使用的是个人Mac,则可以将此键称为“个人MacBook Air”。

f、将您的密钥粘贴到“密钥”字段中。

Github 粘贴 ssh key

g、单击添加SSH密钥。

Github ssh key 添加键按钮

h、如果出现提示,请确认您的GitHub密码。

Github Sudo模式对话框

为了验证是否成功,输入以下命令:

ssh -T git@github.com
Hi username! You've successfully authenticated, but GitHub does not provide shell access.

如果用户名是正确的,你已经成功设置SSH密钥。如果你看到 “access denied” ,表示拒绝访问,你需要检查下哪一步弄错了 。

在 github 创建仓库:

点击" New repository ", 如下图所示:

Github 创建仓库

在Repository name 填入 git_tutorial_cn(远程仓库名) ,其他保持默认设置,点击"Create repository"按钮,就成功地创建了一个新的 Git 仓库:

Github 创建仓库表单

创建成功后,显示如下信息:

Github 创建仓库成功信息

以上信息告诉我们可以从这个仓库克隆出新的仓库,也可以把本地仓库的内容推送到 GitHub 仓库。
现在,我们根据 GitHub 的提示,使用 SSH 协议把本地的 git_tutorial 仓库推送到远程,在 git_tutorial 目录下运行命令:

git remote add origin git@github.com:foxchenxi/git_tutorial_cn.git
git remote add or1 git@github.com:foxchenxi/git_tutorial_cn.git
git push -u origin master
Enumerating objects: 28, done.
Counting objects: 100% (28/28), done.
Delta compression using up to 8 threads
Compressing objects: 100% (24/24), done.
Writing objects: 100% (28/28), 3.43 KiB | 130.00 KiB/s, done.
Total 28 (delta 9), reused 0 (delta 0)
remote: Resolving deltas: 100% (9/9), done.
To git@github.com:foxchenxi/git_tutorial_cn.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin' by rebasing.

查看当前的远程库

要查看当前配置有哪些远程仓库,可以用命令:git remote。

git remote
origin
git remote -v
or1	git@github.com:foxchenxi/git_tutorial_cn.git (fetch)
or1	git@github.com:foxchenxi/git_tutorial_cn.git (push)
origin	git@github.com:foxchenxi/git_tutorial_cn.git (fetch)
origin	git@github.com:foxchenxi/git_tutorial_cn.git (push)

指定选项 -v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。

从远程仓库中抓取与拉取

git fetch [alias]

这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用。

git merge [alias]/[branch]

这个命令就把 [alias]/[branch] 分支合并到你所在的任意分支。

接下来我们在线编辑下 Github 上 git_tutorial_cn 仓库里 "README" 文件:

Github 在线编辑文件

把 "README"文件改名为 "README.md",内容修改为下面的:

# 盘古教程(panku.pro)Git Tutorial
我的 git 学习笔记  
git init 初始化 git 仓库  
git clone 克隆仓库  
git status 查看文件状态信息  
git add 可以用它来跟踪新文件,或者把已修改状态的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等  
git commit 提交暂存区的数据到本地仓库  
git fetch 拉取远程仓库中的数据  
git merge 合并分支  

然后我们在本地 git_tutorial 拉取更新:

git fetch origin
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:foxchenxi/git_tutorial_cn
 * [new branch]      master     -> origin/master

我们看到 * [new branch] master -> origin/master,说明更新已经拉取到本地,我们使用 git merge 把远程分支合并到本地分支:

git merge origin/master
Updating 4eb29c7..a5c4e04
Fast-forward
 README => README.md | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
 rename README => README.md (64%)

如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch 命令会将数据拉取到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。

如果你有一个分支设置为跟踪一个远程分支(阅读下一节 Git 分支 了解更多信息),可以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支。 pull 根据不同的配置,可等于 fetch + merge 或 fetch + rebase。默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)。 运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。

推送到远程仓库

推送本地分支到某个远端仓库命令:git push [remote-name] [branch-name]。当你想要将 master 分支推送到 origin 服务器时,那么运行这个命令就可以将你所做的备份到服务器:

git push origin master

只有当你有所克隆服务器的写入权限,并且推送前没有人推送过时,这条命令才能生效。 当你和其他人在同一时间克隆,其他人先推送到上游然后你再推送到上游,你的推送就会被拒绝。 你必须先将他们的工作拉取下来(git pull)并将其合并进你的工作后才能推送。

远程仓库的移除与重命名

如果想要重命名引用的名字可以运行 git remote rename 去修改一个远程仓库的简写名。 例如,想要将 or1 重命名为 ro,可以用 git remote rename 这样做:

git remote rename or1 ro
git remote
origin
ro

值得注意的是这同样也会修改你的远程分支名字。 那些过去引用 or1/master 的现在会引用 ro/master。
如果因为一些原因想要删除一个远程仓库——你已经从服务器上搬走了或不再想使用某一个特定的镜像了,又或者某一个贡献者不再贡献了——可以使用 git remote rm :

git remote rm ro
git remote
origin