Git-远程仓库

1.8 和远程仓库的那些事

如果只是在一个仓库里管理文件历史,Git和SVN真没啥区别。

远程仓库是 Git 的杀手级功能之一(注意是之一,也就是后面还有之二,之三……)。

生产环境中的实际情况往往是这样,找一台电脑充当 Git 服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。

那现在是不是需要搭建一台 Git 服务器,来作为远程仓库呢?如何搭建 Git 服务器,稍后我们再谈。

目前互联网上已经存在了这样的网站,可以提供 Git 服务器,并且大部分情况下是免费的。

GitHub 网站你知道吧,这是一个神奇的网站,它就可以充当我们的远程仓库。

要想使用 GitHub 作为我们的远程仓库,只需要注册一个账号即可,当然这是免费的。

GitHub 虽然是免费的,但是指针对于你创建的公共仓库;什么是公共仓库?就是放在仓库里的代码互联网的任何用户都可看到,并且可以拉取等操作。要想创建私有仓库,需要花钱。

所以目前大部分公司使用另一个网址的服务 GitLab ,这个网站和 GitHub 唯一的区别是,可以为普通用户提供创建私有仓库,并且为这个私有仓库提供权限服务,免费。

所以我们接下来主要介绍 GitLab 的使用。

1.81 注册 gitlab 账号

网址 https://about.gitlab.com/

填写信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1j5LNJom-1611095932888)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p40)]

见到下方图片内容后,就可以去邮箱进行确认了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BI5re7vl-1611095932891)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p41)]

邮箱确认
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gRNNjOmb-1611095932893)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p42)]

确认后,重新打开 GitLab 网站进行登录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OXlFHGdK-1611095932895)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p43)]

1.8.2 创建一个仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XgyzG5KF-1611095932898)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p44)]

创建一个私有仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rHWuu7hm-1611095932900)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p45)]

填好注册的相关信息后点击绿色的 Create project 按钮进行创建

1.8.3 和远程仓库建立SSH 信任关系

由于 GitLab 和 GitHub 都是用 SSH 协议对你的本地Git仓库和GitHub仓库之间的传输进行加密传输的。

为什么需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送,所以,需要一点设置

我们这里选择是 SSH 的通信方式,所以执行相关操作前,需要先解决本地机器和远程仓库的服务器之间的 SSH 信任关系,需要让远程仓库的服务器信任我们本地的机器。

只需要把本地的公钥传给远程仓库的服务器即可。

  1. 首先在本地机器上创建自己的密钥对
[shark@git ~]$ ssh-keygen   # 一路敲回车键即可
  1. 复制自己的公钥内容

    用 vim 打开公钥文件,之后赋值文件的整个内容

[shark@git ~]$ vim ~/.ssh/id_rsa.pub
  1. 添加公钥

    在刚才的 GitLab 创建仓库的页面上,点击头像,再点击 Settings

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jtLnrObq-1611095932902)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p46)]

在弹出的网页左侧边栏,点击 SSH Keys

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7TzGCE5p-1611095932905)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p47)]

把自己的公钥内容添加到远程仓库 GitLab 网站上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oCrqixMn-1611095932910)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p48)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BKJaqVw1-1611095932913)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p49)]

  1. 回到自己新建仓库的页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jIklElKr-1611095932915)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p50)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hmd8PWos-1611095932919)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p51)]

  1. 继续按照提示执行相关命令

设置本地仓库和 GitLab 仓库的通信方式为 SSH

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qnKSz0MY-1611095932921)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p52)]

在本地 Linux 机器上按照不同的情况执行如下命令

应该在每台需要给这个 GitLab 仓库建立联系的 Linux 机器上执行这些操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jSDoibef-1611095932923)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p53)]

我这里选择第一种,就是本地没有仓库,比如我要在我的家目录下建立仓库,做如下操作即可:

[shark@git ~]$ pwd
/home/shark
[shark@git ~]$ git config --global user.name "sharkyun"
[shark@git ~]$ git config --global user.email \
"sharkyunops@126.com"
[shark@git ~]$ git clone \
git@gitlab.com:sharkyun/my_project_one.git

克隆成功后,在当前目录下会有一个和你远程仓库同名的一个目录。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X88Vdj7L-1611095932925)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p54)]

这个目录就是本地的仓库了。

  1. 测试本地仓库

