前言Git作为分布式版本控制系统,已经成为开发的宠儿。它不仅应用于前端、后端、客户端的开发场景,也成为了分工协作的必备技能之一。您在使用过程中总会遇到这样那样的问题。本文主要针对以下经常出现的异常情况提供一些解决方案:本地工作区文件修复远程分支删除后,提交时删除本地分支及其关联的修改注释内容修改分支名称,实现无缝连接撤回文件提交撤消本地branchmergeandrestore不小心删除了localbranch不确定哪个branch有自己的commit(1)localworkspace中的文件修复大家都知道,如果一个文件夹中的文件被删除了,那么只能在垃圾桶里找了。如果垃圾桶里的也被删了,以笔者的常识,恐怕没有工具就找不到了,emmmmm。..但是,与Git关联的文件和文件夹是不同的。有了本地仓库和远程仓库的双重保护,找一个被删除的文件只需要几分钟,一个命令行的事情。语法:gitcheckout<文件名/目录名>命令:gitcheckout1.js该命令主要用于撤回本地工作空间中的文件。下图是一个完美的工作区文件被删除后的恢复过程。(2)远程分支删除后,删除本地分支和关联,方便分支提交。一般会使用本地命令gitbranch--set-upstream-to=origin/mastermaster建立本地分支与远程分支的关联,从master拉取的分支可以自动与远程现有的建立关联branch,这样可以很方便的使用gitpull和gitpush拉取远程分支的代码,将本地分支提交到远程。Git远程分支删除后,本地分支无法成功推送到远程。如果要重新建立与远程仓库的关联,需要先删除它原来与被删除的远程分支的关联。如下图所示,要删除的远程分支为feature/test。使用gitpushorigin--deletefeature/test删除对应的远程分支,然后删除本地分支关联。语法:gitbranch--unset-upstream命令:gitbranch--unset-upstreamfeature/test删除关系后,使用gitbranch-vv命令查看本地分支和远程分支的关系如图在下图中可以观察到feature/test分支没有关联远程分支。(3)提交时修改备注内容。平时提交代码的时候,很多时候因为军方紧急,第一次提交的时候会把自己不满意的备注填进去,但是我有点强迫症,所以一定要改成什么我想。该怎么办。...,别慌,还是有解决办法的!修改上次提交的“修改xxx函数”备注:语法:gitcommit--amend命令:gitcommit--amend使用gitlog--pretty=oneline查看内容,发现修改成功。需要注意的是,该命令在提交的时候会修改commit-id,即覆盖原来的提交,所以需要谨慎操作。(4)修改分支名称,实现无缝连接。开发中的大佬们,都是速度极快的人。与初衷有很大出入。Git提供了一种修复方法,已经拉取了分支,在上面开发了很多内容,后来发现原来拉取的分支名有问题。需要修改的分支名称为stor-13711,如下图所示:语法:gitbranch-m命令:gitbranch-mfeature/stor-13711feature/story-13711执行后找到文件的工作区修改的内容一点都没有改变,真正实现了无痛过渡,大快人心!(5)文件提交的撤回在日常工作中,由于需求的变化、文件处理的不同、提交错误的不应提交的内容等,可能会提交不适合提交的内容,并进行撤回需要操作。提交中包含的需要撤回的内容如下图所示:各种撤回原因的处理方法分析如下,主要包括:需求变更、代码重构等原因导致的撤回。因个人疏忽等原因撤销本条要求因变更或其他原因仍需做,但有部分变更,按照之前提交的不合适,需要重新修改后提交,增加每个提交的连续性和单个提交的完整性。语法:gitreset--soft[/HEAD~n>]命令:gitreset--softHEAD~1命令执行后,查看文件变更记录,如下图:filechangerecord和提交前的文件变更记录是一致的,可以判断commit的操作只是撤销了。文件撤回工作区后,可能会出现一些之前上传的文件不再需要,但本地又不想删除或删除不了的情况(比如node_modules文件)。Git提供了完整的解决方案。在本地项目根目录新建一个.gitignore文件,使用文件的特定语法(如下图所示)保证文件不会上传到本地或远程仓库。它的实现原理主要是在本地保存的文件快照中删除.gitignore文件中定义的文件,从而达到不上传的效果。#忽略.a文件*.a#但是忽略lib.a,虽然之前已经忽略了.a文件!lib.a#只忽略当前目录下的TODO文件,不包括子目录下的subdir/TODO/TODO#忽略build/文件夹build/下的所有文件#忽略doc/notes.txt,不包括doc/server/arch.txtdoc/*.txt#Ignoreall.pdffilesindoc/**/underdoc/directory由于*.pdf代码重构等原因导致的撤销需要做一些局部优化。一次提交上传的不同文件有不同的处理要求,进行撤销是为了让提交记录更容易阅读和区分。语法:gitreset--mixed[/HEAD~n>]命令:gitreset--mixedHEAD~1命令执行后,查看文件变更记录,如下图:changedfiles都没有添加到暂存区,commit和add的操作都被撤销了。因个人疏忽等原因造成的撤销,要求将完全错误的不应该提交的内容提交到仓库,需要撤销。语法:gitreset--hard[/HEAD~n>]命令:gitreset--hardHEAD~1命令执行后查看文件变更记录,如下图:Trackedfile更改内容消失,commit和add操作撤销,本地跟踪内容修改撤销;未跟踪的内容将不会更改。从上面的效果可以看出,文件的修改会被撤销,需要在--hard模式下谨慎操作。(6)撤消本地分支合并在实际操作中,总会有很多干扰,导致我们把不该合并的分支合并到目标分支上。有两种方法可以解决这个问题,gitreset和gitrevert。reset的语法和命令前面已经介绍过,不再赘述。revert的语法和命令与reset一致。但实际产生的效果会有所不同。大家可以先看看revert操作的实际效果。合并分支后的效果如下图:撤消合并:语法:gitrevert命令:gitrevert700920下图是执行命令后的效果:前后对比后可以看出执行revert后,会在原来的记录上增加一条commit记录。reset上面“本地文件撤销”例子中提到的,会删除已有的提交记录,而在合并分支中,会删除原合并分支的记录。回归是不同的。它会保留原来合并分支的记录,并为其添加一条commit记录,以便在必要时仍能回到revert之前的状态。从提交到远程分支的角度来看,reset可以销毁尸体,防止别人发现我们误合并了分支;revert会在远程提交记录上显示合并的分支和撤回记录。从代码撤销后仍然需要合并的角度来看,revert可以实现多分支合并后,仍然只能撤销合并分支的内容;reset需要使用gitreflog命令重置为第一个内容的commit-id没有报错,然后一个一个合并(前提是这些分支的合并需要按顺序)。也就是说,需要合并多个分支。如果一个合并的分支在运行过程中修改了内容,revert仍然可以合并修改前的所有分支,reset只能合并修改前的某个分支。(7)恢复被误删除的本地分支本地分支被拉出后,由于一些疏忽被误删除,导致本地分支没有同步到远程分支。这时候想恢复本地分支。误删的分支是feature/delete。使用gitreflog命令查看仓库下的所有历史操作,如下图所示:语法:gitcheckout-b命令:gitcheckout-bfeature/deleteHEAD@后{2}命令执行后,分支恢复到HEAD@{2}的快照,即从master分支拉取feature/delete分支的内容,提交“newxxxfile”依旧missing,直接将文件内容恢复到最新提交,使用命令gitreset--hardHEAD@{1}达到硬覆盖本地工作空间内容的目的。gitreflog命令获取的内容是本地仓库发生的所有变化。它可以称为恢复工具。可以向前追溯,也可以向后调整。充满了时间的痕迹。..(8)不确定哪个分支有自己提交的commit。工作中经常会遇到一个场景。我在一个分支中修改了一些东西并提交了它。因为版本顺序等问题,先后合并到各个分支。后来发现是提交的修改有问题,需要查看整个项目,找出哪个分支对这次提交有用,然后修复。需要先确定有问题的提交的commit-id:然后查看所有的本地分支:可以看到有4个本地分支,本地分支的数量不受人为控制,不宜直接删除使用状态的树枝,树枝数量达到一定程度,一次搜索一个树枝不太现实。Git提供了一个命令,可以直接通过commit-id找出内容所在的分支。语法:gitbranch--contains命令:gitbranch--contains700920命令执行后可以看到下图包含问题commit的分支,可以轻松修复相应分支上的内容。小结本文介绍了实际工作场景中可能出现的几种异常情况及解决方法。希望对大家有所帮助。如有不足之处敬请指正。其实Git操作对应的工具已经有很多可以使用了。需要了解的是Git命令行中的哪条命令相当于工具中的每一个操作,结果会是什么,以免出现不必要的错误。