Git是世界上最好最流行的分布式版本控制系统,也是程序员使用频率最高的工具之一(几乎每天都需要用到它对源代码进行版本控制。管理)。在使用Git的过程中,难免因为手快或者其他原因,需要对自己所做的事情进行多次“忏悔”或“忏悔”。别着急,Git的强大,几乎任何操作都可以“反悔”。让我们来看看。1.撤销临时保存前的本地修改。在介绍Git的“repent”操作之前,先简单提一下Git的一些基础知识。Git项目有3个区域:工作区、暂存区和Git仓库(分为本地仓库和远程仓库)。如下图所示:本地编写的代码,没有执行任何git命令,在工作空间中。当执行gitadd命令时,工作区中的文件会被标记为暂存,保存在暂存区。当执行gitcommit命令时,标记为staged的文件会保存在本地Git仓库中,并生成快照。在没有暂存之前(不执行gitadd命令),我们可以通过以下命令查看本地修改:gitdiff显示的格式如下图:如果我们不想要这些代码本地代码(比如一些临时的测试代码),我们可以通过以下命令一次性撤销所有本地修改:gitcheckout--。注意:此命令不能“忏悔”两次。本地操作一旦被撤销,将无法通过Git找回。撤销后再次执行gitdiff命令将没有输出,说明暂存区没有文件。我们也可以指定一个具体的文件路径来取消对文件的修改:gitcheckout--[filename]2.暂存之后,取消对暂存区的修改。将文件添加到暂存区,执行以下命令将本地修改的所有文件添加到暂存区(当然也可以指定具体文件):gitadd。此时我们执行gitdiff命令,不会有任何输出(因为文件已经添加到暂存区),而要查看暂存区的修改,可以执行以下命令:gitdiff--staged看到的效果和暂存之前通过gitdiff看到的效果是一模一样的。如果此时我们想撤销暂存区中的所有修改,可以执行如下命令(当然我们也可以撤销对暂存区中指定文件的修改):gitreset。注意:这个命令可以“忏悔”两次,通过gitadd。命令可以重新将文件添加到暂存区。这里的“撤销对暂存区的修改”指的是撤销gitadd。命令,回到执行gitadd之前的状态,即已经修改为暂存状态。此时如果执行gitdiff--staged命令,是不会有任何输出的。如果你执行gitdiffnaming,你会看到修改后和未暂存状态的输出。1和2的两个命令可以合二为一:gitreset--hard<=>gitreset。areadelete),直接执行上面的命令即可。3、提交到本地仓库(但不推送到远程仓库)后,取消本次提交,执行以下命令将暂存区的所有文件保存到本地Git仓库,并生成文件快照(方便对于之前的回滚等操作):gitcommit-m"modifysomefiles"这时候commithistory中会有一条记录f8651ff(CommitID):如果我们不想这次修改的内容,有下面这些两种方法:方法一返回当前提交的父对象a18c6fa(即上次提交,通过gitlog查看),相当于取消本次提交:gitcheckouta18c6fa执行gitlog命令,发现返回到上次提交:方法二重置之前提交的gitdiff效果与方法一相同:注意:该命令可以“反悔”两次,具体步骤如下:gitcheckout--.4.修改提交考虑如下场景:本来打算修改两个文件,结果只提交了一个文件,但是不想生成两个提交记录(CommitID),具体执行命令如下:gitaddsrc/app/app.component.htmlgitcommit-m"addtestblock"gitlog实际上只提交了一个文件app.component.html,这不是我们想要的。你可以通过以下命令“忏悔”(添加丢失的文件而不重新生成新的CommitID):gitaddsrc/app/app.component.cssgitcommit--amend另一种情况可能更常见,没有丢失的文件,只是提交信息那里是一个错误的单词,可以使用如下命令修复:gitcommit--amend-m"addtestcontainer"注意:--amendpatch参数会改变之前的CommitID,但不会生成新的CommitID。5.撤消提交历史中的指定提交。第三个总结提到了回滚最新提交的方法(使用gitreset命令)。此方法只能用于连续提交。如果只想撤销历史提交中的某个提交(例如:),怎么办?例如:CommitID为711bb0b,本次提交将标签的target属性由“_blank”改为“_self”。可以使用如下命令撤销提交(对提交内容进行“反向操作”),并在顶部生成新的提交:历史ID(1f49a42),此提交将标记的目标属性从“_self”改回“_blank”。6.当合并有冲突时,撤消合并操作。两个分支在同一个文件中修改了相同的地方,合并时会发生冲突:如果不想解决冲突,想取消合并,可以使用如下命令:gitadd之后。abort,put恢复合并前的状态。7、暂存区文件过多。我想删除它们,但我不想删除本地文件。Rebasetomaster:gitcorebase_testgitrebasemasterundo步骤如下:使用gitreflog命令找到rebase前的commit09b0adc使用gitreset--hard09b0adc重置为commit10.以脚本方式重写commit考虑以下场景,在一个非常早的commit,提交一个存放密码的文件passwords.txt到远程仓库。这时,如果你只是从远程仓库中删除了这个文件,其他人仍然可以通过提交历史找到这个文件。因此,我们需要从每个快照中移除密码文件,可以通过以下命令来完成:gitfilter-branch--tree-filter'rm-fpasswords.txt'HEAD命令执行后,提交历史中的所有提交将提交的passwords.txt文件彻底删除,永远无法通过Git找回。除了上面的“忏悔”操作,还有一个非常强大的命令也可以通过某种形式“忏悔”过去,那就是交互式rebase:gitrebase-i
