IDEA使用Git技巧介绍

715 阅读11分钟

1.Git介绍

Git是一个免费的开源分布式版本控制系统,它可以快速高效地处理从小型到大型的项目。

Git易于学习,占用空间小,性能极好。它超越了像Subversion、CVS、Perforce和ClearCase这样的配置管理工具,具有廉价的本地分支、方便的staging区域和多个工作流这样的特性。

img

  1. Workspace:工作区
  2. Index / Stage:暂存区【工作区的文件使用add命令后会加入暂存区,而没有直接到仓库】
  3. Repository:仓库区(或本地仓库)
  4. Remote:远程仓库

2.Git与IDEA集成

2.1 配置

1.先在本地安装好git工具

image-20201102222711210

2.再在IDEA配置好git工具

image-20201102222613357

2.2 引入

通过IDEA操作git有两种方式

  • 1.通过命令行操作
  • 2.通过图形界面操作

一般来说,只要熟练使用命令后,就可以不用依赖各个工具,在任何有git的地方都能操作git,但用命令有一个比较明显的弊端就是可视化比较差,显示出来的都是文字信息,特别是解决版本冲突修改的时候,看着还是比较麻烦的,例如:

远程修改了如下代码:

image-20201104231834964

本地没有更新,然后又修改了如下代码:

image-20201104231900023

当我们执行pull命令后,会失败,同时会出现一大堆文字让你去比较解决代码冲突

image-20201104232050428

相反,我们利用IDEA提供的功能,直接进行可视化操作,如下图:

image-20201104232122481

选择View them,即可对比显示出哪些代码冲突,通过界面操作,很快完成,节省许多时间

image-20201104232152195

image-20201104232221537

当然,习惯或喜欢命令行操作的都可以,毕竟是个工具,本人一般用着哪个爽就用哪个工具

img

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.配置

image-20210705223454070

image-20210705223538751

image-20210705223650858

or mygogs zy123456

访问记得要关闭防火墙,或者开通端口,不然会报错

20210707221715516

2.4 IDEA 切换不同Git账户

在idea的设置中,搜索password,在Passwords中,选择Do not save选项,Apply应用后,ok退出,重启Idea

image-20210401122833349

2.5 IDEA官网

1.英文帮助文档

2.中文帮助文档

3.基础操作

主要介绍IDEA中有关Git基本使用。在IDEA中,会用不同颜色来区分代码的状态,如下:

颜色含义
绿色已经加入控制暂未提交
红色未加入版本控制
蓝色加入,已提交,有改动
白色加入,已提交,无改动
灰色版本控制已忽略文件

3.1 代码上传

当我们新建了一个项目,想要把该项目上传到远程仓库中,那么可以如下操作:

1.如图,我们本地创建了一个项目

image-20201101133817273

2.再在远程服务器创建一个仓库,如图

image-20201101133953615

image-20201101134124120

3.本地项目选择一个版本控制方式,这里用git

image-20201101134232940

image-20201101134327591

4.把当前代码加入到git版本控制中,如图

image-20201101134516842

5.提交到本地仓库

image-20201101134646831

6.推送到远程仓库

image-20201101134752186

image-20201101134833736

image-20201101134919096

image-20201102192738064

3.2 代码下载

1.从远程拷贝代码路径,如图:

image-20201102201259864

2.新建项目,从版本控制中拉取代码,如图:

image-20201102201342113

3.填写地址,即可下载源码

image-20201102201437212

3.3 代码提交

当我们写完代码后,则需要上传代码到远程服务器中

1.提交当前修改代码到本地仓库,如图:

image-20201102201627455

image-20201102201657054

2.本地提交后,我们才可以push到远程仓库,如图:

image-20201102201754741

image-20201102201833923

3.4 代码更新

当多人合作开发代码时,不管我们开发开始还是结束,最好都要从远程服务器更新一下我们本地代码,不然后面提交会遇到代码冲突等问题

