Git结合Idea常用操作记录

这里记录一下工作或者平常学习中可能会用到的git的常用操作,主要是结合idea的!

Git常用命令

img

img

Git工作原理

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

img
文件状态转换:

文件状态转换:
文件存储:

在这里插入图片描述

1、把已经add还没有commit的文件去掉Git版本管理

这里有三种方法:
1)git rm --cached 文件名(要进入到对应文件目录下)

2)git reset HEAD 文件名(要进入到对应文件目录下))

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

idea中git reset:

git reset --mixed 回退commit,保留源码,默认方式.

git reset --soft 回退至某个版本,只回退commit信息

git reset --hard 彻底回退至某个版本

idea中 选择git reset,要选择Mixed,HEAD
这里直接这是默认把整个项目所有add的没有commit都去掉,而上面的操作是单个文件!!!

image-20200919151000523

3)idea选择git revert,可以自己指定哪个文件

image-20200919151106388

image-20200919151123155

2、把commit但是还没有push的代码回滚

直接选择分支就可以了,然后选择Hard:源码会回滚,提交历史也会回滚

image-20200919155325922

image-20200919155358580

3、把已经push到远程的代码回滚

比如选择了要回滚的版本,此时本地代码确实恢复到了想要版本的代码,但是和远程代码有冲突,这时候如果使用idea直接push到远程会发现代码又会恢复到跟远程代码一致,导致失败,所以要采用下面的git push -f强制推送上去才能成功!

先执行上面第二种步骤,然后再去控制台,执行命令git push -f

image-20200919155325922

image-20200919155358580

image-20200919155606238

4、其他分支合并到当前分支

比如我现在的分支是dev分支,要将master分支最新代码合并到当前dev分支

image-20200919162158969

5、使用.gitignore忽略不想要提交的文件

注意这里只是将还没有add的代码,并且以后也不想加到版本管理的文件进行忽略,比如:logs日志文件!

已经add的没有办法!!不过可以先按上述第一种操作去掉哦!!!

先来看下如何安装。点击File->Settings

使用:
在项目上右键->New ->.ignore file ->.gitignore file(Git)

先选择Example user template好了,以后有什么想过滤的可以自行添加,~最后点击Generate生成

然后就会发现被忽略的文件名变成了灰色有木有啊!又可以愉快的提交代码了~

也可以右键文件将其加入忽略的名单中

以后每次commit提交代码就不会有下面的Unversioned Files了

image-20200919164639415

6、提交代码突然显示authentication failed for xxx错误

进入“控制面板”——“用户账户”-凭据管理器——windows凭据

找到git的用户名密码。修改正确后ok

img

7、设置不想要的文件隐藏,设置启动不扫描索引

