版本控制的关键是可撤销性,便可以使项目回退到某些操做以前状态。Git做为一款很是优秀的版本控制软件具有了丰富的撤销的命令来应对不一样的场景,下面咱们来学习一下。html
命令:`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树殊途同归)。node
git log -g
或git reflog
来查看git log
查看git fsck --lost-found
因为revert、分支合并等场景下的操做会与工做区和暂存区的内容产生冲突,若不想提交当前工做区和暂存区的修改内容,能够经过储藏命令将其储藏起来,而后在合适的时候恢复工做区和暂存区。git
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状态
复制代码