1.Git介绍
Git是一个免费的开源分布式版本控制系统,它可以快速高效地处理从小型到大型的项目。
Git易于学习,占用空间小,性能极好。它超越了像Subversion、CVS、Perforce和ClearCase这样的配置管理工具,具有廉价的本地分支、方便的staging区域和多个工作流这样的特性。
- Workspace:工作区
- Index / Stage:暂存区【工作区的文件使用add命令后会加入暂存区,而没有直接到仓库】
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
2.Git与IDEA集成
2.1 配置
1.先在本地安装好git工具
2.再在IDEA配置好git工具
2.2 引入
通过IDEA操作git有两种方式
- 1.通过命令行操作
- 2.通过图形界面操作
一般来说,只要熟练使用命令后,就可以不用依赖各个工具,在任何有git的地方都能操作git,但用命令有一个比较明显的弊端就是可视化比较差,显示出来的都是文字信息,特别是解决版本冲突修改的时候,看着还是比较麻烦的,例如:
远程修改了如下代码:
本地没有更新,然后又修改了如下代码:
当我们执行pull命令后,会失败,同时会出现一大堆文字让你去比较解决代码冲突
相反,我们利用IDEA提供的功能,直接进行可视化操作,如下图:
选择View them,即可对比显示出哪些代码冲突,通过界面操作,很快完成,节省许多时间
当然,习惯或喜欢命令行操作的都可以,毕竟是个工具,本人一般用着哪个爽就用哪个工具
2.3 Git服务搭建
参考: Docker for Gogs
1.环境搭建
# 关闭防火墙,重启网卡
systemctl restart network
systemctl stop firewalld
# Pull image from Docker Hub.
$ docker pull gogs/gogs
# Create local directory for volume.
$ mkdir -p /var/gogs
# Use `docker run` for the first time.
$ docker run --name=gogs -p 10022:22 -p 10080:3000 -v /var/gogs:/data gogs/gogs
# Use `docker start` if you have stopped it.
$ docker start gogs
参数说明:
-d: 后台方式运行容器
-p: 端口映射, 将容器的22端口映射到宿主机的10022端口, 将容器的3000端口映射到宿主机的3000端口,22和3000端口映射在后面启动配置时需要用到,所以需要映射两个端口。
--name: 指定容器名称
--net: 将容器加入backend网络, 目的是为了能够连接backend网络中的mysql数据库
-v: 数据卷挂载, 用于将容器和数据分离
# 访问
http://192.168.44.130:10080/
2.配置
or mygogs zy123456
访问记得要关闭防火墙,或者开通端口,不然会报错
2.4 IDEA 切换不同Git账户
在idea的设置中,搜索password,在Passwords中,选择Do not save选项,Apply应用后,ok退出,重启Idea
2.5 IDEA官网
3.基础操作
主要介绍IDEA中有关Git基本使用。在IDEA中,会用不同颜色来区分代码的状态,如下:
| 颜色 | 含义 |
|---|---|
| 绿色 | 已经加入控制暂未提交 |
| 红色 | 未加入版本控制 |
| 蓝色 | 加入,已提交,有改动 |
| 白色 | 加入,已提交,无改动 |
| 灰色 | 版本控制已忽略文件 |
3.1 代码上传
当我们新建了一个项目,想要把该项目上传到远程仓库中,那么可以如下操作:
1.如图,我们本地创建了一个项目
2.再在远程服务器创建一个仓库,如图
3.本地项目选择一个版本控制方式,这里用git
4.把当前代码加入到git版本控制中,如图
5.提交到本地仓库
6.推送到远程仓库
3.2 代码下载
1.从远程拷贝代码路径,如图:
2.新建项目,从版本控制中拉取代码,如图:
3.填写地址,即可下载源码
3.3 代码提交
当我们写完代码后,则需要上传代码到远程服务器中
1.提交当前修改代码到本地仓库,如图:
2.本地提交后,我们才可以push到远程仓库,如图:
3.4 代码更新
当多人合作开发代码时,不管我们开发开始还是结束,最好都要从远程服务器更新一下我们本地代码,不然后面提交会遇到代码冲突等问题
4.实践操作
4.1 提交代码,可以只提交需要提交的代码吗?
可以,只要加入到版本控制后,我们本次修改的所有文件,都会放到一个IDEA提供的defalut changelist列表里,当我们commit的时候,默认就是提交这个列表里的记录,注意,多个Changelist中只有一个是active的,这个active的Changelist,默认情况下即为Default Changelist,粗体,且放在第一位。active的意思:快捷键(Ctrl + K)是对被设置为active的那个Changelist进行提交的。
4.2 当修改了许多文件里的代码,但发现不想要这些代码了,是否可以恢复成原来的代码状态?
如下图,对一些文件做了修改,然后又新增了其他文件,突然想要撤销本地这些修改了的代码,那么就可以用rollback
勾选红圈相关配置,那么回滚后,本地代码就和之前拉去的代码保持一致了
还有一种方式,可以返回到之前状态,
HEAD^ 是还原到上一个版本,HEAD^^ 是还原到上上一个版本。
Reset Type 有三种:
mixed 默认方式,只保留源码,回退commit和index信息
soft 回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit
hard 彻底回退,本地源码也会变成上一个版本内容
4.3 代码修改后提交了,但没有提交到远程仓库,现想要撤回,该怎么做?
如图,我们代码修改,增加了“333”,并提交到本地仓库了
从log里查看提交记录,然后选择undo,进行撤销,撤销后,我们可以看到changes里会多了一个changeslist的分组,这个分组里的内容就是撤销的相关内容,我们可以删除这个分组,那么分组里的修改就会自动归类到defalut那个分组里去
4.4 代码push到了远程仓库,现想要撤回该怎么办?
如图,远程已经提交了53cd743554代码,但想要修改回ed598fe08e
我们可以选择相关提交节点来进行撤销操作,如图
本地恢复后,我们还需要进行远程恢复,所以需要再push一下,如图
当想撤销中间某次提交时,
强烈建议使用revert命令,而不是reset。 git reset –hard commit_id 虽然可以回退远程库,但是其要求pull最新代码的每个人的本地分支都要进行版本回退。这样就增加工作量了!
4.5 代码冲突了,怎么办?
如图,两边代码都做了修改,但是本地并没有做先更新后开发操作,那么本地代码版本就和远程不一致
本地提交可以正常提交
一旦提交到远程服务器,则就会报代码冲突,如图:
这个时候,我们就需要点击merge进行合并,如图;
修改好后,我们点击apply执行,然后再进行push操作,则代码冲突解决
4.6 怎么创建分支?
如图,给当前主分支创建分支
创建完分支后,别忘了要push一下到远程服务器,如图:
4.7 如何切换分支?
如图,我们可以选择相关的分支,checkout进行切换
4.8 一个分支上的代码,如何同步合并更新到另外一个分支上?
如图,dev分支修改了相关代码,并提交到了远程仓库,现在需要把dev的合并到master分支上
首先,我们需要切换到master分支,如图
选择merge changes
代码合并成功
4.9 如何代码暂存还原?
当我们正在开发的时候,测试提了一些问题,需要修改,那么为了能让我们正在开发的代码找一个地方保存起来,然后我们再把测试那个版本的代码进行修改提交后,然后再把之前的代码放出来,如图:
如上图,我们正在对这个类进行修改,但是突然测试说有问题,需要修复这个类,那我们不可能把现在手头上操作的代码给回退到上个版本进行修改吧
我们这个时候,就可以用stash把当前代码保存起来,如图
现在我们进行代码修复,如图
然后进行代码还原,如图
4.10 为啥本地的分支比远程的分支要少一些?
如果你同事新建分支,这个时候自己idea看不到你要更新的分支,你需要git fetch 一下就能够看到了。
4.11 为啥pull会失败?
这是因为本地的代码和远程代码同一个地方有冲突了,点击右下角view them,查看哪些冲突了,进行回滚后再pull即可
4.12 能否尽快知道这段代码是谁修改过?
多人合作的时候,有些代码可能被人修改过了,但想要查找某些代码片段是哪些人改的,我们就可以用这个功能,打开annotate查看代码修改者
4.13 查看当前版本?
当想查看某个文件是哪个属于哪个版本时,可以通过IDEA 右键选择查看
4.14 查看历史版本?
1.可以通过右键项目来选择查看
2.或者通过changelist,选择相关文件,右键进行查看
4.15 合并部分代码(Cherry-pick 摘樱桃)
==代码例子==
master代码
public class DemoMain {
public static void main(String[] args) {
System.out.println("master code");
}
}
dev 第一次提交代码:
public class DemoMain {
public static void main(String[] args) {
System.out.println("master code");
System.out.println("dev code 01");
}
}
dev 第二次提交代码:
public class DemoMain {
public static void main(String[] args) {
System.out.println("master code");
System.out.println("dev code 01");
System.out.println("dev code 02");
}
}
现在,master分支需要合并一下dev 第二次提交的代码,而不要第一次的代码,那么如图:
1.切换到需要合并的分支,比如我们master需要合并其他分支的代码,那么就切换到master上
2.1.然后点击log,查看之前别人分支提交记录,如图:
或者
3.当两边代码不一致,有冲突时,需要继续合并操作,如图:
4.然后检查commit弹出框的内容是否正确,确认无误后commit即可,最后别忘了push
4.15.1 合并无冲突代码
1.master分支合并某个dev分支,其中dev每次各个用户提交的代码和master是没有冲突的
2.先切换到master,然后再摘取某个分支的提交
4.15.2 master合并有冲突的分支
1.dev分支里,user1去user2的类user2Service里,增加了一部分代码
2.dev分支里,user2自己修改了一些代码
3.切换到master分支
4.摘取某个分支
5.其他
5.1 问题
5.1.1 push报错
当我们推送到远程仓库时候,会报:The remote end hung up unexpectedly The remote end hung up unexpectedly RPC failed; HTTP 401 curl 22
这是因为我们提交的时候,输入的账号和密码不对,或者该账号没有对仓库操作的权限
重新输入账号和密码,我们可以在IDEA file->settings->passwords中取消密码保存来重新输入
5.1.2 远程撤销报错
若我们revert后,并没有点commit按钮,那么下次选中版本再提交的时候,会报All changes from 14132e57 have already been reverted类似错误,不让我们在执行,这是因为已经idea已经为我们创建了修改记录,如下图
当我们再次执行revert commit命令时就会报如下:
这是因为IDEA之前的操作已经给我们做了一些工作,若之前的没有commit,那么这些工作状态还在,需要先撤回,再重新撤销
Entry '.idea/workspace.xml' not uptodate. Cannot merge. 若报这个错,则可以直接重新checkout远程代码出来即可
5.1.3 Cherry-pick报错
这是因为之前已经cherry-pick过了,如图:
解决办法:点击下面 小黄按钮,abort cherry 终止掉上次未完成的操作即可,或者重启上次的操作也行