约 1713 个字 26 行代码 31 张图片 预计阅读时间 6 分钟
查看目录结构中,就可以看到包含有 .git
子目录,这就说明创建版本库成功
相当于idea中的 vcs----create git repository
Bash |
---|
| git add 001.txt // 添加单个文件到暂存区
git add . // 将当前目录下所有修改添加到暂存区,除按照规则忽略的之外
|
相当于idea中的git --> add

不同之处是在idea中即便不进行add
,依旧可以commit

Bash |
---|
| git commit // 如果暂存区有文件,则将其中的文件提交到仓库
git commit -m 'your comments' // 带评论提交,用于说明提交内容、变更、作用等
|
这个和idea中的git -commit
一致,不同点:注释必须写
在idea中,直接在commit界面可以看到改动的所有文件以及未add的文件
红色: 代表未add
到暂存区
绿色: 代表已在暂存区但是有修改
无标记:代表无修改
Bash |
---|
| git diff // 查看版本库中所有的改动
git diff 001.txt // 查看具体文件的改动
|
在idea中,可以在commit
界面中双击文件查看,或者也可以通过右键标签--show diff with working tree
查看

Bash |
---|
| git log // 显示所有提交的历史记录
git log --pretty=oneline // 单行显示提交历史记录的内容
|
相当于idea中的git
窗口,同时commit id
位于右下角

Bash |
---|
| git reset --hard HEAD^ // 回退到上一个提交版本
git reset --hard HEAD^^ // 回退到上上一个提交版本
git reset --hard 'commit_id' // 会退到 commit_id 指定的提交版本
|
如下图,某个git
仓库中存在2个提交记录,需要版本回退到第一个记录

输入 git reset --hard f731

此时,如果反悔了,不希望回退,如何重新返回?
输入git log
,发现仅存在一条提交记录,查询不到第2条提交记录

可以通过git reflog
找到之前的提交记录
Bash |
---|
| git reflog
git reset --hard 'commit_id'
|

git reset
的方式不仅仅只有hard
一种,还有soft
、mixed
、keep
,而在介绍它们之间的异同前,首先需要理解git的工作区域

- Workspace: 工作区,就是你平时存放项目代码的地方
- Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
- Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
- Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
执行reset
命令后还存在文件的区域

前置准备(其他演示类似不做过多赘述)
类似上文,某个git
仓库中存在2个提交记录,需要版本回退到第一个记录
远程仓库如下图所示

输入下述命令,使用soft
回滚,并推送到远程仓库
Bash |
---|
| git reset --soft 'commitid'
git push --force origin master # 注意这里要强制推送
|
可以看到远程仓库中第2次提交不存在了,意味着版本库发生修改

运行 git status
和 ll
(alias for ls -l
), 观察结果可知工作区和暂存区未发生修改

输入下述命令,使用mixed回滚,并推送到远程仓库
Bash |
---|
| git reset --mixed 'commitid'
git push --force origin master # 注意这里要强制推送
|
可以看到远程仓库中第2次提交不存在了,意味着版本库发生修改

运行 git status
和 ll
(alias for ls -l
), 观察结果可知工作区未发生修改,暂存区发生修改(丢失了对t2的追踪)

操作
移动本地库HEAD指针
重置暂存区
重置工作区
输入下述命令,使用hard回滚,并推送到远程仓库
Bash |
---|
| git reset --hard 'commitid'
git push --force origin master # 注意这里要强制推送
|
可以看到远程仓库中第2次提交不存在了,意味着版本库发生修改

运行 git status
和 ll
(alias for ls -l
), 观察结果可知工作区发生修改,暂存区发生修改(丢失了对t2的追踪)

操作
移动本地库HEAD指针
重置暂存区
重置工作区, 保留改动
keep
模式和hard
模式有些类似,但是对工作区的操作有些不同,具体如下
工作区中文件如果当前版本和退回版本之间没有发生过变动,则工作区的修改保持不便;如果发生了变动,并且工作区也进行了修改,需要自行合并(或者冲突解决)
1. 工作区文件未发生变动
Bash |
---|
| git reset --keep 'commitid'
|
与hard
模式保持一致,版本库、暂存区和工作区均发生修改

2. 工作区文件发生变动
在reset
之前,将t1
文件中的111
改为311
,并添加到暂存区

执行reset
Bash |
---|
| git reset --keep 'commitid'
|
神奇的是,加入暂存区的对应文件发生的变动也被保留了下来

再来看变动的另一种情况,在reset
之前,将t1
文件中的111
改为311
,且将t2
文件中的222
改成322
,并添加到暂存区

执行 reset
Bash |
---|
| git reset --keep 'commitid'
|
发现出现报错,原因是f731
版本中t2
文件是不存在的,导致无法merge

结论
keep影响版本库、暂存区和工作区,可以撤销提交而不丢失文件的更改
接下来学习idea git中的版本回退
首先在项目中创建一个名为 GitResetTest.java
的文件
添加到暂存区并提交

修改文件,再次提交

右键希望回退到的版本,选择Reset

选择hard模式

如果希望撤销回滚,同样需要查询reflog
, 打开terminal
输入git reflog
, 找到对应的commitid

通过右键项目的reset head进行回退

Bash |
---|
| git checkout -- 004.txt // 如果 004.txt 文件在工作区,则丢弃其修改
git checkout -- . // 丢弃当前目录下所有工作区中文件的修改
|
idea中:

注意到在rollback
右侧有一个静默搁置按钮

点击之后修改的代码也会消失,这个功能主要是用于暂存你修改后的代码,并把你工作区的代码回滚到最后commit的记录,恢复的时候通过:

那么这个操作具体使用场景是什么呢?
试想一下,在我们开发的时候,正在写某个需求的代码,然而此时项目经理要求你去做一个更加重要/紧迫的任务,那么现在这部分需求代码暂未写完,是不能提交的,此时就可以使用静默搁置,将代码暂时搁置,等到把项目经理的任务忙完后,选择取消静默,接着写即可
在被 git 管理的目录中删除文件时,可以选择如下两种方式来记录删除动作:
rm + git commit -am "abc"
git rm + git commit -m "abc"
区别在于
- 如果文件已经被git跟踪,那么 1、2 都可以正常工作
- 如果文件未被git跟踪
rm + git commit -am "abc"
不会提交删除
git rm + git commit -m "abc"
可以确保文件删除被git记录并提交