版本控制的关键是可撤销性,即可以使项目回退到某些操作之前状态。Git作为一款非常优秀的版本控制软件具备了丰富的撤销的命令来应对不同的场景,下面我们来学习一下。
命令:`git commit --amend` 作用:本次提交覆盖上次提交,以此达到修改上次提交的目的。 复制代码
Git使用reset、revert和checkout三个命令来回退项目到某一个历史快照。 回退有两个影响级别: 1) commit级别:根据指定的commit来恢复项目整体到历史的某一快照。 2) 文件级别:根据指定commit和文件路径来恢复指定文件到某一历史版本。 复制代码
git reset --soft [commit]
git reset [commit]
/git reset --mixed [commit]
git reset --hard [commit]
git revert [commit]
作用:打补丁的形式撤销某次历史版本;git revert -n [commit]..[commit]
作用:撤销一个commit区间命令 | git reset | git revert |
---|---|---|
原理 | 改变分支的commit的引用 | 对已有commit引用打反补丁 |
副作用 | 改变commit历史 | 不会改变commit历史 |
适用性 | 本地分支 | 公共分支 |
冲突 | 无冲突 | 会有冲突 |
优点 | 无冲突的恢复到某次历史快照 | 可针对中间的某次提交进行撤销操作 |
本质 | 覆盖操作 | 修补操作 |
git reset [commit] [file]
,若是commit是HEAD
可替换为--
。git checkout file
git chekcout [commit] [file]
,若是commit是HEAD
可替换为--
。Git中每次提交都会存储在Git仓库,只是有些提交经过reset、删除分支、删除储藏等操作后不被分支和标签引用,变成悬挂状态(dangling)。我们可以通过以下命令查看这些提交(Git的提交树和vim的undo树异曲同工)。
git log -g
或git reflog
来查看git log
查看git fsck --lost-found
由于revert、分支合并等场景下的操作会与工作区和暂存区的内容产生冲突,若不想提交当前工作区和暂存区的修改内容,可以通过储藏命令将其储藏起来,然后在合适的时候恢复工作区和暂存区。
git stash # 储藏当前工作区和暂存区 git stash list # 查看当前的储藏列表 git stash apply # 恢复上一次的储藏内容 git stach pop # 恢复上一次的储藏内容,并将其从储藏区删除 复制代码
git clean -f
作用:删除未跟踪文件git clean -df
作用:删除未跟踪文件和目录git reset --hard
命令搭配使用。git reset --hard commit # 恢复git仓库、暂存区和工作区(不包含未跟踪内容)到指定commit git clean -df # 删除当前处于未跟踪状态的文件和目录 git status # 当前处于commit,且暂存区和工作区都处于clean状态 复制代码