一开始接触git的时候,对git无从下手,对fetch、merge、rebase、pull、push这些是词干什么的完全不理解,现在做过几个项目,对git也有了一定的理解,用本篇文章总结一下。现在流行的代码托管平台有gitee和github,本文用到的是gitee。
一、创建远程仓库
idea对创建远程仓库提供了十分便利的操作,首先我们可以在idea上安装gitee插件,然后登录上自己的gitee帐号。最后只要点一个按钮就可以。
接着,我们在自己的gitee主页就能查看自己刚刚创建的仓库了。是不是特别方便🎉 。
二、拉取仓库
一般一个项目不是一个人完成的,团队中一个人创建仓库之后,其他人就要拉取项目了。对于拉取项目,idea不仅可以一键拉取,还能帮你格式化项目。使你拉取完之后就能运行项目。
我们只需要点击:新建->来自版本控制
就能拉取项目了。
克隆命令:
git clone url
三、正常的开发流程
正常的开发流程应该是每个人推送自己的文件,大家井水不犯河水,互相不修改别人的代码。
创建文件
当我们新建文的时候,idea会提示是否将文件add到暂存区,
我们直接点击添加就可以了。
对于暂存区不理解的可以看一下这个图
命令:git add
提交文件
当我们写完自己的代码想要提交到本地仓库的时候,我们需要点击
这样就会把我们的代码提交到本地仓库。我们可以加一些注释,这样我们以后可以很方便查看自己这次写了什么功能。
命令:git commit
推送文件
我们可以点击这里的提交并推送
也可以点击
进行推送。
命令:git push
查看git日志
1:介绍本地的分支情况。
2:介绍远程分支的情况。
3:介绍推送记录。
4:介绍该推送更新了哪些文件。
5:
- master:本地分支
- origin/master:远程分支
- HEAD:HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。HEAD 通常情况下是指向分支名的。在你提交时,改变了分支的状态,这一变化通过 HEAD 变得可见。
拉取文件
我们只需点击右上角的箭头即可拉取项目。
这里推荐变基,对于变基和合并的区别,在带冲突的开发流程中详细介绍。
命令:git pull --rebase
或者git fetch;git rebase
这里稍微解释一下git pull
git fetch:下载远程仓库的提交
git merge:merge分支
git pull = git fetch + git merge
git pull –rebase = git fetch + git rebase
四、有冲突的开发流程
- 目录1
设想这样一个场景
你周一克隆了一个仓库,然后开始研发某个新功能。到周五时,你新功能开发测试完毕,可以发布了。但是 —— 天啊!你的同事这周写了一堆代码,还改了许多你的功能中使用的 API,这些变动会导致你新开发的功能变得不可用。但是他们已经将那些提交推送到远程仓库了,因此你的工作就变成了基于项目旧版的代码,与远程仓库最新的代码不匹配了。
这种情况下, git push 就不知道该如何操作了。如果你执行 git push,Git 应该让远程仓库回到星期一那天的状态吗?还是直接在新代码的基础上添加你的代码,亦或由于你的提交已经过时而直接忽略你的提交?
因为这情况(历史偏离)有许多的不确定性,Git 是不会允许你 push 变更的。实际上它会强制你先合并远程最新的代码,然后才能分享你的工作。
咱们来模拟一下这个场景,我把一个项目推到远程仓库,然后再新建一个项目拉下来,来模拟两个用户。
这个ccpc里的代码作为用户一写的代码
这个ccpc2里的代码作为用户二写的代码
然后 用户一推送这样一段内容:
这时候用户二不知道该文件已被修改,用户二也对该文件进行修改
这时候如果点击推送毋庸置疑会失败的,她会这样提示我们
idea提示我们进行变基,那我们就点击一下变基:
咱们通过前边的小例子说过了,当你尝试修改别人修改过的文件,git会强制让你与远程仓库里的代码整合,对于你们同时修改的代码,git会询问你是选择你自己的还是其他人的。这里我暂且选择接受他们的。这样相当于你的代码白写了。
整合之后这个时候再进行推送是能推送成功的。然后直接推送。
我们再让用户一修改代码:
因为刚刚用户二也推送了,所以这个时候推送同样是会冲突的。我们这次同样点击变基,不过这次点击接受您的
我们再观察git日志:
发现master(本地分支)与orgin/master(远程分支)分离了,这代表我们本地仓库是最新的状态,远程仓库是用户二提交的状态。我们直接点击推送,就能再次让本地分支与远程分支保持一致。
我们再次让用户二修改代码
再次推送,同样再次被拒绝,不过咱们这次不变基了,咱们点击合并:
然后选择接受他们的
我们再来观察一下git日志:
发现了一个奇怪的情况,竟然分叉了,这是什么原因呢?
对你猜的没错,正是因为你选择合并的原因。这是合并和变基的提交记录的区别。
这个时候点击推送同样是可以推送上去的。
然后我们再让用户一修改代码
同样是被拒绝同样是点击变更,这次我们选择接受您的,结果和接受他们的一样的,这里就不演示了。
合并
合并(git mergen)即把两个节点合并到一起,如下图所示,合并c2,c3:
合并会让两个不同的分支分开,使哪个结点是哪个分支提交的显示的更加清晰。
ps:咱们团队开发的时候,每次推送都相当于一次本地分支与远程分支的整合。
变基
变基 (git rebase)。变基实际上就是取出一系列的提交记录,**“复制”**它们,然后在另外一个地方逐个的放下去。
Rebase 的优势就是可以创造更线性的提交历史,这听上去有些难以理解。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。
如图所示
五、新建远程分支和本地分支
如果想建立新的分支也是很简单的,只需点击新分支就可以了:
如果想切换分支只要点击牵出就可以了
六、总结
了解了以上的操作基本就入门了,还有很多骚操作我就不一一演示了,大家自己去发掘吧。