文章目录
- Git常用命令
- Git工作原理
- 1、把已经add还没有commit的文件去掉Git版本管理
- 2、把commit但是还没有push的代码回滚
- 3、把已经push到远程的代码回滚
- 4、其他分支合并到当前分支
- 5、使用.gitignore忽略不想要提交的文件
- 6、提交代码突然显示authentication failed for xxx错误
- 7、设置不想要的文件隐藏,设置启动不扫描索引
- 8、Git Merge和Rebase合并分支
- 9、Git Stash和Unstash保存临时代码
- 10、Git Rebase合并多次提交
- 11、Git Reset和Git Revert
- 12、 把已经push到远程的代码提交记录回滚,代码不回滚
- 。。。。后续补充。。。。
这里记录一下工作或者平常学习中可能会用到的git的常用操作,主要是结合idea的!
Git常用命令
Git工作原理
工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
文件状态转换:
文件存储:
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都去掉,而上面的操作是单个文件!!!
3)idea选择git revert,可以自己指定哪个文件
2、把commit但是还没有push的代码回滚
直接选择分支就可以了,然后选择Hard:源码会回滚,提交历史也会回滚
3、把已经push到远程的代码回滚
比如选择了要回滚的版本,此时本地代码确实恢复到了想要版本的代码,但是和远程代码有冲突,这时候如果使用idea直接push到远程会发现代码又会恢复到跟远程代码一致,导致失败,所以要采用下面的
git push -f
强制推送上去才能成功!
先执行上面第二种步骤,然后再去控制台,执行命令git push -f
4、其他分支合并到当前分支
比如我现在的分支是dev分支,要将master分支最新代码合并到当前dev分支
5、使用.gitignore忽略不想要提交的文件
注意这里只是将还没有add的代码,并且以后也不想加到版本管理的文件进行忽略,比如:logs日志文件!
已经add的没有办法!!不过可以先按上述第一种操作去掉哦!!!
先来看下如何安装。点击File->Settings
使用:
在项目上右键->New ->.ignore file ->.gitignore file(Git)
先选择Example user template好了,以后有什么想过滤的可以自行添加,~最后点击Generate生成
然后就会发现被忽略的文件名变成了灰色有木有啊!又可以愉快的提交代码了~
也可以右键文件将其加入忽略的名单中
以后每次commit提交代码就不会有下面的Unversioned Files了
6、提交代码突然显示authentication failed for xxx错误
进入“控制面板”——“用户账户”-凭据管理器——windows凭据
找到git的用户名密码。修改正确后ok
7、设置不想要的文件隐藏,设置启动不扫描索引
设置不想要的文件隐藏:比如``.idea,.iml,.git,node_modules`等文件打开项目的时候不会显示,也不会扫描索引(这里比如node_modules设置了,你打开vue项目的时候就不会扫描索引,不然很容易卡死!!!)
设置启动不扫描索引:这样设置也可以,比如一些静态文件都可以设置!
8、Git Merge和Rebase合并分支
一:简单例子理解
先来个例子直观的感受一下Merge 和Rebase
如图所示:你在一个feature分支进行新特性的开发,与此同时,master 分支的也有新的提交。
merge
rebase
二:实际操作理解
首先这里有master分支和test分支,test分支是基于master分支的,两个此时完全一样
然后在test分支上新增两个提交tt1和tt2
然后切换到master分支,新增一个提交main
这时候点到Local看整个提交是这样的
这里分两种操作,一种是merge,一直是rebase
1、此时如果采用merge操作,将test分支merge into 到master分支(当前分支是在master),分支图如下
2、如果要采用rebase操作:首先切换到test分支,然后右键git-repository-rebase;基于master分支rebase
还会提示你要不要重新填写commit提交信息,一般默认选择Continue Rebasing即可
这时候会发现把master分支的main提交合并过来了,并且在一条直线
注意这时候不能直接push到远程,因为会发现有冲突要merge,直接选择merge的话又会回到原来的提交,所以这里要选择命令行git push -f
提交
然后可以再切换到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
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变成下面这样了
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_id
。git 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