接下来继续按照 GitLab 网站上的提示,在这个本地仓库里创建测试文件并提交到本地仓库,最后同步到远程仓库(即: GitLab)

[shark@git ~]$ cd my_project_one/
[shark@git my_project_one]$ touch README.md
[shark@git my_project_one]$ git add README.md
[shark@git my_project_one]$ git commit -m "add README"
[master(根提交) 5e2b547] add README
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.md
[shark@git my_project_one]$ git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 211 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@gitlab.com:sharkyun/my_project_one.git
 * [new branch]      master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
[shark@git my_project_one]$
  1. 验证远程仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RvAgpzUe-1611095932931)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p55)]

1.8.4 总结
# 克隆一个远程仓库到本地
git clone git@gitlab.com:sharkyun/my_project_one.git

# 推送本地仓库的内容到远程仓库, 只有在第一次是使用 -u 之后不必再用 -u 参数
git push -u origin master

# 以后再此同步使用如下命令即可 
git push origin master

# origin  默认的远程仓库名 
# master  本地仓库名

最后有彩蛋赠送 git 和 github 的合作

1.9 再谈标签管理
1.9.1 推送某个标签到远程
  • 使用命令git push origin

为了测试先创建一个本地标签

[shark@git my_project_one]$ git log --pretty=oneline --abbrev-commit
5e2b547 add README
[shark@git my_project_one]$ git tag  tag_init 5e2b547
[shark@git my_project_one]$ git tag
tag_init

推送标签

[shark@git my_project_one]$ git push  origin  tag_init
Total 0 (delta 0), reused 0 (delta 0)
To git@gitlab.com:sharkyun/my_project_one.git
 * [new tag]         tag_init -> tag_init
[shark@git my_project_one]$

可以登陆 GitLab 验证

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-554a5HQr-1611095932934)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p56)]

  • 一次性推送全部尚未推送到远程的本地标签
[shark@git my_project_one]$ git tag  v1.0 5e2b547
[shark@git my_project_one]$ git tag  v1.1 5e2b547
[shark@git my_project_one]$ git push origin --tags
Total 0 (delta 0), reused 0 (delta 0)
To git@gitlab.com:sharkyun/my_project_one.git
 * [new tag]         v1.0 -> v1.0
 * [new tag]         v1.1 -> v1.1

当你推送标签时,Git 会同时把这个便签的内容一起推送,可以在 GitHub 上点击 tag 查看到这个标签的内容。版本是不会被推送的,需要显式推送

1.9.2 删除已经推送到远程的标签
  1. 先从本地删除
[shark@git my_project_one]$ git tag -d v1.1
已删除 tag 'v1.1'(曾为 5e2b547)
  1. 然后,从远程删除。
  • 删除命令也是push,但是格式如下:
[shark@git my_project_one]$ git  push  origin   :refs/tags/v1.1
To git@gitlab.com:sharkyun/my_project_one.git
 - [deleted]         v1.1

要验证删除远程标签,可以登陆GitHub查看。

1.10 和兄弟们协同作战

从上面的操作中不难看出,当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。

1.10.1 查看远程库的信息

执行如下命令需要在本地的 git 仓库目录下

  • git remote 查看远程仓库名
[shark@git my_project_one]$ git remote
origin
  • 用 git remote -v 显示更详细的信息
[shark@git my_project_one]$ git remote -v
origin	git@gitlab.com:sharkyun/my_project_one.git (fetch)
origin	git@gitlab.com:sharkyun/my_project_one.git (push)

上面显示了可以抓取和推送的 origin 的地址。如果没有推送权限,就看不到push的地址。

1.10.2 推送分支

推送分支,就是把该分支上 的所有本地提交推送到远程库。

  • 推送时,要指定本地分支名,这样,Git就会把该分支推送到远程库对应的远程分支上:
git push origin master
  • 如果要推送其他分支,比如 bac

为了测试,先创建一个分支 bac

[shark@git my_project_one]$ git branch bac

开始推送本地分支 bac 到远程仓库

[shark@git my_project_one]$ git push origin bac
  • 查看远程仓库的分支

刷新刚才的仓库页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n8rL0D8f-1611095932941)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p57)]

在这里就会看到所有的分支, 对号表示 GitHub 仓库当前所在的分支

但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?

* master 分支是主分支,因此要时刻与远程同步;

* dev 分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;

* bug 分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;

* feature分支是否推到远程,取决于你是否和你的小伙伴合作,在上面开发。

