Git版本控制系统之远程仓库(二)
先注册github账号(已有)
一、配置本地与远程仓库连接
本例子中使用windows演示,linux也是一样的操作,由于本地Git仓库和github仓库之间的传输是通过SSH加密的,所以需要一点设置:
1、创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果有的话,直接跳过此如下命令,如果没有的话,打开命令行,输入如下命令:
ssh-keygen -t rsa -C “1542345123@qq.com”
注:执行时如果提示ssh-keygen不是内部或者外部命令那么此时可以进入git的安装目录下的bin目录下按住shift右键打开(windows环境变量问题,linux不会存在)

然后在执行上述的ssh-keygen命令 ,执行完成后在C盘下生成一个公钥一个私钥

id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人
2、登录github,打开” settings”中的SSH Keys页面,然后点击“SSH and GPGKey”,填上任意title,在Key文本框里黏贴id_rsa.pub文件的内容。

3、测试是否配置成功(在Linux下演示),执行命令如下:

二、本地库与远程库关联
1、创建本地仓库:
cd gong && git init //初始化本地仓
2、在github上创建同名仓库:
登录github上,然后在右上角找到“New repository”创建一个新的仓库。如下:


3、将本地仓库与远程仓库关联,执行命令:
git remote add origin git@github.com:gongguan2018/gong.git
- origin:自定义命名的,可以理解为远程仓库地址的别名
- git@github.com:gongguan2018/gong.git:通过ssh方式连接仓库,此地址在git仓库位置可以看到

相关命令:
git remote remove origin //移除远程仓库地址
git remote -v //查看当前远程仓库地址
git remote show origin //显示远程仓库信息
注:通过https方式推送可能会出现连接失败,建议通过ssh推送,因此git remote 要添加的就是SSH地址
4、接下来在版本库中创建或修改文件,提交到本地仓库,在推送到远程仓库即可,如下:
echo "helloworld" > cc.txt
git add .
git commit -m "helloworld" //-m后表示备注
git push -u origin master //表示推送到远程仓库的master分支,origin表示仓库别名
推送后内容如图:

三、从远程库克隆?
假如远程库有新的内容了,我想克隆到本地来 如何克隆呢?
首先,登录github,创建一个新的仓库,名字叫test1.如下:

现在,远程库已经准备好了,下一步是使用命令git clone克隆一个本地库了。
git clone git@github.com:gongguan2018/test1.git

克隆后本地生成了test1文件夹里面内容和远端仓库内容一致

如何创建与合并分支 ?
在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
首先,我们来创建dev分支,然后切换到dev分支上。如下操作:
进入仓库本地仓库gongguan ,查看master分支下的gong.txt文件( gong.txt是已经存在master分支下的文件并且已经提交到仓库的 )

执行命令git checkout -b dev 创建并切换分支,如图:

说明:git checkout 命令加上 –b参数表示创建并切换,相当于如下2条命令:
- git branch dev
- git checkout dev
命令git branch查看分支,会列出所有分支,当前分支前会添加一个星号,如图:

在 dev分支上做操作,首先查看当前仓库下的文件gong.txt内容如下:

接着通过vi命令添加内容12121212121,添加后查看如下:

添加到暂存区并提交到仓库,如图:

现在dev分支工作已完成,现在我们切换到主分支master上,继续查看gong.txt内容如下:

现在我们可以把dev分支上的内容合并到主分支master上了(要先切换到主分支上),可以在master分支上,使用如下命令 git merge dev ,合并后查看,如图:

git merge命令用于合并指定分支到当前分支上,合并后,再查看gong.txt内容,可以看到,和dev分支最新提交的是完全一样的,注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
合并完成后,我们可以接着删除dev分支了,操作如下,如图:

总结创建与合并分支命令如下:
- 查看分支:git branch
- 创建分支:git branch name (name表示分支名字)
- 切换分支:git checkout name
- 创建+切换分支:git checkout –b name
- 合并某分支到当前分支:git merge name
- 删除分支:git branch –d name
如何解决冲突?
新建一个新分支并切换到新分支上,比如名字叫fenzhi1,在gong.txt添加一行内容5555555555, 如图:

添加暂存区,提交到仓库,如图:

切换到主分支master上在最后添加内容8989898989898,提交到仓库,如图:

现在我们需要在master分支上来合并fenzhi1,可以看到在合并分支的时候出现了冲突,

再次查看gong.txt文件的内容,如图:

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中<<<HEAD是指主分支修改的内容,>>>>>fenzhi1 是指fenzhi1上修改的内容,我们可以修改下如下后保存:
如果我想查看分支合并的情况的话,需要使用命令 git log 命令行演示如下:

分支管理策略 :
通常合并分支时,git一般使用”Fast forward”模式,在这种模式下,删除分支后,会丢掉分支信息,现在我们来使用带参数 –no-ff来禁用”Fast forward”模式(分支删除了但是信息还在),首先我们来做demo演示下:
- 创建一个dev分支。
- 修改readme.txt内容。
- 添加到暂存区。
- 切换回主分支(master)。
- 合并dev分支,使用命令 git merge –no-ff -m “注释” dev
- 查看历史记录 git log


分支策略:首先master主分支应该是非常稳定的,也就是用来发布新版本,一般情况下不允许在上面干活,干活一般情况下在新建的dev分支上干活,干完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master上来。
如何处理bug分支?
在开发中,会经常碰到bug问题,那么有了bug就需要修复,在Git中,分支是很强大的,每个bug都可以通过一个临时分支来修复,修复完成后,合并分支,然后将临时的分支删除掉。
比如我在开发中接到一个404 bug时候,我们可以创建一个404分支来修复它,但是,当前的dev分支上的工作还没有提交。比如如下:

