JessicaAuditore

导航

 

本文首先感谢孟宁老师的教导
主要参考文献为软件学院孟宁老师所写的一篇文章,文章地址:https://mp.weixin.qq.com/s/Km5KuXPETvG0wCGHrvj9Vg

SVN与Git的最主要的区别

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

场景一:Git 本地版本库用法参考

1.Git工作区、暂存区、版本库的区别

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

image

2.设置用户名与邮箱
git config –-global user.name 'user_name'
git config –-global user.email 'user_email'
设置好后可以通过git config –-list查看状态

git init (初始化一个本地版本库)

1.Git本地版本库的使用首先需要我们在本地创建一个空目录用作仓库。
2.我们需要将该空目录变为Git可以管理的仓库,git init 初始化一个本地版本库。
image

git status (查看当前工作区(workspace)的状态)

1.先创建一个new.txt文件
2.使用git status查看文件状态
image

git add [FILES] (把文件添加到暂存区(Index))

1.使用git add添加new.txt到暂存区
2.使用git status查看文件状态
image

git commit -m "wrote a commit log infro” (把暂存区里的文件提交到仓库)

1.使用git commit -m “message”命令将暂存区所有文件添加到版本库内(message为你要添加的备注信息,方便日后查看)
image

git log (查看当前HEAD之前的提交记录,便于回到过去)

1.修改test.txt文件内容重新提交到版本库
image
2.使用git log命令查看提交记录
image

git reset —hard HEAD^^/HEAD~100/commit-id/commit-id的头几个字符 (回退)

image

git reflog # 可以查看当前HEAD之后的提交记录,便于回到未来

1.使用git reflog命令查看未来的存档
image
2.使用git reset回到未来
image

场景二:Git 远程版本库的基本用法

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两条命令的合集,创建一个分支并转移到该新的分支)
image
3.在分支上的操作与提交是不会影响到主分支的
主分支与别的分支合并需转换到主分支的环境下通过命令merge branch --no-ff 分支名称 进行合并(建议关闭快进式合并)
4.git brance -d 分支名 删除分支

我们在other这个分支对new.txt进行修改,然后上传
image
然后回到master分支,并进行分支合并
image
从结果可以看到,刚切回到master分支时,new.txt中还是原来到内容,当进行分支合并之后,内容更新为other分支中的版本

场景四:Git Rebase

1.rebase的黄金法则:绝对不要在公共分支上使用rebase

  • rebase操作可以把本地未push的分叉提交历史整理成直线;
  • rebase操作也可压缩一些无用提交
  • rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

2.把一个分支中的修改整合到另一个分支的办法有两种:merge 和 rebase

  • merge 命令
    它会把两个分支最新的快照(C3 和 C4)以及二者最新的共同祖先(C2)进行三方合并,合并的结果是产生一个新的提交对象(C5)
  • rebase命令
    它会把在 C3 里产生的变化补丁在 C4 的基础上重新打一遍,相当于把在一个分支里提交的改变移到另一个分支里重放一遍

3.rebase原理
先回到两个分支最近的共同祖先,根据当前分支(也就是要进行衍合的分支 experiment)后续的历次提交对象(这里只有一个 C3),生成一系列文件补丁,然后以基底分支(也就是主干分支master)最后一个提交对象(C4)为新的出发点,逐个应用之前准备好的补丁文件,最后会生成一个新的合并提交对象(C3'),从而改写 experiment 的提交历史,使它成为 master 分支的直接下游

用法一:合并日志

使用git rebase -i HEAD^^向前查看两个版本
image

将第二行的pick改成s
image

然后保存
image

image

到这里我们完成了修改。再次查看一下log记录验证:
image

用法二:合并分叉

merge的log结构
image

rebase的log结构
image

场景五:Fork + Pull request

1.我们fork别人的一个库到我们自己的账户
2.我们在本地修改完之后,回传回GitHub
image
3.点击fork仓库中的pull request,我们可以看到修改
image
4.通过create pull request按钮上传成功

posted on 2021-03-31 16:29  JessicaAuditore  阅读(173)  评论(0编辑  收藏  举报