总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定

1.10.3 拉取分支

多人协作的工作模式通常是这样:

首先,可以试图用git push origin branch-name推送自己的修改;

如果推送失败,则因为远程分支比你的本地版本新,需要先用 git pull 从远程拉取到本地,并试图合并;

如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用 git push origin branch-name 推送就能成功!

如果 git pull 提示 “no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令

git branch --set-upstream branch-name origin/branch-name

这就是多人协作的工作模式,一旦熟悉了,就非常简单。

1.10.4 小结

查看远程库信息,使用 git remote -v

本地新建的分支如果不推送到远程,对其他人就是不可见的;

从本地推送分支,使用 git push origin branch-name ,如果推送失败,先用git pull抓取远程的新提交;

在本地创建和远程分支对应的分支,使用

git checkout -b branch-name origin/branch-name

本地和远程分支的名称最好一致;

建立本地分支和远程分支的关联,使用

git branch --set-upstream branch-name origin/branch-name

从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。


1.11 自定义 Git
1.11.1 配置别名

有没有经常敲错命令?比如git status?status这个单词真心不好记。

如果敲git st就表示git status那就简单多了,当然这种偷懒的办法我们是极力赞成的。

我们只需要敲一行命令,告诉Git,以后st就表示status:

$ git config --global alias.st status

好了,现在敲git st看看效果。

当然还有别的命令可以简写,很多人都用co表示checkout,ci表示commit,br表示branch:

$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch

以后提交就可以简写成:

$ git ci -m "bala bala bala..."
--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。

在撤销修改一节中,我们知道,命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区。既然是一个 unstage 操作,就可以配置一个unstage 别名:

$ git config --global alias.unstage 'reset HEAD'

当你敲入命令:

$ git unstage test.py

实际上Git执行的是:

$ git reset HEAD test.py

配置一个git last,让其显示最后一次提交信息:

$ git config --global alias.last 'log -1'

这样,用git last就能显示最近一次的提交:

$ git last
commit adca45d317e6d8a4b23f9811c3d7b7f0f180bfe2
Merge: bd6ae48 291bea8
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Thu Aug 22 22:49:22 2013 +0800

    merge & fix hello.py

甚至还有人丧心病狂地把lg配置成了:

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

可以试试 git lg 的效果

1.11.2 配置文件

配置Git的时候,加上–global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。

配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中:

[shark@git my_project_one]$ cat .git/config
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[remote "origin"]
	url = git@gitlab.com:sharkyun/my_project_one.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master
[alias]
    last = log -1

别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。

而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:

$ cat .gitconfig
[alias]
    co = checkout
    ci = commit
    br = branch
    st = status
[user]
    name = Your Name
    email = your@email.com

配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。

1.11.3 忽略特殊文件

有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files …,有强迫症的童鞋心里肯定不爽。

这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:

忽略文件的原则是:

  • 忽略操作系统自动生成的文件,比如缩略图等;

  • 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;

  • 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

举个例子:

假设你在Windows下进行Python开发,Windows会自动在有图片的目录下生成隐藏的缩略图文件,如果有自定义目录,目录下就会有Desktop.ini文件

  • 因此你需要忽略Windows自动生成的垃圾文件:
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
  • 然后,继续忽略Python编译产生的.pyc、.pyo、dist等文件或目录:
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
  • 加上你自己定义的文件,最终得到一个完整的.gitignore文件,内容如下:
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

# My configurations:
db.ini
deploy_key_rsa
  • 最后一步就是把.gitignore也提交到Git,就完成了!

当然检验 .gitignore 的标准是git status命令是不是说 working directory clean。

使用Windows的童鞋注意了,如果你在资源管理器里新建一个 .gitignore 文件,它会非常弱智地提示你必须输入文件名,但是在文本编辑器里“保存”或者“另存为”就可以把文件保存为.gitignore了。

有些时候,你想添加一个文件到 Git,但发现添加不了,原因是这个文件被.gitignore忽略了:

$ git add App.class
The following paths are ignored by one of your .gitignore files:
App.class
Use -f if you really want to add them.
  • 如果你确实想添加该文件,可以用-f强制添加到Git:
$ git add -f App.class

或者你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore

命令检查:

$ git check-ignore -v App.class
.gitignore:3:*.class    App.class

Git会告诉我们,.gitignore的第3行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。

小结
  • 忽略某些文件时,需要编写.gitignore;

  • .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!

