六、Git基础操作之撤销操作

2018-02-04  本文已影响42人  此间有道

版本控制的关键是可撤销性,即可以使项目回退到某些操作之前状态。Git作为一款非常优秀的版本控制软件具备了丰富的撤销的命令来应对不同的场景,下面我们来学习一下。

1.修改最后一次提交

  1. 未修改直接提交 未修改直接再次提交

    值得注意的是,两次提交的项目内容和提交人没有变化,但是由于提交的时间不同,导致commit对象的内容不同,因此产生内容的ID也不相同。

  2. 修改后再提交 修改后再提交

2. reset、revert和checkout

Git使用reset、revert和checkout三个命令来回退项目到某一个历史快照。
回退有两个影响级别:

2.1 commit级别回退

1)回退Git仓库
恢复git仓库到上一次提交

重新根据reset命令撤销刚才的撤销操作(是不是有点绕口)


撤销刚才的撤销操作
恢复到撤销前的状态
2)回退Git仓库和暂存区
回退Git仓库和暂存区
3)回退Git仓库、暂存区和工作区
git reset
git reset --hard
未跟踪文件不被清除
git revert
git revert
revert的冲突情况
4)reset和revert的区别
初始状态
命令 git reset git revert
原理 改变分支的commit的引用 对已有commit引用打反补丁
副作用 改变commit历史 不会改变commit历史
适用性 本地分支 公共分支
冲突 无冲突 会有冲突
优点 无冲突的恢复到某次历史快照 可针对中间的某次提交进行撤销操作
本质 覆盖操作 修补操作
2.2 文件级别回退
1)回退暂存区文件
2)回退工作区文件

3.提交树

Git中每次提交都会存储在Git仓库,只是有些提交经过reset、删除分支、删除储藏等操作后不被分支和标签引用,变成悬挂状态(dangling)。我们可以通过以下命令查看这些提交(Git的提交树和vim的undo树异曲同工)。

1)完整提交树
2)有效提交树
3)撤销的悬挂提交(dangling commit)
4)一图以蔽之
提交树

4.储藏和恢复

由于revert、分支合并等场景下的操作会与工作区和暂存区的内容产生冲突,若不想提交当前工作区和暂存区的修改内容,可以通过储藏命令将其储藏起来,然后在合适的时候恢复工作区和暂存区。

git stash       # 储藏当前工作区和暂存区
git stash list  # 查看当前的储藏列表
git stash apply # 恢复上一次的储藏内容
git stach pop   # 恢复上一次的储藏内容,并将其从储藏区删除

5.清除未跟踪文件

git reset --hard commit  # 恢复git仓库、暂存区和工作区(不包含未跟踪内容)到指定commit
git clean -df # 删除当前处于未跟踪状态的文件和目录
git status # 当前处于commit,且暂存区和工作区都处于clean状态

参考

  1. 代码回滚:git reset、git checkout和git revert区别和联系
  2. 在 git 中找回丢失的 commit
  3. Git 工具 - 储藏(Stashing)
  4. Git的"~"和"^"的区别
上一篇下一篇

猜你喜欢

热点阅读