并不是我不想提交,而是工作进行到一半时候,我们还无法提交,比如我这个分支bug要2天完成,但是我issue-404 bug需要5个小时内完成。怎么办呢?还好,Git还提供了一个stash功能,可以把当前工作现场 ”隐藏起来”,等以后恢复现场后继续工作。如下:

所以现在我可以通过创建issue-404分支来修复bug了。
首先我们要确定在那个分支上修复bug,比如我现在是在主分支master上来修复的,现在我要在master分支上创建一个临时分支,演示如下:


然后切换回主分支master 合并分支后将404分支删除。完成bug修改,如下图:


现在要回到dev分支上继续刚才隐藏的项目的工作, 工作区是干净的,那么我们工作现场去哪里呢?我们可以使用命令 git stash list来查看下 ,如图:

工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,可以使用如下2个方法:
- git stash apply恢复,恢复后,stash内容并不删除,你需要使用命令git stash drop来删除。
- 另一种方式是使用git stash pop,恢复的同时把stash内容也删除了。

如何进行多人协作 ?
当你从远程库克隆时候,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且远程库的默认名称是origin。
- 要查看远程库的信息 使用 git remote
- 要查看远程库的详细信息 使用 git remote –v

如何推送分支呢?
推送分支就是把该分支上所有本地提交到远程库中,推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上: 使用命令 git push origin master
例如我现在的远程github上的gong.txt代码如下:

本地gong.txt代码如下 :

执行命令git push origin master(主分支)将本地gong.txt推送到远程库中:

如图所示:表示推送成功:

如果我们现在要推送到其他分支,比如dev分支上,我们还是那个命令 git push origin dev ,推送的时候会提示输入远程的用户名和密码

查看github上面发现已经推送成功,如图:

那么一般情况下,哪些分支要推送呢?
- master分支是主分支,因此要时刻与远程同步。
- 一些修复bug分支不需要推送到远程去,可以先合并到主分支上,然后把主分支master推送到远程去。
如何抓取分支 ?
多人协作时,大家都会往master分支上推送各自的修改。现在我们可以模拟另外一个同事,可以在另一台电脑上(注意要把SSH key添加到github上)或者同一台电脑上另外一个目录克隆,新建一个目录名字叫test2(另一个人操作)
把远端gong这个仓库克隆到test2中,如图所示:

克隆下来的只是master分支的内容, 要在dev分支上做开发,就必须把远程的origin的dev分支到本地来,于是可以使用命令创建本地dev分支并关联到远程分支:git checkout –b dev origin/dev
现在小伙伴们就可以在dev分支上做开发了,开发完成后把dev分支推送到远程库,如图:



远程库内容如下:推送成功

上述test2中是另一个人推送的dev分支内容, 现在再回到我自己的本地来推送gong库中的文件



由上面可知:推送失败,因为我的小伙伴最新提交的和我试图推送的有冲突,解决的办法也很简单,上面已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后在本地合并,解决冲突,再推送

合并有冲突,需要手动解决 , 解决方法就是删除冲突的部分然后add 、 commit ,最后在推送。

删除之后重新推送


推送之后内容如下:新更新的内容出现,推送成功

在执行git pull的时候如果提示如下错误,表示没有本地dev没有关联到远程dev,如图:

重新关联然后再次执行git pull 即可,如图:

因此:多人协作工作模式一般是这样的:
- 首先,可以试图用git push origin branch-name推送自己的修改.
- 如果推送失败,则因为远程分支比你的本地更新早,需要先用git pull试图合并。
- 如果合并有冲突,则需要解决冲突,并在本地提交。再用git push origin branch-name推送。
Git基本常用命令如下:
- mkdir: XX (创建一个空目录 XX指目录名)
- pwd: 显示当前目录的路径。
- git init 把当前的目录变成可以管理的git仓库,生成隐藏.git文件。
- git add XX 把xx文件添加到暂存区去。
- git commit –m “XX” 提交文件 –m 后面的是注释。
- git status 查看仓库状态
- git diff XX 查看XX文件修改了那些内容
- git log 查看历史记录
- git reset –hard HEAD^ 或者 git reset –hard HEAD~ 回退到上一个版本
- 如果想回退到100个版本,使用git reset –hard HEAD~100
- cat XX 查看XX文件内容
- git reflog 查看历史记录的版本号id
- git checkout — XX 把XX文件在工作区的修改全部撤销
- git rm XX 删除XX文件
- git remote add origin https://github.com/gongguan2018/gong关联一个远程库
- git remote add origin https://github.com/gongguan2018/gong关联一个远程库
- git clone https://github.com/gongguan2018/gong 从远程库中克隆
- git checkout –b dev 创建dev分支 并切换到dev分支上
- git branch 查看当前所有的分支
- git checkout master 切换回master分支
- git merge dev 在当前的分支上合并dev分支
- git branch –d dev 删除dev分支
- git branch name 创建分支
- git stash 把当前的工作隐藏起来 等以后恢复现场后继续工作
- git stash list 查看所有被隐藏的文件列表
- git stash apply 恢复被隐藏的文件,但是内容不删除
- git stash drop 删除文件
- git stash pop 恢复文件的同时 也删除文件
- git remote 查看远程库的信息
- git remote –v 查看远程库的详细信息
- git push origin master Git会把master分支推送到远程库对应的远程分支上
gongguan 2020.03.12


