虽然git已经诞生12年了,网上关于git的文章更是数不胜数,但是仍然有很多人(包括我自己)对它感兴趣。无法完全掌握功能。下面的介绍只是基于我个人对git的理解,可能有些话是我编造的,并不完全符合git的说法。目的只是为了让git流行起来,让初学者对如何快速上手git有个大概的了解。同时,在下面的所有讨论中,我们假设只使用一个分支,即主分支master。虽然这种方式不符合git规范,但实际上,大多数用户直接在master分支上工作。所以这里不介绍各个分支比较复杂的情况,也不涉及标签的操作,只讲如何在最简单的主分支上回滚。基本概念3步一般情况下,我们的工作流程是3步,对应上图中的3个箭头线:gitadd.gitcommit-m"comment"gitpushgitadd。将所有文件放入暂存区;gitcommit将暂存区的所有文件提交到本地仓库;gitpush将本地仓库的所有文件推送到远程仓库。git之所以在四个方面令人费解,是因为相对于svn等传统的版本管理工具,它引入了暂存区(Stage)的概念。因为这个概念,很多人都混淆了。其实对于初学者来说,我们不需要关心每个区域是如何工作的,我们只需要知道有4个区域:工作区(WorkingArea)、暂存区(Stage)、本地仓库(LocalRepository))远程仓库(RemoteRepository)有超过5个状态和4个区域。成功进入每个区域后,会产生一个状态,加上初始状态,一共有5个状态。下面我们分别命名这5种状态:Unmodified(Origin)Modified(Modified)Staged(Staged)Committed(承诺)Pushed(Pushed)Checkandmodify了解了基本概念之后,我们就来说说出错后如何撤消。首先,我们需要明白这3个步骤分别是如何查看修改了什么,然后才能判断修改是否成功。检查修改的二级命令都是一样的,都是diff,只是参数不一样。已修改,未暂存gitdiff首先,让我们看一下如果我们只是将文件保存在浏览器中,但在执行gitadd之前,我们如何检查所做的更改。我们拿一个随机文件做个实验:我们在文件开头的第二行随机添加4个数字1234,并保存。此时文件已经进入修改状态,但还没有进入暂存区。我们运行gitdiff,结果如下:diff--gita/index.mdb/index.mdindex73ff1ba..1066758100644---a/index.md+++b/index.md@@-1,5+1,5@@----layout:main+1234layout:maincolor:black---gitdiff的结果告诉我们修改了哪些文件。暂存区,未提交的gitdiff--cached下面我们把改动放到暂存区看看。先执行gitadd.,再执行gitdiff,你会发现没有结果:这说明gitdiff这条命令只是检查我们的工作区和暂存区的区别,如果我们想看暂存区和本地仓库的区别,需要加一个参数gitdiff--cached:diff--gita/index.mdb/index.mdindex73ff1ba..1066758100644---a/index.md+++b/index。md@@-1,5+1,5@@----layout:main+1234layout:maincolor:black---我们此时看到的区别是暂存区和本地仓库的区别。已提交,未推送gitdiffmasterorigin/master现在,我们将更改从暂存区提交到本地仓库,并查看差异。先执行gitcommit,再执行gitdiff--cached,没有区别,执行gitdiffmasterorigin/master,可以看出区别:这里master是你本地仓库,origin/master是你远程仓库,master表示主分支,因为我们都是在主分支上工作,所以这里两边都是master,origin表示remote。UndoingModifications在了解了如何检查各种修改后,我们开始尝试各种undo操作。修改了,没有暂存如果我们只是在编辑器中修改了文件,还没有执行gitadd.,我们的文件还在工作区,没有进入暂存区。我们可以使用:gitcheckout。或gitreset--hardtoundo。可以看到,执行gitcheckout.后,修改已经撤销,gitdiff也没有内容了。一对反义词gitadd的反义词。是gitcheckout。修改完成后,如果想更进一步,让修改进入暂存区,执行gitadd。如果你想退一步,撤销刚才的修改,执行gitcheckout。暂存,未提交你已经完成了gitadd,但不是gitcommit-m"comment"。这时候,你意识到错误,想要撤消,可以执行:gitresetgitcheckout。或者gitreset--hardgitreset只是把修改返回到gitadd之前的状态。也就是说,文件本身还处于被修改的状态,并没有被暂存。如果你想回到未修改的状态,你还需要执行gitcheckout..你可能已经注意到,上面的两个步骤都可以用同一个命令gitreset--hard来完成。是的,就是这个强大的命令,可以一步将你的修改完全恢复到未修改的状态。已提交,未推送你的手太快了,你都执行了gitadd。而gitcommit,此时你的代码已经进入了你的本地仓库,但是你后悔了,怎么办?别着急,你还是有办法的。gitreset--hardorigin/master还是gitreset--hard命令,只不过这次多了一个参数origin/master,我们上面说了origin/master代表远程仓库,既然你污染了你的本地仓库,那么从远程仓库取回代码。推不幸的是,你的手太快了。你有gitadd、gitcommit和gitpush。这时候你的代码已经进入了远程仓库。如果要恢复也没关系,由于你的本地仓库和远程仓库是等价的,你只需要先恢复本地仓库,然后强制push到远程仓库即可:gitreset--hardHEAD^gitpush-f总结了上面我们四种状态的撤销都是使用相同的命令gitreset--hard,前两种状态的用法甚至完全一样,所以只要掌握了gitreset--hard命令的用法,你再也不用担心提交错误了。
