# Git常见工作场景

## 撤销更改

### 场景1

&#x20;当你改乱了工作区某个文件的内容，想直接丢弃**工作区**的修改时，用命令`git checkout -- file`。

```bash
# “哎，又有新需求，修改代码”
# “咦，改乱了，这个逻辑好复杂，重新理一下逻辑，重头来过”
$git checkout -- file
```

### 场景2

&#x20;当你不但改乱了工作区某个文件的内容，还添加到了**暂存区**时，想丢弃修改，分两步，第一步用命令`git reset HEAD` ，就回到了场景1，第二步按场景1操作（`git checkout -- file`）。

```bash
# “新需求，修改代码”
# “嗯，对，可以了”
$git add file

# “哦，NO，不对，这里不对”
$git reset HEAD
$git checkout --file
```

### 场景3

&#x20;已经提交了不合适的修改到版本库时，想要撤销本次提交，那就需要**版本回退**了，不过前提是没有推送到远程库。

```bash
# “新需求，修改代码”
# “嗯，对，可以了”
$git add file

# 提交代码
$git commit -m "功能完成"

# “完了，完了，这里不对,咋办？”
$git log
# 该命令显示从最近到最远的提交日志，如果嫌输出信息太多，看得眼花缭乱的，可以试试加上--pretty=oneline只写 --onleline也可以，只会显示commit id 的前几个字符
$git log --pretty=oneline
#or
$git log --oneline #只会显示commit id 的前几个字符
#和SVN不一样，Git的commit id不是1，2，3...递增的数字，而是一个SHA1计算出来的数字，用十六进制表示。

#【回到过去】
$git reset --hard HEAD^ #回退到上一个版本
$git reset --hard HEAD^^ #回退到上上一个版本

#【回到未来】-前提是你git没关，还找到了未来的commit id
$git reset --hard 752f5c2

#【不小心关闭了git，时空跳跃的按钮不见了】
$git reflog
#记录你的每一次命令
#找到commit id
```

{% hint style="info" %}
1、回到过去，用`git log`可以查看提交历史，以便确定要回退到哪个版本。

2、回到未来，用`git reflog`查看命令历史，以便确定要回到未来的哪个版本。
{% endhint %}

## 删除

* `rm file`，如果你用`rm`删除的文件，就相当于只删除了工作区的文件，如果需要恢复，直接使用 `git chekout -- file`就可以
* `git rm file`,如果你用的是`git rm`删除文件，那就相当于不仅删除了文件，而且还添加到了暂存区，相当于执行了以下两条命令：

  ```
  # 删除文件
  rm file
    
  git add -A
  ```

  需要先 `git reset HEAD <file>`，然后再`git checkout -- <file>`
* `git checkout -- file`其实是用版本库里的版本替换工作区的版本，无论工作区是修改还是删除，都可以还原