设置不想要的文件隐藏:比如``.idea,.iml,.git,node_modules`等文件打开项目的时候不会显示,也不会扫描索引(这里比如node_modules设置了,你打开vue项目的时候就不会扫描索引,不然很容易卡死!!!)

image-20200919172507117

设置启动不扫描索引:这样设置也可以,比如一些静态文件都可以设置!

image-20200919172717439

8、Git Merge和Rebase合并分支

一:简单例子理解
先来个例子直观的感受一下Merge 和Rebase

如图所示:你在一个feature分支进行新特性的开发,与此同时,master 分支的也有新的提交。

在这里插入图片描述
merge

在这里插入图片描述
rebase
在这里插入图片描述

二:实际操作理解

首先这里有master分支和test分支,test分支是基于master分支的,两个此时完全一样

image-20210603211952169

然后在test分支上新增两个提交tt1和tt2

image-20210603212252063

然后切换到master分支,新增一个提交main

image-20210603212450531

这时候点到Local看整个提交是这样的

image-20210603212534831

这里分两种操作,一种是merge,一直是rebase

1、此时如果采用merge操作,将test分支merge into 到master分支(当前分支是在master),分支图如下

image-20210603212722924

2、如果要采用rebase操作:首先切换到test分支,然后右键git-repository-rebase;基于master分支rebase

还会提示你要不要重新填写commit提交信息,一般默认选择Continue Rebasing即可

image-20210603214627013

image-20210603214700231

image-20210603214708706

这时候会发现把master分支的main提交合并过来了,并且在一条直线

image-20210603214818971

注意这时候不能直接push到远程,因为会发现有冲突要merge,直接选择merge的话又会回到原来的提交,所以这里要选择命令行git push -f提交

image-20210603215009154

然后可以再切换到master分支,选择将test分支merge into 到master分支,即可使得提交跟test一样是一条直线

9、Git Stash和Unstash保存临时代码

注意:这里有时候合并代码的时候,你可能会发现自己的代码莫名其妙的不见了,其实Git并没有丢失,而是把你的代码Stash起来了,以前傻傻的以为Git自己丢失了,后面才发现原来Git都帮你暂存起来了。。。只是自己不懂Stash这个东西

这个主要是可以将代码的修改暂时保存起来(注意是还没commit的代码),比如在和别的分支合并的时候,你只是写了一点点,还不想将这些内容commit,可以考虑用右键git----repository–Stash Changes保存起来,恢复的时候只要UnStash即可
在这里插入图片描述
这里使用UnStash的时候,可以点击View查看之前保存起来的内容;也可以Drop/Clear清除单个/所有的Stashs;选中某个要恢复的Stash后,只要Apply Stash即可
在这里插入图片描述

10、Git Rebase合并多次提交

为了使得提交更简洁,这里假设我们要将tt1和tt2合并为同一个commit叫做tt1+tt2

image-20210604151817863

1、我们可以采用git rebase -i head~2 就是将当前版本之前的两次提交进行合并

git rebase -i  [startpoint]  [endpoint]
其中-i的意思是--interactive,即弹出交互式的界面让用户编辑完成合并操作,
[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit
(注:该区间指定的是一个前开后闭的区间)。

2.之后会出现下面的vim编辑器

Vim分为两种模式,
命令模式:输入一些控制指令 如撤销.退出.保存.等等
编辑模式:可以编辑文本;
默认进入为命令模式,键入i,o,s,a等即可进入编辑模式,按esc可退出编辑模式

1、删除:
x 删除当前字符
dd 删除当前行 d(elete)
dw 删除当前光标下的词 d(elete)w(ord)

2、修改:
i 在光标当前位置向前插入 i(nsert)
I在本行第一个字符前插入
a 在光标当前位置向后插入 a(fter)
A 在本行末尾插入
o 向下插入一行
O 向上插入一行
:w 保存
-:q 退出
:wq 保存并退出
u 撤销上一次修改
ctrl + r重做


pick 650c85b tt1
pick 71af785 tt2

# Rebase c6332c0..71af785 onto c6332c0 (2 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
E:/IdeaPro/gittest/.git/rebase-merge/git-rebase-todo [unix] (15:21 04/06/2021)      

3、这里键盘点击 i 进入编辑模式,按照提示修改

pick:保留该commit(缩写:p)

reword:保留该commit,但我需要修改该commit的注释(缩写:r)

edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)

squash:将该commit和前一个commit合并(缩写:s)

fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)

exec:执行shell命令(缩写:x)

drop:我要丢弃该commit(缩写:d)

我这里选择这个p,s;然后点击esc,进入vim命令模式,

p  650c85b tt1
s  71af785 tt2

然后输入":wq"回车 ,变成这个界面,让你填写新的提交信息

p 650c85b tt1
s  71af785 tt2
# This is a combination of 2 commits.
# This is the 1st commit message:
tt1
# This is the commit message #2:
tt2

同样点击i进入编辑模式,我把提交信息改成tt1+tt2

p 650c85b tt1
s  71af785 tt2
# This is a combination of 2 commits.
# This is the 1st commit message:
# This is the commit message #2:
tt1+tt2

然后发现提交的log变成下面这样了

image-20210604152919226

11、Git Reset和Git Revert

在利用Git实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,这里总结了两种解决方法:回退(reset)、反做(revert)

总结理解:
revert 是回滚某个 commit ,不是回滚“到”某个,并且是保留了后面的版本
git reset --hard 撤销到某次提交 git revert 撤销某次提交

例子理解:
git revert commit_id之后并不会回滚到该id的内容,而是将该id的内容给逆向操作一遍,比如说,a操作添加了“haha”,commit了a,b操作添加了“xixi”,commit b。现在想回滚到只添加了“haha”,需要的是删除“xixi”,也就是逆向操作b,所以应该git revert b的commit_idgit revert 应该翻译成“反转、逆转”比较好理解,而不是回退。

1、Git Reset
在这里插入图片描述
适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。

2、Git Revert
在这里插入图片描述
适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。

Git revert 冲突解决方法(conflict)
git revert < commit>遇到冲突时解决办法:

修改冲突的文件
git add 冲突的文件
git revert --continue

12、 把已经push到远程的代码提交记录回滚,代码不回滚

这种情况我感觉比较适合,合并多个commit 提交记录,有时候你可能提交的很混乱或者是重复的几个,就可以考虑用这种方式进行整理

执行操作基本同第3种情况,但是要注意这里选择的是Mixed!Mixed!Mixed!

执行完Reset Current Branch to here以后,这里不同于选择的Hard选项的是,这里要重新commit你自己想要的提交记录,而Hard的话你点commit这时候是没有变化的,commit完你自己想要的提交记录以后,也是要执行git push -f才可以真正把本地提交到远程,这时候你就会发现提交记录变成了你自己要的了,但是代码并没有回滚!!!

。。。。后续补充。。。。

参考文章:
https://juejin.cn/post/6844903603694469134
https://blog.csdn.net/yxlshk/article/details/79944535

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Apple_Web

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值