【Annotation】本文将从标题八开始,因为前七个标题是关于Git的基本操作,如果对Git的基本操作不了解的话,可以点击下方链接先看一下Git怎么使用。
八:创建SSH Key
1.注册GitHub账号。
2.创建SSH Key。windows + R
键同时按,打开运行命令窗口,输入.
进入家目录。
输入.
看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果有(那就奇了怪了!),一般第一次使用是没有的,真有的话可以直接跳过下面的命令。
打开命令行,执行命令:ssh-keygen -t rsa -C "dmneil7o@icloud.com"
邮箱是自己GitHub账号;它会让你选择路径,还会让你设置密码,这里最好全部都按照默认,一路回车下去,如下:
这时候我们再次打开家目录,会发现有一个.ssh
文件夹,如下:
如果上面的命令没有问题的话,也看不到这个文件夹肯定就是隐藏文件显示按钮
没有打开,点击查看(View)
把隐藏的项目(Hidden items)
选项勾上。
打开.ssh
这个文件夹,可以看到两个文件:id_rsa
是私钥,不能泄露, id_rsa.pub
是公钥,可以放心传播。
3.登录GitHub,打开settings
找到SSH Key
页面,点击New SSH Key
, 填上标题,同时在Key文本框中粘贴id_rsa.pub
文件的公钥内容。
点击Add SSH key
之后会跳转到输入密码的界面,我们需要输入GitHub密码来继续:
接下来我们就可以看到我们新加的SSH key了,如下:
九、添加远程库
需求是:我们有本地的Git仓库,又想在GitHub中创建一个Git仓库,并且希望这两个仓库进行远程同步,这样GitHub的仓库别人就可以来写作了。
1.在GitHub上创建一个仓库,在页面右上角➕
号选择新的仓库(New repository);
2.填入仓库名称就可以了,直接点创建,如下:
这时候一个新的仓库就建立完成了,目前这个仓库还是空的
页面提示说,我们可以有多种方法初始化这个仓库,我们按照给出的提示在本地仓库中运行下面的命令:git remote add origin https://github.com/duanmingpy/helloworld.git
git push -u origin master
把提示的东西都输入完成之后就可以推送成功了,如下:
这里使用的几个命令,其中git push
命令,实际上是把当前分支master推送到远程。
因为远程库是空的,第一次推送master增加一个-u
参数,这样Git不仅仅会把本地的master分支的内容推送到远程GitHub仓库中新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送和拉取就可以简化命令了。
我们刷新GitHub仓库的页面,这样就可以看到GitHub上的仓库和本地一模一样了。如下:
现在开始,只要本地有commit,就可以使用git push origin master
把本地master分支的最新修改交托给GitHub上了,现在就真正意义上的拥有了分布式版本库了。
十、从GitHub上克隆
【标题九】讲述了先有本地库更新,后有远程库。
现在考虑如果远程库有更新,怎么克隆到本地呢?
1.先准备一个远程库,在GitHub上再新建一个仓库,但是要有文件在,如下:
创建完成之后如下:
现在我们在命令行中进入一个新的空的文件夹中,然后执行克隆语句:
克隆语句:git clone https://github.com/duanmingpy/remote_repo.git
,后面的地址是自己的
打开我们拉下来的文件夹就可以看到:
十一、创建与合并分支
在上篇文章的版本回退上我们就知道了,每次提交,Git都把它们串成一条时间线,这条时间线是一个分支。
到现在为止,我们还只有一个master主分支,HEAD严格来说是指向master,所以HEAD指向的就是当前分支,就像python中模块的__main__
特殊变量一样。
现在我们来创建新的分支:
1.查看所有分支命令git branch
2.git checkout -b 分支名
创建并切换到这个分支git checkout
命令加上参数-b
就代表创建之后切换到,相当于两条命令:git branch dy
和 git checkout dy
相当于这两条。git branch
查看分支,会列出所有分支,当前分支前面有一个星号,上面用到了。
分支之间的工作
现在我们在dy分支上,我们查看一下README.md的内容,接着添加一行7777777,再把它添加到版本库。
我们在dy分支上完成了提交之后,切换到master分支上查看README.md,如下:
现在我们想要把dy分支上增加的内容合并到分支master分支上,可以在master分支上使用如下命令:git merge dy
我们可以在执行合并那里看到一句Fast-forword
这是因为执行的模式是快进模式
,就是直接把master执行了dy的当前提交,所有合并速度快。
我们现在把dy分支删除:git branch -d dy
暂时先总结一下创建与合并命令:
查看分支git branch
创建分支git branch name
切换分支git checkout name
创建+切换分支git checkout -b name
合并某分支到当前分支git merge name
删除分支git branch -d name
下面我们考虑:
如果在dy分支上我们修改提交了新内容,在master上也修改提交了新内容,那么我们在合并的时候取谁的呢?
还是一步一步来,
1先创建一个新分支叫做dy,因为刚才把它给删掉了
2查看一下README.md的内容
3添加一些新内容
4提交到版本库
如下:
同样的操作,我们切换到master分支上也添加两行内容:
提交到版本库之后,我们在master分支上进行合并dy,如下操作:
我们可以从上面这一张图可以仔细的分析出,两个分支上都做了新的提交,在合并的时候会有冲突,并且分支名也从master变成了master | MERGING
, 同时我们cat README.md
发现文件内容也变了,在git status
上给我们提供了解决方法:git commit
;
Git使用了<<<<<<<
; ========
;>>>>>>>
分别标记出不同分支修改的内容,我们可以打开文件修改成和主分支一致,然后在master | MERGING
这个临时分支上进行git commit
。
使用vscode打开查看:
vscode默认给我们几个选项,我点击了采用当前更改
按钮,变成了master提交的内容了,如下:
然后回到Git客户端,在master | MERGING
分支上查看内容并进行提交操作,如下:
经过这一系列的操作之后,我们可以通过git log
查看分支合并情况:
分支管理策略:
通常我们合并分支的时候,Git一般是用Fast forward模式,这种模式下,删除分支之后,会丢掉分支信息,现在我们来使用-no-ff
来禁用Fast forward模式。
1创建一个dev分支。
2修改README.md内容。
3添加到暂存区。
4切换回dy分支。
5合并dev分支,使用命令git merge -no-ff -m "注释内容" dev
6查看历史记录
删除dev之后我们发现在最后的log中还有dev的操作。
分支策略:master主分支应该是非常稳定的,也是用来发布的新版本,一般情况下干活都不在master分支上干,都是在新建的分支上,干完之后需要发布,或者说新建分支代码稳定之后可以合并到主分支master上。
十二、bug分支
在开发过程中,bug问题是不能避免的,那么有了bug就需要修复,在Git中,由于拥有强大的分支,每个bug我们都可以通过一个临时分支来修复,修复完成之后合并分支,然后将临时的分支删除掉。
例如我在开发中接到一个404bug的时候,可以临时创建一个404分支来修复。但是我目前在的分支dev的开发工作还没有完成,但是bug需要五个小时内完成,怎么办?这时候Git有一个stash功能,可以将当前工作现场隐藏到后台
,等以后再恢复现场继续工作。如下:
接下来我们要知道bug是哪个分支上的,比如bug是master分支上的,我就需要再master分支上重新建一个分支:
修复好bug之后切换到master分支,并合并,最后删除这个临时分支:
现在又可以回到当前的分支上继续干活了。
要把我们的现场恢复回来:
通过git stash list
查看隐藏的工作现场,
恢复的方式有两种:
1git stash apply
,这种恢复方式恢复后stash内容并不删除,需要使用git stash drop
来删除。
2另一种方式是使用git stash pop
,恢复的同时把stash内容也删除了。
十三、多人协作
当我们从远程库克隆的时候,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且远程库的默认名称是origin。
1.查看远程信息git remote
2.查看远程库详细信息git remote -v
推送分支
推送一个分支就是把该分支上所有本地提交到远程库上,推送的时候要制定本地的分支,Git会把该分支推送到远程库对应的远程分支上:
使用命令git push origin master
本地的README.md:
执行推送命令:
推送成功之后我们刷新一下GitHub页面:
需要推送哪个分支我们就把参数换成分支名就可以了。知识补充:
一般情况下master分支是主分支,因此要时时刻刻与远程同步;一些修复的bug分支是不需要推送到远程的,只要先在本地合并到主分支上,然后把主分支master推送到远程去即可。
抓取分支:
在进行多人协作时,大家都会往master分支上推送各自的修改,现在我们假设有另外一个同事,通过添加SSH Key添加到GitHub上,或者是同一台电脑上另外一个目录克隆。
先把dy分支也push到GitHub上:
我们新建一个目录名就叫做:clonedir2
在这个目录下模仿另外一个同事也进行克隆这个项目:
这个同事需要在dy分支上做开发,在终端用命令创建一个dy分支,现在就可以在dy分支上进行开发,开发完成后,把dy分支推送到远程库中。
同事已经推送到远程了,这里我也改了一下这个文件,也想要推到远程:
推送失败的原因是同事最近也提交了,提交到有冲突,上面提示我们,先用git pull把最新的提交抓取下来,然后在本地合并,解决冲突之后再推送。
先要指定本地dy分支与远程origin/dy分支的连接,根据提示设置dy分支和origin/dy的链接,如下:
我们又看到了熟悉的MERGING临时分支了;
解决方式和之前是一样的,我先看一下内容,然后修改,然后再继续推送到远程中:
所以:多人协作的工作模式是:
1可以试图用git push origin branch name
推送自己的修改
2如果推送失败,是因为远程分支比本地更新早,需要先用git pull
试图合并。
3如果合并有冲突,需要解决冲突,并在本地提交,使用git push origin branch name
总结:
Git基本常用命令如下:
创建目录mkdir
显示当前目录的路径:pwd
把当前的目录变成可以管理的Git仓库:git init
把xx文件添加到暂存区:git add xx
提交文件:git commit -m "注释"
查看仓库状态git status
查看xx文件修改了哪些内容git diff xx
查看历史记录git log
回退版本git reset --hard HEAD^
或者git reset --hard HEAD~50
查看文件cat xx
查看历史记录的版本号idgit reflog
把xx文件在工作区的修改全部撤销git checkout -- xx
删除xx文件rm xx
关联一个远程库git remote add origin 地址
把当前master分支推送到远程库git push -u(第一次要用-u 以后不需要) origin master
从远程库中克隆https://github.com/duanmingpy/remote_repo.git
创建dy分支并切换到git checkout –b dy
查看当前所有分支git branch
切换回master分支git checkout master
在当前的分支上合并dy分支git merge dy
删除dy分支git branch –d dy
创建分支git branch name
把当前的工作隐藏起来,等以后恢复现场后继续工作git stash
查看所有被隐藏的文件列表git stash list
恢复被隐藏的文件,但是内容不删除git stash apply
删除文件git stash drop
恢复文件的同时删除文件git stash drop
查看远程库的信息git remote
查看远程库的详细信息git remote -v
把master分支推送到远程库对应的远程分支上git push origin master
觉得不错可以点个赞,加个关注!