Github仓库的创建
我们想要在全球最大的同性交流网站上提交你自己本地的版本仓库,那么首先就需要注册一个Gtihub账号,具体的操作无非就是邮箱注册这些,为了方便演示,我初始化了我本地的版本仓库,并创建了一个Firstfile
This is the first line and commit
SEELE@DESKTOP-RHPQ0IE MINGW64 /F/Gitfile (master)
$ git status
On branch master
nothing to commit, working tree clean
这时候我们进入github
的页面中Create a new repository
创建新的仓库这个界面
- 因为我选择的是免费的
github
,所以只能使用Public
仓库 README
我自己写,所以不需要添加,这个仓库我只用作测试与演示,所以不需要添加语言备注.gitignore
与license
这样我的一个新的仓库就创建好了
因为我并没有配置README
这个Markdown
,所以我要在自己的本地版本仓库配置一个README
文档,并提交到我的本地缓存区
SEELE@DESKTOP-RHPQ0IE MINGW64 /F/Gitfile (master)
$ vim README.md
## This repository is used for my Git and Github learning
# author
* YQHP-YuKi
SEELE@DESKTOP-RHPQ0IE MINGW64 /F/Gitfile (master)
$ git status
On branch master
nothing to commit, working tree clean
这时候我们就需要将此时的本地版本仓库提交到Github
的仓库,我们就可以用到此条命令:
git remote add origin
意思就将你本地的仓库关联到远程仓库的地址,后面加上你远程仓库的HTTPS
$ git remote add origin https://github.com/YQHP-YuKi/Gitleaning.git
然后再加上此命令:
git push -u origin master
这条命令意思就是将本机上的master
分支推送到远程版本仓库并与之相关联
$ git push -u origin master
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 12 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 583 bytes | 583.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/YQHP-YuKi/Gitleaning.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
输入你的Github
账号密码即可
这时候我再刷新我的Github
的仓库网页,就看见将本地master
传上去了
Git远程操作
我们在本地Git
执行一些命令,可以查看到本地Git
仓库与外界服务器版本库有哪些关联
git remote show
SEELE@DESKTOP-RHPQ0IE MINGW64 /F/Gitfile (master)
$ git remote show
origin
这条命令就可以看到我本地版本库就只与Github
上面的版本库做了相关联,如果我与Gitlab
或者其他服务器做了关联,也会罗列出来
git remote show + 版本库名字
:了解详细信息
SEELE@DESKTOP-RHPQ0IE MINGW64 /F/Gitfile (master)
$ git remote show origin
* remote origin
Fetch URL: https://github.com/YQHP-YuKi/Gitleaning.git
Push URL: https://github.com/YQHP-YuKi/Gitleaning.git
HEAD branch: master
Remote branch:
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
注:罗列出了我Fetch
与Push
拉取推送的网址,并且显示了与本地相关联的分支,且当前状态下相互合并的状态
基于Git分支的开发模型
develop
分支(频繁变化の一个分支)test
分支(供测试和产品等人员使用的一个分支,变化不是特别频繁)master
分支(生产发布分支,变化非常不频繁の一个分支)bugfix(hotfix)
分支(生产系统中出现了紧急的Bug,用于紧急修复的分支)
使用SSH连接远程Github仓库
使用HTTPS
连接并不是我们连接Github
仓库的主流方式,因为当使用HTTPS/HTTP
协议建立本地仓库与远程厂库联系时,不需要进行任何配置,但是每次进行推送都需要输入账号密码,而使用SSH
协议,只需要进行一次配置,就可以实现免密推送,我们主流连接主要是使用SSH
进行连接,所以现在我重新连接Github
仓库
因为我是已经连接到了我的Github
的仓库的,所以相当于我已经将远程仓库Github
的IP
地址添加到了本地信任地址中,如果每有关联,则执行此命令:
git remote add origin +你的SSH链接
接下来,使用以下命令生成本地计算机的公钥和私钥
ssh-keygen
进入ssh
cd ~/.ssh
打印公钥
cat id_rsa.pub
注:在生成过程中,可以选择公钥和私钥的保存地址,默认是保存在.ssh
文件夹下的,还可以设置密码,也可以不设置,直接回车即可生成公钥和私钥
接下来我们要做的就是把生成的公钥部署到远程仓库Github
上,如图所示:
在该界面可以添加多个公钥,如果项目组有多个成员,或者一个人使用多台电脑可以设置多个公钥
公钥与私钥的地址都在你ssh-keygen
下面的文件路径里面,注意:一定要勾选Allow write access
选项,否则无法将本地仓库代码推送到远程仓库,并且添加时要输入Github
账号密码进行确认
添加完成后,就可以在原来的界面看到新增的公钥了,这样使用该公钥的本地计算机就具有了读写这个远程仓库的权限了
如果你原来也是用的HTTPS
,这时候也配好了公钥,这时候只需要git clone +你原来的HTTPS
让两个版本库一样,再去修改.git/config
下的url
即可:
有3种方法可以查看到你是否已经将本地仓库关联到远程仓库:
git remote //只显示远程仓库地址名
git remote -v //显示远程仓库地址名和对应URL
git remote show origin//显示详细信息
实际开发中,通常会使用SSH
协议进行本地仓库与远程仓库的连接,因为只需要配置一次公钥,就可以免密推送,十分方便:
添加账户SSH
之前在Github
上的Gitlearning
仓库中添加了一把SSH
公钥,但该SSH KEY
仅限于本地与test
仓库的通信,不能在其他仓库中使用
如果我们想让Github
上的所有仓库都使用同一把SSH KEY
,就需要配置针对账号的SSH KEY
了
在Seeting
中新建全局的SSH KEY
Git协作
SVN
方式(典型模型)
现有两位工作人员,分别为A
与B
,还有个就是远程仓库C
A
首先将本地仓库的代码推送push
到远程仓库C
中,此时A
和C
两个仓库的文件一致- 接下来
B
将C
的代码拉取pull
下来,此时A
,B
,C
三者之间的仓库是一致的,然后A
与B
分别在各自的本地进行开发,并向各自的本地仓库进行了数次commit
- 这时候
A
再向C
推送修改过后的本地仓库文件,由于先前A
,B
,C
三者一样,现在A
做了修改,相当于C
中文件A
都有,所以不发生冲突,所以可以直接推送,不用先执行git pull
这时候
B
也想向远程仓库C
推送自己修改的文件,但却出现了失败,这是因为:此时的C
中有A
做出的修改,不能让B
进行覆盖,此时B
想要成功推送,只能先将C
的文件拉取pull
到本地,拉取pull
时候有两种情况:- 成功(success):说明
A
与B
修改的不是同一个文件,采用Fast-forward
方式自动合并 - 失败(fail):说明
A
与B
修改了同一个文件,这时候就需要B
手动解决冲突并合并
- 成功(success):说明
B
成功的将C
中的文件pull
到了本地并合并成功后,就能将B
对本地仓库所做的修改推送push
到远程仓库C
了,此时C
与B
的版本库则也完全一样了,但与A
不一样了
注:在整个过程中,可以发现远程仓库C
仅仅是起到了代码第三方托管
的作用,不同于SVN
的远程仓库C
,SVN
的仓库只有远程C
一个,用户A
与B
都没有,假如C
出问题了,会导致所有的提交信息都丢失,而git
的分布式管理系统则不会出现这种情况
本地远程分支
当我在与Github
仓库进行关联后,再执行git status
时,我们会发现与以前没关联的时候有了一些细微的变化
git
中其实有三种分支:本地分支
,本地远程分支
,远程分支
- 可以这样理解:本地远程分支是远程分支的一个镜像,并且在本地仓库与远程仓库之间起到一个桥梁的作用
- 在没有办法直接查看远程仓库的时候,可以通过本地远程分支观察远程分支的变化情况,比如本地远程分支
origin/main
就对应着远程分支main
正如图所示,origin/main
为本地远程分支,代表的是远程仓库的main
分支,而这个分支是在本地的,也就是说加上远程仓库的main
分支,一共有三个master
分支
并且,当本地仓库中的每一个分支都有与之关联
的远程分支之后,本地仓库都会创建对应的本地远程分支
,他们所处的位置和关系如图所示
可以这样理解:本地远程分支origin/master
为远程分支master
的本地化形式
假设远程仓库和本地仓库文件内容是一样的,都只有两次提交,此时三个分支的状态如下图所示
当我尝试从master
切换到origin/master
时,会出现这种:
所以对于origin/master
你是最好不要手动改变,因为这个分支是由git push
和git pull
来进行改变的
模拟多人协作
假如我是一名程序员B
,我想把github
上面的项目C
给下载到本地,进行版本开发,我可以使用这条命令
git clone +SSH 或者 +HTTPS
- 我们可以发现名字自动就成了仓库
C
的名字
我进去看看
SEELE@DESKTOP-RHPQ0IE MINGW64 /F/Gitfile2
$ cd Gitlearning/
SEELE@DESKTOP-RHPQ0IE MINGW64 /F/Gitfile2/Gitlearning (main)
- 可以发现自动切换到的
master
分支
为什么会造成这种原因了,那是因为,我切回到程序员A
提交的仓库看看
我们程序员A
最先前就是默认的master
分支
其实我们程序员B
克隆仓库C
不一定必须也叫Gitlearning
,我们也可以自己设置,我现在就删除,重新创建一个,在SSH
或者HTTPS
后面跟你想要的仓库名字即可
然后我们配置B
程序员的仓库,使与程序员A
保持不一致
现在程序员A
与程序员B
的仓库还有远程C
完全一样
正式开始
我们先在A
这边更新一个文件,并提交到C
这时候我们B
查看一下版本:
我们这时候想让B
与AC
都一样,则需要执行git pull
命令
- 可以看到我历史从
A
的047125d
更新到了109b726
- 仓库中多了一个
ProgramAfile1.txt
上图中有条横线表示,在
pull
操作的过程中B
中的master
分支与远程仓库C
中的master
分支采用了Fast-forward
方式进行了合并,并达到了同步- 关于
Fast-forward
方式之前已经讲解过了,在上述合并过程中origin/master
分支直接指向了最新提交,中间没有其他分支,也就不会出现合并冲突,这种合并方式称为快进
,如图所示:
- 关于
- 这是一个理想的情况,很多情况下执行
git pull
操作时,都会出现合并冲突,需要手动解决冲突,再手动进行合并
git pull
同源合并冲突
这时候我们ABC
三者的仓库仍然是相同的,我开始分别对A
与B
进行修改
- 这时候
A
与B
修改的是同一个文件,但修改的东西是不一样的,且两个都分别提交到了本地的版本库
这时候我们先让A
进行git push
,再让B
进行git push
试试
这时候B
出现了报错,显示你push
失败是因为你的修改已经被其他仓库员所提前提交了,建议你使用git pull
进行修改
我们查看下C
与B
我们可以发现AC
已经同步了,但是B
是不一样的,我们就按照提示所做做git pull
试试
可以看到提示自动合并失败了,建议你手动修改那个文件并提交你的结果