Git使用心得
本文首先感谢孟宁老师的教导
主要参考文献为软件学院孟宁老师所写的一篇文章,文章地址:https://mp.weixin.qq.com/s/Km5KuXPETvG0wCGHrvj9Vg
Git使用心得
版本控制系统大致分为两大类,一类是中心版本控制系统,比如 Concurrent Versions System(简称 CVS)和 Subversion(简称 SVN);
另一类就是分布式版本控制系统,比如我们即将重点介绍的 Git,是目前世界上最先进的分布式版本控制系统。
在我看来,分布式版本控制系统有两大优点:1.去中心化,即分布式版本控制系统没有中央服务器,不用必须联网工作
2.安全性能高,CVS若中央服务器出现故障,则所有人都无法工作,而分布式的话,每个人都有完整的版本库。
GIt的安装教程:https://www.liaoxuefeng.com/wiki/896043488029600/896067074338496
Git的使用可以使用VSCode提供的可视化界面进行操作,也可使用命令行,本文接下来的操作都是基于命令行的操作
场景一:Git 本地版本库的基本用法
git init的用法
1.Git本地版本库的使用首先需要我们在本地创建一个空目录用作仓库。(我创建好一个名叫GitRepository的空目录)
2.我们需要将该空目录变为Git可以管理的仓库,git init 初始化一个本地版本库
3.因为git为分布式系统,我们需自报家门,要设置自身id与email
.git文件与Git的工作分区
1.我们可以看到该目录下多了名为.git的文件夹。
.git文件夹内文件作用:https://blog.csdn.net/u010331406/article/details/49128607?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2- 1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
2.Git工作区、暂存区、版本库的区别
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
文件添加到版本库
1.在工作区创建一个文件test.txt
2.通过git add FileName命令将指定文件添加到暂存区
3.通过git commit -m “message”命令将暂存区所有文件添加到版本库内(message为你要添加的备注信息,方便日后查看)
回到过去
我们修改test.txt文件内容重新提交到版本库后
1.通过git log命令查看提交记录
2.通过git reset —hard HEAD^^/HEAD~100/commit-id/commit-id的头几个字符 命令回到过去的版本
回到未来
当我们回到过去后发现,未来的某个存档有意义,我们想回到未来
1.通过git reflog命令查看未来的存档
2.通过git reset —hard commit-id/commit-id的头几个字符 命令回到未来
场景二:Git 远程版本库的基本用法
我们在GitHub上新建一个版本库名为GRtest,内包含一个文件test.txt
1.我们通过git clone URL命令将远程GitHub上的版本库复制到本地
2.git pull指令可以将GitHub上的更新同步到本地库
3.git push指令可以将本地库的变化同步到GitHub上,需输入GitHub的用户名和密码
场景三:团队项目中的分叉合并
用户的每次提交,Git都会将它们串成一条时间线,在Git中,master分支为主分支,上面存放的都是比较稳定的版本,其他分支是较为不稳定的分支,主要用于测试特性
开发者开发时,一般在单独的分支上进行开发,最终将该分支合并到master主分支上。
合并默认为快进式合并,这种方式会将不稳定分支上的零碎的版本混入主分支,造成主分支混乱,因此我们合并分支,一般通过--no-ff参数关闭“快进式合并”,这样只会讲不稳定分支最后的结果合并入主分支,这样可以降低主分支的冗余性。
1.git branch 分支名 创建一个分支(git branch可以查看所有分支状态,分支前有*表示当前处于该分支)
2.git checkout 分支名 转换到当前分支环境中(git checkout -b 分支名是1.2两条命令的合集,创建一个分支并转移到该新的分支)
3.在分支上的操作与提交是不会影响到主分支的
主分支与别的分支合并需转换到主分支的环境下通过命令merge branch --no-ff 分支名称 进行合并(建议关闭快进式合并)
4.git brance -d 分支名 删除分支
场景四:Git Rebase
rebase的黄金法则:绝对不要在公共分支上使用rebase
-
rebase操作可以把本地未push的分叉提交历史整理成直线;
- rebase操作也可压缩一些无用提交
-
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
把一个分支中的修改整合到另一个分支的办法有两种:merge
和 rebase
(译注:rebase
的翻译暂定为“衍合”,大家知道就可以了。)
最容易的整合分支的方法是 merge
命令,它会把两个分支最新的快照(C3 和 C4)以及二者最新的共同祖先(C2)进行三方合并,合并的结果是产生一个新的提交对象(C5)
还有另外一个选择:你可以把在 C3 里产生的变化补丁在 C4 的基础上重新打一遍。在 Git 里,这种操作叫做衍合(rebase)。有了 rebase
命令,就可以把在一个分支里提交的改变移到另一个分支里重放一遍。
它的原理是回到两个分支最近的共同祖先,根据当前分支(也就是要进行衍合的分支 experiment
)后续的历次提交对象(这里只有一个 C3),生成一系列文件补丁,然后以基底分支(也就是主干分支master
)最后一个提交对象(C4)为新的出发点,逐个应用之前准备好的补丁文件,最后会生成一个新的合并提交对象(C3'),从而改写 experiment
的提交历史,使它成为 master
分支的直接下游
用法一:合并日志
1.通过git rebase -i HEAD^^^向前查看三个版本
2.进入命令行文本编辑器,我们选择将d合并
3.我们可以看到d的log被合并了
用法二:合并分叉
我们构建一个如图所示的分叉结构
merge,rebase的结构分别如图所示,我们分别新建两个分叉,采用两种合并方式查看不同。
merge 的log结构
rebase的log结构
场景五:Fork + Pull request
1.我们fork别人的一个库到我们自己的账户
2.我们在本地修改完之后,回传回GitHub
3.点击fork仓库中的pull request,我们可以看到修改
4.通过create pull request按钮上传成功