IDEA结合Git实现项目管理实战——实战篇
前言
本系列将结合我个人参与团队协作开发项目的经验来介绍如何使用IDEA结合Git实现项目管理,因此可能与真正的企业开发协作存在差异,且文章所涉及的解析可能存在个人理解与实际的偏差。
本系列主讲如何具体操作,因此对于Git内部的原理将不会过多深究。
本文严禁任何形式的转载、搬运!
本文作为该系列的实战篇,将正式介绍如何使用IDEA结合Git进行项目管理。
注意:本文假设你已经成功在IDEA中配置了git
在配置篇中,当我们已经在本地推送/克隆了一个项目后,我们能看到如下两个功能块。
在本文中,我们称红色箭头所指为git日志,蓝色箭头所指为git工具栏。
设置默认添加文件
还记得基础篇我们提到的四个工作区域吗?如果我们想要将变更的文件推送到远程仓库,我们首先需要先保证变更的文件在暂存区中。
在基础篇中,我们提到每当创建一个文件时,idea都会询问我们是否将文件添加到git,即是否添加到暂存区中。为了避免这种麻烦,我们打开设置,按以下流程选择无提示添加,这样idea就会默认将我们创建的文件自动添加到git了。
配置完该设置后,相当于每次创建文件都会默认执行git命令git add
,作用是将文件添加到暂存区中。
推送更改的文件到本地库
当我们在本地完成了我们的工作后,我们可以先将变更的文件提交到本地库中保存。
这里我们点击蓝色箭头所指git工具栏的第二个按钮,即提交按钮。
该按钮对应git命令git commit
,作用是将文件提交到本地库中。
这里我简单的修改了下我自己的更改,填写完提交信息后点击提交。
如果点击提交并推送的话,就可以直接将变更推送到远程仓库,省去了一个步骤。
提交并推送按钮对应git命令
git commit & git push
,作用是将暂存区的变更直接推送到远程仓库
提交完毕后,我们打开git日志,能在当前的本地分支中看到我们刚才提交记录:
将本地库的提交记录推送到远程库中
当我们已经确定本地库的工作已经结束后,我们就可以将本地库的记录推送到远程库中。
我们点击git工具栏的第三个按钮,即推送按钮。
该按钮对应git命令git push
,作用是将本地的提交记录推送到远程库中。
这里我准备了两个提交记录,按ctrl + 鼠标左键
可以多选提交记录。
点击推送按钮后,我们可以在git日志中看到远程仓库中出现了我们刚才推送的提交记录。
此时我们打开gitee,可以发现提交记录同样生效于gitee中。
拉取远程分支的变更
当你的远程仓库发生改变时(你的队友推送了提交记录到远程仓库中),而你自己的远程分支不会自动拉取别人的提交记录,也就是说你的远程分支不具备别人的提交历史。
此时我们需要点击提取所有远程按钮,这时候就可以把远程仓库的所有本更拉取到自己的远程分支中。
提取所有远程按钮对应git命令git fetch
,作用是将远程仓库的变更拉取到远程分支中。
这里我在gitee中手动添加了一个README.md文件。
点击按钮后,可以看到远程分支中增加了这条记录,同时,我们可以注意到本地分支名后出现了向下的蓝色箭头,这代表着当前远程分支已经更新了,本地分支也应该进行更新。
我们选中对应的本地分支,点击更新所选内容按钮,就可以把远程分支的提交记录添加到我们的本地分支中。
这里我们也可以选择git工具栏的第一个按钮,这样就可以指定方式传入变更。
该按钮对应git命令git merge
或git rebase
,作用是传入变更到当前分支
结果如下
新建分支
正常来说我们开发项目肯定不可能只用一个本地分支,一般会在其他分支中开发完毕后再推送到主分支中,这时候就需要新建分支的操作了。
分支可以简单的理解为我想基于这个提交以及它所有的父提交进行新的工作。当我们新建分支时,Git就会将HEAD指向的提交记录以及该提交记录之前的所有提交记录保存到新分支中。
如果我们要新建分支,可以点击左侧工具栏的加号按钮,这样就得到了一个新的分支。
该按钮对应git命令git branch
,作用是基于当前提交历史创建新的分支。
新建后我们得到了一个全新的分支dev,他包含了master的全部提交历史。
当然,由于HEAD当前指向的是最后一个提交记录,所以新分支dev就包含了master的全部提交记录。如果我们要基于测试1
这个提交历史创建分支的话,需要右键该提交历史,点击新建分支后再输入分支名并创建即可。
这样我们就得到了一个包含测试1之前所有提交记录的分支。
回到指定的提交历史
假设你当前开发的代码出现了问题,如何找回之前的代码?这时候就可以通过签出这一git提供功能回到之前的提交历史。当你签出到一个提交历史时,你就获取到了这个提交历史的所有代码。
注意:在签出前确保你当前的代码已经提交到了本地或者远程分支中,签出到其他提交记录时IDEA不会帮你自动保存当前的代码。
在签出的操作中,我们必须要明白HEAD
这一概念,HEAD
是一个指向当前所在分支的指针,或者是指向当前所在提交记录的指针。在IDEA中,HEAD的位置可以通过黄色便签来看到,比如在下图master的提交历史中,HEAD指向的分支就是master,同时指向提交消息为add README.md.
的提交记录。这里我们将下图称为图1。
如果我们要切换到测试1
的提交历史上,右键测试1
,点击签出修订。
签出修订按钮对应git命令git checkout
,作用是将HEAD指针转移到当前分支/提交记录。
可以看到黄色便签转移到了测试1上,证明我们当前在测试1的提交历史上,这时我们就可以基于测试1的代码进行修改了。这里我们将下图称为图2。
但是这里有个问题,为什么图2在master分支上的黄色便签消失了?而在图1中黄色便签既指向了master又指向了最后一个提交记录add README.md.
这里要明白一个原理,那就是分支本身也能看作是一个指针,这个指针恒指向该分支的最后一个提交记录。
那么在图1中,HEAD其实是通过指向分支进而指向了该分支的最后一个提交记录,即HEAD->master->add README.md.
。而在图2中,HEAD被称作游离的HEAD
,是因为它指向的并不是分支而是该分支的一个提交历史,自然就不会指向master分支了,即HEAD->测试1
。
基于指定提交历史修改代码
在上一个
回到指定的提交历史
的操作中,我们通过签出的操作获取到了指定的提交历史的代码,这时我们就能够基于这个提交历史的代码进行开发。
举个例子,假设我们要回到之前刚添加md文件的提交历史上进行代码开发,给md文件进行修改。我们当前分支的最新提交为博文3
,如何回到提交历史add README.md.
上?
第一步我们肯定要签出到add README.md.
上,签出后可以发现项目文件回到了刚开始提交md文件的时候。
这时我们对md文件进行修改,这里我删除了一些段落。
然后点击提交按钮,将这个修改历史666
提交到本地分支中。
此时Git给出了警告。如果我们无视警告,仍然点击提交按钮,就会发现原本存在于add README.md.
提交记录的指针消失了,而且我们修改后的提交记录666
也并没有被提交到本地分支中。
还记得之前我们提到的游离的HEAD吗?如果直接在特定提交上修改代码并运行 git commit
,这实际上会在游离的 HEAD 状态下创建一个新的提交,而不会创建分支。这样的操作可能会导致出现一个游离的提交,Git 的垃圾回收机制可能会删除这些提交。
解决方法1
一种方法是:我们在指定提交历史上创建一个分支,然后在新分支上开发完毕后进行提交。这两步操作前文已经详细介绍了,不再赘述,如图所示。
解决方法2
第二种方法则是:对指定提交记录执行git revert
命令,该命令会基于指定提交记录创建一个新的提交历史
我们可以右键一个提交记录,选择还原提交选项。
如果当前分支的提交记录和还原的提交记录的文件存在差异的话会出现代码冲突。这里因为我当前分支的第一个提交记录博文3
和add README.md.
在md文件上存在差异,所以出现了冲突。
由于我们当前的目标是回到add README.md.
这个提交记录的代码中,所以我们选择忽略来自其他提交的变更,保留add README.md.
提交记录的原本代码即可。
写好提交消息后点击提交
可以发现我们这样就创建了一个和add README.md.
一模一样的提交记录了。
接着我们可以基于这个提交记录的代码进行开发,这里前文已经详细介绍了,不再赘述。
将远程分支拉取到本地
设想这样一个场景:你的同事创建了一个新的远程分支并做了一个新的功能,而这个分支是你本地没有的,你现在的工作要基于这个新的功能才能进行下去,那么我们就需要把这个远程分支拉取到本地来。
在这个例子中,你的同事创建了远程分支origin/dev
,而我们本地并没有与其对应的分支。
我们只需要右键该分支,点击签出,即可将该远程分支拉取到本地。
代码整合
在项目合作中,将其他人的代码整合到自己的代码中是经常用到的操作,这时就需要利用到Git的合并或变基功能。
一般来说代码整合会遇到以下几种情况:
- 当前分支正好比其他分支少了几条记录
如图,当前我们自己的代码在dev1分支中,我们要整合来自dev的代码,当前dev1中没有dev中的add README.md.
的修改记录。首先确保我们当前分支在dev1分支上。
我们右键dev分支,选择变基或合并均可。
可以看到dev的提交记录整合到了dev1中。
- 当前分支和其他分支都修改了几条记录
如图,当前我们自己的代码在dev1分支中,我们要整合来自dev的代码,dev1中我写的md文件的内容较少。
在dev中我的队友写的md文件的内容较多。
现在一样要确保当前分支在dev1中,并且右键dev分支选择合并/变基来整合代码。这个时候就出现了冲突
,大家应该很容易就想明白了,因为我当前分支和我队友的分支都同时存在文件名相同、内容不同的文件,这个问题不解决的话自然无法整合。
解决冲突的话就需要你和队友进行协商。比如这里我的分支dev1就比较少,队友的分支dev写的比我详细,所以我可以进行"妥协",直接用队友的md文件即可,点击接受他们的
这个按钮就可以使用队友的md文件了。
当然,我们也可以不进行妥协,IDEA提供了强大的修订功能,通过点击合并
按钮,我们可以选择整合该文件的特定部分。具体如何操作,大家自行练习吧~
删除提交
我们在实际开发中难免会提交一些无用的提交记录,这时需要利用删除提交的操作。
右键一个提交记录,选择删除提交选项,即可删除。
很简单吧?但要注意已经推送到远程分支的提交是不可删除的。
这里的绿色提交记录代表还未推送到远程分支的提交记录,棕色代表已经推送到远程分支的提交记录。