image-20201102202108645

4.实践操作

4.1 提交代码,可以只提交需要提交的代码吗?

可以,只要加入到版本控制后,我们本次修改的所有文件,都会放到一个IDEA提供的defalut changelist列表里,当我们commit的时候,默认就是提交这个列表里的记录,注意,多个Changelist中只有一个是active的,这个active的Changelist,默认情况下即为Default Changelist,粗体,且放在第一位。active的意思:快捷键(Ctrl + K)是对被设置为active的那个Changelist进行提交的。

image-20201102203015033

4.2 当修改了许多文件里的代码,但发现不想要这些代码了,是否可以恢复成原来的代码状态?

如下图,对一些文件做了修改,然后又新增了其他文件,突然想要撤销本地这些修改了的代码,那么就可以用rollback

image-20201102204750352

image-20201102204812248

勾选红圈相关配置,那么回滚后,本地代码就和之前拉去的代码保持一致了

image-20201102204941146

image-20201102205018880

还有一种方式,可以返回到之前状态,

image-20201102211133419

image-20201102211208724

HEAD^ 是还原到上一个版本,HEAD^^ 是还原到上上一个版本。
Reset Type 有三种:

mixed 默认方式,只保留源码,回退commit和index信息
soft 回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit
hard 彻底回退,本地源码也会变成上一个版本内容

4.3 代码修改后提交了,但没有提交到远程仓库,现想要撤回,该怎么做?

如图,我们代码修改,增加了“333”,并提交到本地仓库了

image-20201102205615346

从log里查看提交记录,然后选择undo,进行撤销,撤销后,我们可以看到changes里会多了一个changeslist的分组,这个分组里的内容就是撤销的相关内容,我们可以删除这个分组,那么分组里的修改就会自动归类到defalut那个分组里去

image-20201102205843173

image-20201102205934373

image-20201102210259921

4.4 代码push到了远程仓库,现想要撤回该怎么办?

如图,远程已经提交了53cd743554代码,但想要修改回ed598fe08e

image-20201102210733246

我们可以选择相关提交节点来进行撤销操作,如图

image-20201102211627684

image-20201102211655326

image-20201102211937771

本地恢复后,我们还需要进行远程恢复,所以需要再push一下,如图

image-20201102211821370

image-20201102211836259

image-20201102212044327

当想撤销中间某次提交时,强烈建议使用revert命令,而不是reset。 git reset –hard commit_id 虽然可以回退远程库,但是其要求pull最新代码的每个人的本地分支都要进行版本回退。这样就增加工作量了!

4.5 代码冲突了,怎么办?

如图,两边代码都做了修改,但是本地并没有做先更新后开发操作,那么本地代码版本就和远程不一致

image-20201102214039822

image-20201102214104621

本地提交可以正常提交

image-20201102214224820

一旦提交到远程服务器,则就会报代码冲突,如图:

image-20201102214333079

这个时候,我们就需要点击merge进行合并,如图;

image-20201102214449966

image-20201102214548736

修改好后,我们点击apply执行,然后再进行push操作,则代码冲突解决

image-20201102214843649

4.6 怎么创建分支?

如图,给当前主分支创建分支

image-20201102215310709

image-20201102215338441

创建完分支后,别忘了要push一下到远程服务器,如图:

image-20201102215428023

image-20201102215456691

4.7 如何切换分支?

如图,我们可以选择相关的分支,checkout进行切换

image-20201102215859914

4.8 一个分支上的代码,如何同步合并更新到另外一个分支上?

如图,dev分支修改了相关代码,并提交到了远程仓库,现在需要把dev的合并到master分支上

image-20201102220111739

首先,我们需要切换到master分支,如图

image-20201102220322504

选择merge changes

image-20201102220341136

image-20201102220429066

image-20201102220501510

代码合并成功

image-20201102220522310

4.9 如何代码暂存还原?