GitHub 和 Git 的合作

1.8.1 设置本地和远程仓库的互信

由于 GitHub 是用 SSH 协议对你的本地Git仓库和GitHub仓库之间的传输进行加密传输的。

为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送,所以,需要设置

创建自己的 key
首先看看你的家目录里有没有你自己的私钥和公钥

位置就在自己的家目录下的 .ssh 隐藏文件夹里

bash-3.2$ ls -l  ~/.ssh
total 24
-rw-------  1 yanshunjun  staff  1679 10 18 11:53 id_rsa        # 自己的私钥
-rw-r--r--  1 yanshunjun  staff   402 10 18 11:53 id_rsa.pub    # 自己的公钥
-rw-r--r--  1 yanshunjun  staff  3343 10 17 09:00 known_hosts   # 里面有自己信任的主机

假如没有,用下面的命令创建即可,一路回车

bash-3.2$ ssh-keygen -t rsa -C   "bengtiaomami@126.com"  # 邮箱地址自定义
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/yanshunjun/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/yanshunjun/.ssh/id_rsa.
Your public key has been saved in /Users/yanshunjun/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:LMI6zxlGTEyJlOL0iMlAKSKN5klNGBh3OPNWiJKGDbU bengtiaomami@126.com
The key's randomart image is:
+---[RSA 2048]----+
|*%X*oo           |
|%OX*o .          |
|#+E+o.           |
|o* =o  .         |
|   .= . S        |
|   o . .         |
|  o o            |
|   = o           |
|    +            |
+----[SHA256]-----+

添加你的公钥到 GitHub 上
  • 登录后点击自己的头像,再点击 Settings

此图片截取时,是 2017-10-18,GitHub 在以后有可能会更新页面布局。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6KyLLXwg-1611095932944)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p58)]

  • 点击 SSH and GPG keys

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1AsMxpFO-1611095932946)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p59)]

  • 点击后,再跳转的页面再点击 New SSH key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bzaKKrBn-1611095932947)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p60)]

  • 添加公钥

点击后,会跳转到添加 key 页面。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zQHC1KU3-1611095932949)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p61)]

第一步: 给这个 key 起一个名字

第二步: 把你的公钥 id_rsa.pub 的内容粘贴到这里
需要注意的是要保证此文件里的内容被粘贴到这里时 是一行,本身就是一行

第三步: 点击 Add ssh key 完成 key 的添加

成功添加后,应该会看到自己添加好的 key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1PvVdBG3-1611095932951)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p62)]

当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。

最后友情提示,在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去。

如果你不想让别人看到Git库,有两个办法,一个是交点保护费,让GitHub把公开的仓库变成私有的,这样别人就看不见了(不可读更不可写)。另一个办法是自己动手,搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的。这个方法我们后面会讲到的,相当简单,公司内部开发必备。

1.8.2 创建远程仓库

假如你从一开始看这个教程,一直到现在。目前的情景是,你已经在本地创建了一个 Git 仓库,现在又想在GitHub 创建一个 Git 仓库,并且让这两个仓库进行远程同步,这样,GitHub 上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。

首先,登陆 GitHub

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zAu9FYvH-1611095932952)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p63)]

  1. 点击 GIt 图标即可回到自己账户的首页
  2. 点击 New repository 来创建一个新的仓库
填写新仓库的相关信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yrAGKxUM-1611095932954)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p64)]

  1. 给仓库起个名字 本地仓库名和远程仓库名可以不一样
  2. 写上一些关于这个仓库的描述信息
  3. 默认是公共的仓库
  4. 最后点击 Create repository
创建完成

创建完成后,会跳转到这个新创建的仓库页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5a2RhrHQ-1611095932956)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p65)]

  1. 这个是你使用本地仓库链接 GitHub 上这个仓库的地址,下一小节会介绍怎么用它。
  2. 点击这里可以进行复制

新创建好的仓库支持三种方式和本地仓库同步链接

  1. 支持在本地创建一个新的仓库和 Git 仓库同步
  2. 支持从本地现有的仓库和 Git 仓库同步
  3. 支持从其他的 版本控制库里和 Git 仓库同步,比如 SVN

接下来我会介绍前两种方式的同步,接下来先介绍把本地已有的仓库和 Git 仓库同步

1.8.3 在一起

按照 Git 的提示,把本地已有的仓库 mygithub 和 刚才我们新建的 GitHub 上的仓库关联在一起

