作者及其背景:仔姜,大三学生,幼儿园英语水平,熟系Linux文件基本操作(最基础的)
文章内容或许有些疏漏之处还望各位大佬见谅,如果构成侵权或出现其他问题,请联系我邮箱:zhaozijiang_yjt@163.com,如果需要更全的知识请移步廖老师Git教程
学习内容来源:廖雪峰Git教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
感谢廖雪峰老师提供的教程
-----------------一直没有更新,主要有两个借口,一是最近在学廖雪峰老师的JavaScript教程,碰上了好多不懂的地方,慢慢的填坑,二是懒,自己原本是写在笔记本上的,回头来看,感觉笔记有些多,工程量有些大,就一直在拖-__-|||-------------------------------------------------------------------------------------------------------------------------
正文开始:
远程仓库:
1、注册GitHub——全球最大的互联网同性交友平台[滑稽]
2、设置SSH Key:
(1)查看本地用户主目录是否存在.ssh目录(即文件夹),若存在,则再次查看该目录下是否存在id_rsa和id_rsa.pub,若依然存在,则直接跳至下一步,若.ssh目录不存在,则打开shell(Windows下则打开Git Bash),使用命令行创建SSH Key:$ ssh-keygen -t rsa -C "your Email @ example.com"然后一路回车,使用默认值即可
注:id_rsa文件内容为私钥,不可泄漏;id_rsa.pud文件为公钥,可以告知任何人
3、登陆GitHub,打开“Account Settings”,“SSH Keys”页面;点击"Add SSH Key",填上Title,在Key文本框中粘贴id_rsa.pud文件内容;点击"Add Key",就可以看到已添加的key。
注:Git支持SSH协议,所以只需知道公钥就可确认只有您才可推送。GitHub支持多个Key。GitHub免费托管的Git仓库,任何人都可以看到,不宜放入敏感信息。若不想被他人所看,① 缴纳费用,让GitHub将自己的仓库变为私有的,② 自己动手搭一个Git服务器
添加远程仓库
1、登陆Git,点击"Greate a new repo",创建一个新的仓库
2、在Repository name 填入“Learngit”,其他保持默认设置,点击“Create repository”,成功创建一个新的Git仓库
3、$ git remote add origin git@github.com:michaelliao/learngit.git
注:添加后,远程仓库的名字就是origin,这是git默认的叫法,也可以修改为其他名字
4、$ git push -u origin master #将当前master上的本地库推送到远程仓库
由于远程仓库是空的,加上-u参数后,Git不但会把本地的mater分支内容推送至远程新的master分支,还会将本地的master分支和远程的master分支关联起来,在以后的推送或拉取时可以简化命令
在本地做了提交后:$git push origin master #将本地分支的最新修改推送至GitHub
SSH警告
当第一次使用Git的clone或push命令连接GitHub时,会得到一个警告:
The authenticity of host \'github.com (xx.xx.xx.xx)\' can\'t be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
输入"yes"回车,Git会输出一个警告,告诉您已将Github的Key添加至本机的一个信任列表里了
从远程仓库克隆
前置背景:从零开发,只有GitHub
回到现在:① 登陆GitHub,创建新仓库,命名为"gitskills",勾选’Initialize this repository with a README.md‘(GitHub会自动创建一个README.md文件)
② $git clone git@github.com:michaelliao/gitskills.git
注:Git支持多种协议,包括https,但通过SSH支持的原生git协议速度最快
分支管理
创建与合并分支
1、$ git checkout -b dev # git checkout加上-b参数表示创建并切换,相当于 $git brach dev && $git checkout dev
2、$ git branch #查看所有分支,*标记当前分支
3、对"readme.txt"进行修改 $git add readme.txt $git commit -m brance test
4、切换至master $git checkout master $cat readme.txt
5、合并dev分支到master分支 $git merge dev #git merge 用于合并指定分支(dev)到当前分支(master) $cat readme.txt #Fast-forward信息中Git告知此次合并为"快进模式"
6、删除dev分支:$git branch -d dev 查看branch:$git branch
解决冲突
前置背景:1、$git checkout -b featurel
2、修改readme.txt
3、$git add readme.txt && $git commit -m "AND simple"
4、$git checkout master
5、修改readme.txt
6、$git add readme.txt && $git commit -m "& simple"
7、$git merge featurel #发生了冲突
回到现在:1、$git status #告知冲突文件
2、$vi readme.txt #使用vi查看readme.txt--冲突文件
3、修改为"Creating -a new branch is quick and simple
4、$git add readme.txt
5、$git commit -m conflict fixed
6、$git log --graph --pretty=oneline --abbrev-commit #查看分支合并情况
7、$git branch && $git branch -d featurel
分支管理策略
前置背景:一般合并分支时,Git可能会使用Fast forward模式,但是这样的模式下,删除分支后,会丢弃分支信息,若想从分支历史上看到分支信息,其中一个有效有效办法就是禁用Fast foward模式,禁止后Git会在merge时生成一个新的commit
回到现在:1、创建并切换dev分支:$git checkout -b dev
2、修改readme.txt,并提交一个新的commit:$git add readme.txt && $git commit -m ”add merge“
3、切换回master:$git checkout master
4、合并dev分支,请注意--no-ff参数,表示禁用Fast forward:$git merge --no-ff -m "merge with no-ff" dev # -m参数的作用是把commit描述写入
5、合并后进行查看:$git log --graph --pretty=oneline --abbrev-commit
分支策略:实际开发中,应按照以下基本原则进行分支管理:
1、master分支应保持稳定,应仅用来发布新版本,平时不宜在上面工作
2、dev分支应是不稳定的,宜在dev分支上进行工作
3、版本发布时再将dev合并到master上
Bug分支
策略思想:软件开发中,出现bug是常有的事,为不影响开发,可通过一个新的临时分支来修复bug,修复后进行合并分支,然后将临时分支删除。
前置背景:当你接到一个修复一个代号101的bug任务时,你想创建一个分支issue-101来修复它,此时dev上的工作还未提交,并不是你不想提交,而是工作进行到一半,还不能提交,预计完成还需要一天时间,但是必须在两个小时内修复bug,怎么处理?
回到现在:1、git提供了stash功能,可以将当前工作现场储存起来,待以后在进行恢复工作:$git stash && $git status #查看工作区
2、确定在那个分支上修复bug,此处假定在master分支上修复:$git checkout master && $git checkout -b "issue-101"
3、修复bug:将Git is free software:\'\'改为”Git is a free software……“ $git add readme.txt && $git commit -m "fix bug 101"
4、修复完成后,切换至master分支,完成合并,删除issue-101分支:$git checkout master && $git merge --no-ff -m ”merge bug fix 101" issue-101
5、回到dev分支继续工作:$git checkout dev && $git status
6、查看工作现场位置:$git stash list
7、恢复dev的方法:1)、使用 git stash apply 恢复,但恢复后,stash内容并不删除,需要手动 git stash drop 删除 2)、使用 git stash pop 恢复的同时,把stash内容也删除了:$git stash pop && $git stash list #查看是否含有隐藏工作现场
注:可以多次stash进行隐藏,恢复时先使用 git stash list 查看,然后恢复想恢复的stach:$git stash apply stash@{0}
Feature分支
策略思想:软件开发需要添加一个新功能时,会因为一些实验性的代码将主分支搞乱,所以每添加一个新功能时,应新建一个feature分支进行工作,完成后合并,删除该feature分支
前置背景:现在,您接到一个开发代号为Vulcan的新功能
回到现在:1、$git checkout -b feature-vulcan #准备开发
2、开发完毕后:$git add "vulcan.sh" && $git commit -m "add feature - vulcan"
3、切回dev,准备合并:$git checkout dev
突发状况:接到上级命令,因经费不足,新功能必须取消,就地销毁:
$git branch -d "feature - vulcan"
error: The branch \'feature-vulcan\' is not fully merged.
If you are sure you want to delete it, run \'git branch -D feature-vulcan\'.
销毁失败 -__-|||
解决方法:因为feature-vulcan分支没有合并,如果删除,会丢失修改 -_-||,所以直接强行删除即可:$git branch -D feature-vulcan
多人协作
当我们从远程仓库克隆时,实际上Git自动把本地的master分支与远程库的master分支对应起来了,并且远程仓库的默认名称是origin:$git remote #查看远程库信息 || $git remote -v #显示更详细的信息
注:如果没有推送权限,无法查看push的地址
推送分支:
即将目前工作的分支上的所有本地提交到远程库:$git push origin master #推送master分支的本地至远程仓库 || $git push origin dev #推送dev分支下的本地至远程仓库
有哪些分支需要推送?
master分支时主分支,需要时刻与远程同步;dev是开发分支,团队所有成员都需要在上面工作,所以也需要远程同步;bug分支只用于本地修复bug,没有必要推送至远程,除非老板要求;feature分支是否推送至远程,取决您是否与你的小伙伴在上面开发。总之在Git中分支是否推送,决定权在于您
抓取分支:
多人协作时,大家会往master和dev分支推送各自的修改:
1、克隆:$git clone git@github.com:michaelliao/learngit.git
注:从远程库clone时,默认情况下只能看到master分支
2、查看分支:$git branch
3、若在dev分支开发,就必须创建远程origin的dev分支到本地:$git checkout -b dev origin/dev #创建本地dev分支
4、此时可以在dev分支上进行修改,是不是将dev分支push至远程:$git add env.txt && $git commit -m "add env" && $git push origin dev
突发状况:您的小伙伴已经向origin/dev分支推送了他的提交,而碰巧您也做了修改并试图推送:$git add env.txt && git commit -m "add new env" && $git push origin dev
To github.com:michaelliao/learngit.git
! [rejected] dev -> dev (non-fast-forward)
error: failed to push some refs to \'git@github.com:michaelliao/learngit.git\'
推送失败,因为您小伙伴的最新提交与您试图推送的提交有冲突
解决方法:使用Git将最新提交从origin/dev抓取下来,然后在本地合并,解决冲突,再推送:$git pull
状况再次出现:git pull失败情况,因为本地dev分支与远程origin/dev分支的链接没有被指定
解决办法:$git branch --set-upstream-to=origin/dev dev ,再pull:$git pull 此次pull成功,但合并有冲突需要手动解决,解决方法与分支管理中的解决冲突完全一样。解决后,提交,在pull:$git status && $vi env.txt && $git add env.txt && $git commit -m "merge & env.txt"
所以多人协作的工作模式通常是这样的:
1、试图用git push origin <branch - name>推送自己的修改
2、若推送失败,则因为远程分支比你的本地更新,需要用git pull试图合并;
3、如果合并有冲突或者解决冲突后,再用git push origin <branch - name>推送就能成功
如果git pull 提示 no tracking information,则说明本地分支和远程分支关系链接没有创建,用命令 git branch --set-upstream-to <branch - name> origin/<branch - name>