git结构和各操作之间的关系
WorkDir进行add操作将当前修改同步到 Index,执行commit操作同步到Head,执行push上传到Server。
撤销add操作
git reset [HEAD/commitid] 使用HEAD或者commitid覆盖Index,不影响Head和WorkDir,如果是在commit之后执行这个操作相当于同时撤销了commit和add操作
git reset [HEAD/commitid] – file 针对某个文件使用HEAD或者commitid覆盖Index,不影响Head和WorkDir
撤销commit操作
git reset –soft HEAD^ 重置HEAD到上一版本,即撤销commit操作,不影响index和workdir。
git reset –soft HEAD^1 ^后面的数字表示恢复到哪个父提交的版本,一个提交可能会对应多个父提交,用于指定回到哪个
git reset –soft commitid 后面添加comiit_id指明回退到哪个版本
撤销commit和add
git reset –mixed HEAD^ 效果同git reset HEAD^
git reset –mixed HEAD^1 ^后面的数字表示恢复到哪个父提交的版本,一个提交可能会对应多个父提交,用于指定回到哪个
撤销commit、add操作,并将本地版本也重置为上一版本
git reset –hard HEAD^ 重置head到上一版本,会覆盖index, –hard会使head、index、workdir都重置回之前的版本,远程服务器上不会变,如果希望远程服务器上也回到上一版本的话,就使用一下git push –force。
git reset –hard HEAD^1 ^后面的数字表示恢复到哪个父提交的版本,一个提交可能会对应多个父提交,用于指定回到哪个
git reset –hard commitid 用commit_id指定回到哪次 commit
git revert
git revert commitid 使用某一次提交覆盖当前,已达到恢复到某次的效果。revert之后执行一次git push同步到server。
git reset 和 git revert 的区别
git reset 简单暴力的将版本置回到某个版本,现在有过a、b、c、d四次提交,提交顺序为a、b、c、d,现在为d。使用git reset恢复到a之后,看git log,就只剩下a了,b、c、d都不见了。使用git revert恢复到a之后,看git log,会发现a、b、c、d都在,多了e操作,e操作为“revert a”。
原始log:
执行过git reset之后:
可以看到commitid为7f****的log记录已经没有了
再来看一下revert:
解决完冲突,revert之后:
可以看到这里多了一条“Revert ‘commit add’”的记录。