git remote add origin git@github.com:sharkgit1976/study.git
说明一下: 

* git  remote add   命令用于添加远程仓库到本地仓库
* origin            是 GitHub 远程仓库映射到本地的仓库名,这是默认的,也没必要去修改它
* sharkgit1976      是我的 GitHub 的账户名,你不要复制这个教程中的这条信息,复制你自己的
* study.git         同样是我刚才创建的仓库名,你用你自己的
实操
bash-3.2$ git remote add origin git@github.com:sharkgit1976/study.git

正常不会出现任何信息

信息会保存在 .git/config 文件中

bash-3.2$ cat .git/config
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
	url = git@github.com:sharkgit1976/study.git    # 这里是连接 GitHub 的方式,当前的方式是 SSH
	fetch = +refs/heads/*:refs/remotes/origin/*

推送本地仓库的内容到远程仓库
接下来我们就可以把本地仓库的代码全部推送到远程仓库了。
  • 把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

bash-3.2$ git push  -u  origin  master

此后,每次在本地仓库提交后,只要有必要,就可以使用命令 git push origin master 推送最新修改。

  • 第一次连接远程仓库,会出现一个警告信息,这个是提示你验证远程 Git 的 key 的真实身份,我们这里输出 yes ,表示信任此来源的 key。
The authenticity of host 'github.com (192.30.255.113)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.255.113' (RSA) to the list of known hosts.
Counting objects: 906, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (865/865), done.

  • 之后就开始同步了
Writing objects: 100% (906/906), 4.86 MiB | 146.00 KiB/s, done.
Total 906 (delta 217), reused 0 (delta 0)
remote: Resolving deltas: 100% (217/217), done.
To github.com:sharkgit1976/study.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

  • 同步完成, 可以看看远程仓库,应该和本地的一样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-muTuNRN3-1611095932958)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p66)]

从远程仓库克隆到本地仓库

现实的情况是:

假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。

  • 登陆GitHub,创建一个新的仓库,名字叫 sharkgit

和之前在 GitHub 上创建一个新仓库的步骤基本一样,不一样的地方看下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a1lK8RGc-1611095932960)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p67)]

这里我们填好仓库名和描述信息,我们在下面勾选 Initialize this repository with a README

看此选项下方的说明:这将让您立即将存储库克隆到计算机上。如果您正在导入现有的存储库,请跳过此步骤。

意思是:勾选此选项,GitHub 就会初始化这个仓库,并且创建一个名字为 README.md 的文件。就像是你再把本地执行 git init 命令一样。

这里我没创建成功。原因是创建的仓库名在这个账号中已经存在了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c6pndF5Z-1611095932961)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p68)]

重新修改仓库名为 xiguatian-repository,创建成功

  • 克隆到本地

创建成功后,会跳转到这个新仓库的页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Vj95Trz-1611095932963)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p69)]

  1. 点击 Clone or download
  2. 再在弹出的框里点击 复制 图标,复制克隆的地址
    这里可以看到默认是用 ssh 进行克隆的,协议是 git。
    当然,也支持 HTTPS 不过会很慢,并且每次连接需要输入用户名和密码。
  • 执行命令: git clone

这个命令会把远程仓库克隆到本地,会在你执行命令的目录下,创建一个和远程仓库名字一样的文件夹,也就是以后本地的仓库了

bash-3.2$ git clone git@github.com:sharkgit1976/xiguatian-repository.git
Cloning into 'xiguatian-repository'...
Warning: Permanently added the RSA host key for IP address '192.30.255.112' to the list of known hosts.
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
bash-3.2$ ls
xiguatian-repository

在这个目录下你会看到 README.md 文件和 .git 目录

bash-3.2$ cd xiguatian-repository/
bash-3.2$ ls
README.md
bash-3.2$ ls -a
.		..		.git		README.md

现在克隆完成,你可以在这个本地仓库进行开发,提交到本地仓库。需要的话,把本地仓库的内容推送到远程的仓库。

bash-3.2$ git  status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean
bash-3.2$ git branch
* master
bash-3.2$ git log
commit c032b977c57cce865b42041a975a32888e4a965f (HEAD -> master, origin/master, origin/HEAD)
Author: sharkgit1976 <dockerhub@163.com>
Date:   Wed Oct 18 02:15:55 2017 -0500

    Initial commit
(END)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shark_西瓜甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值