当前位置: 首页 > 后端技术 > Python

分布式版本控制系统Git-四

时间:2023-03-26 15:45:40 Python

分布式版本控制系统Git|四个Git基础|UndoingModifications在工作过程中,很可能需要撤销一些操作。Git还提供了这样的命令来帮助撤消所做的更改。但需要注意的一点是,有些撤销操作是不可逆的。这也是为数不多的可能因为操作失误而导致工作进度丢失的操作之一。在工作过程中,可能会遇到以下几种情况。完成修改提交后,发现有些文件没有添加,或者提交信息有误。在这里,你可以使用带有--amend选项的gitcommit命令来尝试重新提交:commit,workingtreeclean$gitcommit--amend[masterbc3e952]Useoption--amendDate:WedFeb517:07:242020+08001filechanged,1insertion(+)以上命令将提交文件暂存区。但是,如果最后提交的文件没有被修改,立即使用该命令,快照将保持不变,并启动编辑器。此时提交的信息将覆盖上次提交的信息。在上面使用的命令中,第一次使用gitcommit提交是Somethingdifferent。使用gitcommit--amend命令后,提交后没有变化,所以使用该命令后,直接打开编辑器修改提交信息,改成Useoption--amend。$gitlogcommitddcba794e7a6b4bed818425b16b6a40a6565a975(HEAD->master)Author:大梦三千秋Date:WedFeb517:07:242020+0800Useoption--amendcommit102a4a4f950cffae0acfb53a634012182fb8e8a1Merge:d4a25550470264Author:大梦三千秋Date:TueFeb421:53:592020+0800Fixconflict使用gitlog查看commitlog时,发现先提交的信息,Somethingdifferent,commit中没有显示日志。这是上面提到的选项--amend的影响之一。当没有修改时,使用带有该选项的gitcommit命令,只修改提交信息。还有一种情况是用到了这个命令。commit后发现有些需要的改动没有stage。例如:$gitcommit-m"initialcommit"[master668ee3f]initialcommit1filechanged,1insertion(+)$gitstatusOnbranchmasterUntrackedfiles:(use"gitadd..."includeinwhat将被提交)forgotten_file$gitaddforgotten_file$gitcommit--amend[master34cec72]initialcommitDate:WedFeb518:31:192020+08002fileschanged,2insertions(+)createmode100644forgotten_file$gitstatusOnbranchmasternothingtocommit,workingtreeclean$gitlogcommit34cec724a319c5797a834c0e4b698029c3ba5994(HEAD->master)Author:大梦三千秋Date:WedFeb518:31:192020+0800initialcommitcommitddcba794e7a6b4bed818425b16b6a40a6565a975Author:大梦三千秋Date:WedFeb517:07:242020+0800使用option--amend在上面的Git命令中,提交后发现forgotten_file并没有暂存。使用命令暂存提交后,使用gitstatus确认工作区是干净的,也就是说丢失的文件也放回了暂存区。这时候用gitlog查看提交日志可以发现只有一次提交,因为第二次提交替换了第一次提交的结果。取消暂存文件假设模拟场景如下:工作中修改了两个文件,本意是将两个文件作为独立修改提交,但是gitadd*命令用于将两个文件放入同时暂存分区。此时要取消暂存其中一个文件吗?您还可以使用gitstatus命令获得提示:$gitadd*$gitstatusOnbranchmasterChangestobecommitted:(use"gitresetHEAD..."tounstage)modified:about_git.txtrenamed:readme.txt->在readme.md中,你会发现下面的文本Changestobecommitted,提示使用gitresetHEAD...来取消临时存储。现在尝试使用此命令取消暂存:$gitresetHEADabout_git.txtUnstagedchangesafterreset:Mabout_git.txt$gitstatusOnbranchmasterChangestobecommitted:(use"gitresetHEAD..."tounstage)renamed:readme.txt->readme.mdChangesnotstagedforcommit:(use"gitadd..."toupdatewhatwillbecommitted)(use"gitcheckout--..."todiscardchangesin中workingdirectory)modified:about_git.txt现在使用gitstatus可以看到about_git.txt已经被修改,没有暂存。这就是gitreset命令现在需要知道和可以做的。至于reset的更多细节以及它能完成的其他效果,可以查看下面的链接了解更多:https://git-scm.com/book/en/v2/Git-Tools-Reset-Demystifiedrevokesthefile假设您现在不想保留对about_git.txt的更改?如果你想回到上次提交的版本(或者只是克隆的版本等),gitstatus命令也会提示使用哪个命令来达到这个效果。$gitstatusOnbranchmasterChangestobecommitted:(use"gitresetHEAD..."tounstage)renamed:readme.txt->readme.mdChangesnotstagedforcommit:(use"gitadd..."来更新将要提交的内容)(使用"gitcheckout--..."来丢弃工作目录中的更改)修改:about_git.txt这里我们按照提示使用gitcheckout--来实现这个需求:$gitcheckout--about_git.txt$gitstatusOnbranchmasterChangestobecommited:(use"gitresetHEAD..."tounstage)renamed:readme.txt->readme.md可以看到这里,再次使用gitstatus发现about_git.txt的修改已经被撤销,版本回滚到about_git.txt没有修改的版本。注意:gitcheckout--这个命令是有风险的。在使用它之前,你需要仔细检查你是否不需要这个文件。因为这个命令会使对文件的任何修改消失。如果文件需要保留,但仍然需要撤销,这里可以考虑gitbranch,保存进度和分支。Git分支将在后面介绍。在Git中,已经提交的东西,一些误操作往往可以恢复。但是,未提交的东西往往会丢失,无法恢复。所以请谨慎使用撤消。以上就是本文的主要内容,未完待续,请关注微信公众号《书所集录》