当我们正在开发的时候,测试提了一些问题,需要修改,那么为了能让我们正在开发的代码找一个地方保存起来,然后我们再把测试那个版本的代码进行修改提交后,然后再把之前的代码放出来,如图:

image-20201102221340338

如上图,我们正在对这个类进行修改,但是突然测试说有问题,需要修复这个类,那我们不可能把现在手头上操作的代码给回退到上个版本进行修改吧

我们这个时候,就可以用stash把当前代码保存起来,如图

image-20201102221512432

image-20201102221538667

现在我们进行代码修复,如图

image-20201102221713664

然后进行代码还原,如图

image-20201102221741529

image-20201102221820409

image-20201102222048534

4.10 为啥本地的分支比远程的分支要少一些?

如果你同事新建分支,这个时候自己idea看不到你要更新的分支,你需要git fetch 一下就能够看到了。

image-20201102222212096

4.11 为啥pull会失败?

image-20201102222300554

这是因为本地的代码和远程代码同一个地方有冲突了,点击右下角view them,查看哪些冲突了,进行回滚后再pull即可

4.12 能否尽快知道这段代码是谁修改过?

多人合作的时候,有些代码可能被人修改过了,但想要查找某些代码片段是哪些人改的,我们就可以用这个功能,打开annotate查看代码修改者

image-20201102204004842

4.13 查看当前版本?

当想查看某个文件是哪个属于哪个版本时,可以通过IDEA 右键选择查看

image-20201102204155316

4.14 查看历史版本?

1.可以通过右键项目来选择查看

image-20201102204346616

2.或者通过changelist,选择相关文件,右键进行查看

image-20201102204535795

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,查看之前别人分支提交记录,如图:

image-20210330141839570

或者

image-20210330142301566

3.当两边代码不一致,有冲突时,需要继续合并操作,如图:

image-20210330141925202

image-20210330143708095

4.然后检查commit弹出框的内容是否正确,确认无误后commit即可,最后别忘了push

image-20210330143809685

image-20210330143909880

4.15.1 合并无冲突代码

1.master分支合并某个dev分支,其中dev每次各个用户提交的代码和master是没有冲突的

image-20210707213233591

2.先切换到master,然后再摘取某个分支的提交

image-20210707213409989

image-20210707213418453

image-20210707213436432

4.15.2 master合并有冲突的分支

1.dev分支里,user1去user2的类user2Service里,增加了一部分代码

image-20210707213744346

2.dev分支里,user2自己修改了一些代码

image-20210707213908593

3.切换到master分支

image-20210707213946461

4.摘取某个分支

image-20210707213957970

image-20210707214029064

image-20210707214041806

image-20210707214058821

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

image-20201102085557468

这是因为我们提交的时候,输入的账号和密码不对,或者该账号没有对仓库操作的权限

重新输入账号和密码,我们可以在IDEA file->settings->passwords中取消密码保存来重新输入

5.1.2 远程撤销报错

若我们revert后,并没有点commit按钮,那么下次选中版本再提交的时候,会报All changes from 14132e57 have already been reverted类似错误,不让我们在执行,这是因为已经idea已经为我们创建了修改记录,如下图

image-20201102212526888

当我们再次执行revert commit命令时就会报如下:

image-20201102212702012

这是因为IDEA之前的操作已经给我们做了一些工作,若之前的没有commit,那么这些工作状态还在,需要先撤回,再重新撤销

image-20201102212607126

image-20201102212855402

image-20201102212924462

Entry '.idea/workspace.xml' not uptodate. Cannot merge. 若报这个错,则可以直接重新checkout远程代码出来即可

5.1.3 Cherry-pick报错

这是因为之前已经cherry-pick过了,如图:

image-20210330141349688

解决办法:点击下面 小黄按钮,abort cherry 终止掉上次未完成的操作即可,或者重启上次的操作也行

image-20210330141451728