git学习笔记
版权声明:
除非注明,本博文章均为原创,转载请以链接形式标明本文地址。
二刷廖雪峰老师的git教程
Thanks:https://www.liaoxuefeng.com/wiki/896043488029600
Git是什么?
Git是目前世界上最先进的分布式版本控制系统
版本控制的理解:廖老师举了一个写word的例子(相当于写毕业论文),写了很多个版本,又不能删除,管理麻烦,而且当别人帮你修改后,如何更好的合并也是个问题。
发明者:Linus大佬(同为Linux发明者)
分布式的理解:理解了什么是集中式,分布式很好理解
安装
一般Linux发行版都预装,都很好装,查找相应教程即可。
初始配置
1 | $ git config --global user.name "Your Name" |
创建版本库
1 | $ git init #初始化仓库 |
commit
的理解:你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit
。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit
恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
更深入理解:从工作区和暂存区角度出发
版本控制
版本信息查询:
1 | $ git status #查询文件是否被修改 |
版本回退:
1 | $ git reset --hard HEAD^ #回退到上一个版本,回退后,不能看到版本之后的修改内容 |
在Git中,用HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
撤销修改
1 | $ git checkout -- readme.txt |
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
1 | $ git rm test.txt #删除文件,或者rm再git add,git commit |
远程仓库
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
1 | $ ssh-keygen -t rsa -C "[email protected]" |
可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容:
第三步:创建GitHub仓库,根据GitHub的提示完成推送
1 | $ git remote add origin [email protected]:×××/×××.git #origin就为远程仓库 |
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
简化命令即为:
1 | $ git push origin master |
克隆
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone
命令克隆。
Git支持多种协议,包括https
,但ssh
协议速度最快。
分支管理
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
1 | $ git checkout -b dev #创建dev分支,然后切换到dev分支 |
解决冲突
详细参考博客中例子:https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344
分支管理
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。下面我们实战一下--no-ff
方式的git merge
:
1 | $ git merge --no-ff -m "merge with no-ff" dev |
bug分支
https://www.liaoxuefeng.com/wiki/896043488029600/900394246995648
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
多人协作
1 | $ git remote #查看远程库的信息 |
拉取其他分支,解决冲突方法:https://www.liaoxuefeng.com/wiki/896043488029600/900375748016320
标签管理
1 | $ git tag v1.0 #给当前分支版本打标签 |