当前位置: 首页 > 科技观察

git使用杂记

时间:2023-03-14 15:07:52 科技观察

前言作为一个开发者,如果你还不知道git或者还不知道如何使用git,那你就该反思一下了。自己去好好看看入门介绍吧。今天就简单介绍一下我在日常生活中使用git的一些常用命令,以及我认为不错的,可以提高我们办公效率的命令。内容可能有点乱,但绝对是经典命令。在此记录一下,希望对前来露脸和关心的你有所帮助。Areas在此之前,先介绍一下git的三个区域:工作目录、阶段索引、本地历史区域(history)。你可以通过一张图简明扼要地了解它们之间的转换。clone最早是从clone命令引入的,用过git的都知道。gitcolne命令拉取远程仓库到本地。但是当我们要拉取到指定的文件夹时,可以直接mkdir,其实不需要这个,一条命令就可以得到gitclone远程仓库的文件名,就这么简单。rm我们在工作中可能会遇到这样的情况,使用gitadd直接将工作区中所有修改过的文件添加到暂存区,但是后来发现有一个不应该添加的文件,这个时候我们可以使用以下命令将文件返回到工作区。gitrm--cachedstash有这样的情况。你在开发的时候,有一个紧急的在线bug需要修复。此时正在开发的功能还没有完成,不想提交。这时候,你可以使用gitStash将工作区中的所有文件存储起来。这时候就可以放心的剪分支修复bug了。修复后,执行gitstashpop,将之前存储的取出来。当然还有一些其他的相关命令比如:gitstashlist查看存储的记录,gitstashdrop丢弃存储的记录。tag可能我们在开发的时候需要给gittagtagName打上标签,把对应的tag推送到远程仓库。这时候我们可以使用如下命令进行推送。gitpush--tagstagNameamendcommit的时候发现上次commit没有添加一个文件,或者修改了一些文件。此时您不想添加新的提交信息,您只想将其添加到上次提交中。这时候可以使用gitcommit--amend将暂存区的文件加入其中,同时也可以修改commit信息。resetreset也可以达到之前rm的效果,可以用下面的命令代替之前的gitrm--cached命令gitresetHEAD但是reset更通用,结合soft参数可以回滚对任意commit节点进行操作gitreset--softindex执行该命令后,返回索引,工作区不变,暂存区返回当前索引。还有一个硬参数。gitreset--hardindex和soft可以说是对立的。它的作用在于工作区和暂存区的区别,它会清空这两个区。Rebase表示重定向到rebase。如果你当前分支和远程分支的commit信息有差异,会提示你此时不能push。commit前必须先拉取远程commit信息到本地。在这种情况下,您可以使用rebase命令。如下,当前在开发分支时,执行完后应该先执行rebase命令gitfetchgitrebaseorigin/master,最后推送到远程mastergitpushoriginmaster。每个分支的最终情况就是上图的效果。如果觉得命令比较难记,也可以用一个命令完成上面的效果gitpull--rebaseoriginmaster这是rebase的一个简单应用,也是一个常用的命令。下面介绍rebase的一个可选参数--onto。--onto使用场景:在开发过程中,我们会创建不同的分支来开发不同的功能。当你在分支A上新建分支B开发功能,提交一些commit的时候,你会发现原来的分支A上有一个错误的commit。如果你想rebase到master,你不能附加这个错误的提交。这个时候,就到了--onto大显身手的时候了。目前在B分支,要得到上面的结果,只需要执行下面的命令gitrebase--ontomasterB这样既可以针对不同的分支,也可以作用于同一个分支。因此,针对上述情况,只能经营B分店。等价的命令如下:gitrebase--ontoB--interactive当我们要修改commit信息的名称时,如果我们要修改commit在第一个的时候,就可以使用gitcommit--修改。如果不是第一种,我们会使用rebase的--interactive可选参数,可以简写为-i。gitrebase-i参数后面的commithashcode是需要修改的上一个commit。执行后会出现如下类似信息:pick137cf0aFirstcoommitpick163dc38Secondcommit#Rebasef9aee6e..163dc38ontof9aee6e(2command(s))##Commands:#p,pick=usecommit#r,reword=usecommit,buteditthecommitmessage#e,edit=usecommit,butstopforamending#stop,squash=usecommit,butmeldintoppreviouscommit#f,fixup=like"squash",butdiscardthiscommit'slogmessage#x,exec=runco??mmand(therestoftheline)usingshell##这些行可以重新排序;它们是从上到下执行的。#Notethatemptycommitsarecommentedout根据提示我们可以有6个可选动作。相信提示已经说的很明显了。对于我们想要修改第一个提交的情况,我们需要使用r。r137cf0aFirstcommitpick163dc38Secondcommit执行后,会跳转到修复Firstcoomit的界面,修改即可。Firstcommit#Pleaseenterthecommitmessageforyourchanges.Linesstarting#with'#'willbeignored,andaemptymessageabortsthecommit.##Date:ThuJan2623:07:102017+0800##rebaseinprogress;ontof9aee6e#Youarecurrentlyeditingacommitwhilerebasingbranch'master'on'f9aee6e'.###Changestobemitted1:#Changestobemitted于操作项,有兴趣的可以自己试试。例如,s操作可用于合并提交。branch相信branch对它很熟悉,这里要说的是他可能会用到的另一种情况。场景是这样的:如果你不想在创建新分支时从当前提交信息节点创建分支。要达到上述效果,只需要后面在创建分支的时候额外添加一个参数即可。该参数为您需要转移的commit节点的哈希码gitbranchnew_branchpush。就是设置上游分支。当我们将远程不存在的本地分支推送到远程时,如果不在推送的分支上,我们一般使用如下命令进行推送。gitcheckoutpush_branchgitpushoriginpush_branch下面是一个简洁的方法。使用该参数不需要切换分支,直接使用如下命令推送即可。gitpush--set-upstreamoriginpush_branchcherry-pick命令的场景是:当你所在的分支没用了,你想删除它,但你仍然想将其中一个提交推送到远程master。将分支切换到master,执行如下命令:gitcherry-pickmerge我们很熟悉使用merge来合并分支。每次使用merge的时候,它会自动将子分支合并成一个commit并推送到master分支,然后如果我不想自动推送到主分支(可能需要修改),那么我就可以使用--squash来操作gitmerge--squashdev_branch执行完上面的命令后,我们就可以在暂存区看到一个还没有提交的文件的状态。reflog当我们过于频繁地剪切分支时,我们可能会忘记某些分支是从哪个分支剪切的。Atthistime,wecanusethefollowingcommandtocheck:{2}:commit:committodo6876e5bHEAD@{3}:checkout:movingfromblowup_sun_for_ransomtosolve_world_hunger6876e5bHEAD@{4}:checkout:movingfromkill_the_batmantoblowup_sun_for_ransom6876e5bHEAD@{5}:checkout:movingfromcure_common_coldtokill_the_batman6876e5bHEAD@{6}:commit(initial):initialcommit这样我们就可以看到所用的操作历史。这样如果我们不小心用gitreset命令删除了我们需要的东西。您可以使用它来找到删除操作的哈希码,然后您可以使用以下命令恢复它。gitcheckout目前能想到的就这些了,希望能帮到你