简介并在需要的时候查找答案。1.必备知识点WarehouseRemote:远程主仓库;Repository:本地仓库;Index:Git跟踪树,暂存区;workspace:本地工作区(也就是你编辑器的代码)2.gitadd提交到暂存区,出错了怎么办一般的代码提交流程是:工作区->gitstatus查看状态->git添加。将所有改动添加到暂存区->gitcommit-m"commitdescription"将代码提交到本地仓库->gitpush将本地仓库代码更新到远程仓库场景一:Workspace当你乱了一个内容工作区中的文件,想直接放弃工作区中的修改,使用命令gitcheckout--file。//放弃对工作区的修改gitcheckout--<文件名>场景二:暂存区当你不仅把工作区的一个文件内容弄乱了,还用gitadd把它添加到暂存区时,你想放弃修改,分为两步第一步使用命令gitresetHEAD回到场景1,第二步按照场景1操作。//撤销暂存区的修改(unstage),然后放回工作区。gitresetHEAD<文件名>3、gitcommit提交到本地仓库时,出现错误怎么办?1.commit信息错误,将commit信息改成gitcommit--amend-m"newcommitmessage"2.commitmiss时,commit的partialupdatemissed。两种解决方法:方案一:再次提交gitcommit-m"commitmessage"此时git上会有两次提交方案二:缺失的文件提交到上一次提交gitaddmissed-file//missed-file就是缺失的提交filegitcommit--amend--no-edit--no-edit表示commitmessage不会改变,git上只有一个commit3.提交错误的文件,回滚到之前的commit版本,然后commitgitreset到deletethespecifiedcommit//modifyRepository,reservedthetemporarystoragearea,reservedtheworkarea//软回滚一个版本的版本库,软回滚是将本地版本库的所有头指针重置为指定版本,并且此提交后的所有更改都将移至暂存区。gitreset--softHEAD~1//修改版本库,修改暂存区,修改工作区//将版本库还原一个版本,不仅将本地版本库的头指针全部重置为指定版本,还要重置暂存区,将工作区代码回滚到这个版本。gitreset--hardHEAD~1//git版本回滚,回滚到具体的commit_id版本,可以通过gitlog查看commit历史,这样就可以确定要回滚到哪个版本(commit后的那个)是身份证);gitreset--hardcommit_idgitrevert撤消一个操作,这个操作前后的commit和history会被保留,这次revocation会被认为是最新的提交example:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定版本,撤销也会保存为commit。gitrevertcommitgitrevert是提交新版本,反向修改需要revert的版本内容,版本会递增,不影响之前提交的内容。gitrevert和gitreset的区别是在commit之前用一个新的commit回滚,gitreset是直接删除指定的commit。在回滚操作方面,效果类似。但是以后继续合并旧版本的时候就不一样了。因为gitrevert是用reversecommit来“中和”之前的commit,所以以后合并老分支的时候,这部分的变化就不会再出现了,而gitreset是删除某个分支上的一些commit,所以当再次与旧分支合并时,这些回滚的提交仍然应该被引入。gitreset是将HEAD后移,gitrevert是将HEAD前移,但是新commit的内容与要revert的内容正好相反,可以抵消要revert的内容。四、常用命令1、初始开发git操作流程克隆最新的主分支项目代码gitclone地址创建本地分支gitbranch分支名查看本地分支gitbranch查看远程分支gitbranch-aswitchbranchgitcheckout分支名(一般修改andnotsubmitted则不能切换,case问题经常出现,可以强制切换gitcheckout分支名-fnot一定要慎用)将本地分支推送到远程分支gitpush:2.gitFetch抓取远程主机的更新,所有/branches返回本地(此时Repository更新),它抓取的代码对你本地的开发代码没有影响。如果你需要一个完整的更新,你需要合并或者使用gitpull3。gitpull拉取远程主机某个分支的更新,然后合并到指定的本地分支(相当于fetch的操作,具有合并分支的功能)4.gitpush将本地分支的更新推送到远程主机,其命令格式与gitpull类似5.分支操作使用Git下载指定分支。命令为:gitclone-b分支名仓库地址拉取远程新分支gitcheckout-bserverfixorigin/serverfix合并本地分支gitmergehotfix:(将hotfix分支合并到当前分支)合并远程分支gitmergeorigin/serverfix删除本地分支gitbranch-dhotfix:(删除本地hotfix分支)删除远程分支gitpushorigin--deleteserverfix上传新命名的本地分支:gitpushoriginnewName;新建分支:gitbranchbranchName:(创建一个名为branchName的本地分支)切换到新分支:gitcheckoutbranchName:(切换到branchNamebranch)创建并切换分支:gitcheckout-bbranchName:(相当于合并以上两条命令)查看本地分支:gitbranchview远程仓库所有分支:gitbranch-a重命名本地分支:gitbranch-moldNamenewName重命名远程分支对应的本地分支:gitbranch-moldNamenewName将修改后的本地分支与远程分支关联:gitbranch--set-upstream-toorigin/newName五、优化操作1.拉取代码pull--rebase在组队过程中,假设你和你的同行在本地都有自己的新提交,你的同行领先于你将代码推送到远程分支,所以必须先执行gitpull获取同伴的提交,然后才能将自己的提交推送到远程分支。按照Git默认的策略,如果远程分支和本地分支之间的commitlinegraph有分叉(也就是不快进),Git会进行merge操作,从而产生无意义的commit记录,导致像上图这样的混乱。其实在pull操作的时候,使用gitpull--rebase选项可以很好的解决上面的问题。添加--rebase参数的作用是,如果提交线图中出现fork,Git会使用rebase策略,而不是默认的merge策略。假设在执行pull之前提交线图是这样的:A---B---Cremotes/origin/master/D---E---F---Gmaster如果执行gitpull,则提交折线图会变成这样:A---B---Cremotes/origin/master/\D---E---F---G---Hmaster导致H的不必要的提交记录。如果执行gitpull--rebase,提交线图会变成这样:remotes/origin/master|D---E---A---B---C---F'---G'master将两次提交通过rebase在C中重新组装后复制代码FG,去掉多余的fork,达到目的。总结大多数时候,gitpull--rebase是用来让提交的线图更好看,方便codereview。但是,如果你对git的使用不是很熟练,我的建议是多练习几次后使用gitpull--rebase,因为rebase在git中被认为是一种“危险行为”。另外需要注意的是,使用gitpull--rebase比直接pull更容易引起冲突。如果预计冲突比较多,建议直接pull。注意:gitpull=gitfetch+gitmergegitpull--rebase=gitfetch+gitrebase2。合并代码merge--no-ff上面的gitpull--rebase策略的目的是修剪提交线图,使其形成一条直线,而即将到来的gitmerge--no-ff策略恰恰相反,故意使提交行映射分叉。假设你要在本地合并两个分支,而这两个分支正好是fast-forward,那么直接合并后你会得到一个直线commitlinegraph。当然这样也没什么坏处,但是如果你想更明确的告诉同行:这一系列的投稿都是为了同一个目的,所以你可以特意把这次投稿做成投稿线图的分叉。执行gitmerge--no-ff的结果大概是这样的:中间的分叉线图很清楚地表明,这些提交都是为了彻底调整用户域和标签。我的习惯是,在合并分支之前(假设你想将feature分支合并到本地的dev分支),你会先检查feature分支是否“部分落后于”远程dev分支:gitcheckoutdevgitpull#Updatethedevbranchgitlogfeature。.dev如果没有输出提交信息,则说明该特性是为dev分支更新的。如果有输出马上执行gitmerge--no-ff,提交线图会变成这样:所以在合并之前,我一般会执行:gitcheckoutfeaturegitrebasedev这样feature可以重新拼接成更新后的dev,然后就可以合并了,最后得到一个干净舒服的commitlinegraph。再次提醒:如前所述,rebase是一种“危险行为”。建议你只有在熟悉git的情况下才这样做,否则得不偿失。总结使用gitpull--rebase和gitmerge--no-ff其实和直接使用gitpullgitmerge是一样的代码。使用gitpull--rebase的主要目的是扁平化提交图,而gitmerge--no-ff是故意创建分叉。6.SSH1。检查SSH公钥是否生成$cd~/.ssh$lsid_rsaid_rsa.pubknown_hosts其中id_rsa为私钥,id_rsa.pub为公钥。2.如果没有,开始生成,设置全局的user.name和user.email设置user.name和user.email,如果没有,去set//设置全局的user.name和user.email即可(或者ssh-keygen-trsa-C"email")$ssh-keygenGeneratingpublic/privatersakeypair.Enterfileinwhittosavethekey(/Users/schacon/.ssh/id_rsa):Enterpassphrase(emptyfornopassphrase):Entersamepassphraseagain:Youridentificationhasbeensavedin/Users/schacon/.ssh/id_rsa.Yourpublickeyhasbeensavedin/Users/schacon/.ssh/id_rsa.pub.Thekeyfingerprintis:4。Getthepublickeycontentaftergeneration,inputcat~/.ssh/id_rsa.pub,copyssh-rsauntil.local一整段内容$cat~/.ssh/id_rsa.pubssh-rsaAAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSUGPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XAt3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/EnmZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbxNrRFi9wrf+M7Q==schacon@agadorlaptop.local5。打开GitLab或GitHub,点击头像,找到设置页6.左侧找到SSH密钥点击并点击,输入刚复制的公7.暂存gitstash可以用来暂存当前正在进行的工作。比如你想pull最新的代码但是不想commit,或者为了修改一个紧急的bug,先stash回到你上次的commit,改完bug后,stashpop会继续原来的工作;添加缓存栈:gitstash;查看缓存栈:gitstashlist;启动缓存堆栈:gitstashpop;取出具体的缓存内容:gitstashapplystash@{1};八、文件名太长错误Filenametoolongwarning:Clonesucceeded,butcheckoutfailed.-globaluser.email"email"10..gitignore更新后生效:gitrm-r--cached.gitadd.gitcommit-m".//github.com/InterviewMap/InterviewMap.git2,上游仓库获取分支和相关提交信息,会保存在本地upstream/mas第三分支gitfetchupstream#remote:Countingobjects:75,done.#remote:Compressingobjects:100%(53/53),done.#remote:Total62(delta27),reused44(delta9)#Unpackingobjects:100%(62/62),done.#从https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY#*[newbranch]master->upstream/master3,切换到本地master分支gitcheckoutmaster#Switchedtobranch'master'4,将upstream/master分支合并到本地masterbranch,本地master分支与上游仓库保持同步,本地修改不丢失gitmergeupstream/master#Updatinga422352..5fdff0f#Fast-forward#README|9------#README.md|7++++++#2fileschanged,7insertions(+),9deletions(-)#deletemode100644README#createmode100644README.md5,上传到自己的远程仓库gitpush