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 信任关系,需要让远程仓库的服务器信任我们本地的机器。
只需要把本地的公钥传给远程仓库的服务器即可。
- 首先在本地机器上创建自己的密钥对
[shark@git ~]$ ssh-keygen # 一路敲回车键即可
-
复制自己的公钥内容
用 vim 打开公钥文件,之后赋值文件的整个内容
[shark@git ~]$ vim ~/.ssh/id_rsa.pub
-
添加公钥
在刚才的
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)]
- 回到自己新建仓库的页面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]
- 继续按照提示执行相关命令
设置本地仓库和 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)]
这个目录就是本地的仓库了。
- 测试本地仓库
接下来继续按照 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]$
- 验证远程仓库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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 删除已经推送到远程的标签
- 先从本地删除
[shark@git my_project_one]$ git tag -d v1.1
已删除 tag 'v1.1'(曾为 5e2b547)
- 然后,从远程删除。
- 删除命令也是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)]
- 点击 GIt 图标即可回到自己账户的首页
- 点击 New repository 来创建一个新的仓库
填写新仓库的相关信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yrAGKxUM-1611095932954)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p64)]
- 给仓库起个名字 本地仓库名和远程仓库名可以不一样
- 写上一些关于这个仓库的描述信息
- 默认是公共的仓库
- 最后点击 Create repository
创建完成
创建完成后,会跳转到这个新创建的仓库页面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5a2RhrHQ-1611095932956)(evernotecid://BBD579E0-7127-4377-8E81-47BEA574FA91/appyinxiangcom/25594833/ENResource/p65)]
- 这个是你使用本地仓库链接 GitHub 上这个仓库的地址,下一小节会介绍怎么用它。
- 点击这里可以进行复制
新创建好的仓库支持三种方式和本地仓库同步链接
- 支持在本地创建一个新的仓库和 Git 仓库同步
- 支持从本地现有的仓库和 Git 仓库同步
- 支持从其他的 版本控制库里和 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)]
- 点击 Clone or download
- 再在弹出的框里点击 复制 图标,复制克隆的地址
这里可以看到默认是用 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)