git分阶段了解学习
git看起来很棒
git我个人理解,管理的是改变和历史,能将不同的版本有条理有顺序的进行系统的管理。比起svn必须选择从中央服务器取得最新版本改完再送回去的这种方式(它必须要有网)更适合随时随地管理。
git安装
这里笔者使用的是windows系统,仅对windows做出说明,mac不甚了解,linux一贯的命令安装非常简便容易。
官网下载文件,全部默认安装即可,安装完毕打开git bash窗口,类似命令行。
这里需要做一个处理,在命令行输入:
$ git config --global user.name "Your Name"$ git config --global user.email "email@"
global参数是此机器所有仓库(repository)都会使用这个name和邮箱。也可以分开对每一个仓库指定,后续需要我再进行补充。
创建版本库
$ mkdir learngit//创建版本库$ cd learngit//进入版本库 $ pwd //显示当前目录\1\learngit
我已经建立过仓库了在这里。 接下来通过git init命令把这个目录变成Git可以管理的仓库
已经建立过了因此提示已经存在。
里面会有一个.git文件,千万不要修改,手贱的在下改完就把库破坏了。
注意:1.只能跟踪文本文件,就算是图片也只能跟踪大小等别的不知道。 2.建议使用notepad++,这个设置默认使用UTF-8编码,windows记事本有点弱智的,理由就不说了,建议谷歌了解。
把一个文件放进git仓库非常简单,两步走:①用命令 git add告诉仓库,我要添加了【实质这里添加的是缓存区】②然后用git commit告诉仓库,我要添加啦【这里才会提交到仓库】
先在刚才建立的仓库的目录(工作区)下创建一个eg:readme.txt
然后使用刚才的命令
【unix哲学,没有消息就是好消息ORZ】
这里做一个说明:git commit后面的-m是为此次提交做的一个说明,这个要认真写,方便做管理。你也可以不写,就是容易被人骂。
注意:add一次只能添加一次,commit可以一次添加多个。
版本管理回退
status和diff
这一部分主要是教大家学会及时后悔及时止损。
上一部分我们提交了一个readme文件,现在对readme进行一个修改,随便什么修改吧:比如下面
git创建库第二部分git管理版本更迭改变等。
然后运行 git status可以查看结果:
上面说明readme.txt已经被修改过了但是还没准备提交的修改。
如果这里你忘记上次的修改了,可以用一个命令
git diff
可以看到我直接把之前的文件清了换了两句话。
那提交啦。
提交完再次看一下仓库当前状态,working tree clean 没有要提交的修改,而且工作目录干净。
最后一个总结吧:git status查看工作区状态,如果有文件被修改那么git diff查看修改内容。
版本回退
每次修改到一定程度,就应该保存一下,类似一个快照,就是git中叫做commit的东西,一旦文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作。很完美啊朋友们。
第一个命令git log 告诉我们文件历史记录
这个显示从最近到最远的提交日志,昨天自己试了很多次所以看起来很多记录
如果增加一个参数 --pretty=oneline
这样就只有版本号及当时补充的具体版本备注啦
这些commit id 和svn不一样,具体为啥请想想它是一个分布式,将来用的人特别多,是用某种方法计算出来的一个很大的数字。
接下来回退版本,需要知道两个东西:当前版本id和上一个版本id。使用git reset --hard 上一个版本id!
查看一下readme现在的内容
ok回到上一个我自己练习的版本了。
新的问题来了,想要回去刚才被回退的版本,这个很简单还是用刚才的命令,只要刚才的窗口没关,找到对应的commit id就可以。没必要写全,写几位就可以,git自动去找。
look,又是最开始建立的文件了。
补充一句,git内部有一个只想当前版本的HEAD指针,回退版本时候,仅仅把HEAD从指向上一个版本改为指向现在这个版本,然后把工作区文件更新了,仅仅是一个定位。
OK。又一个新问题,如果我把窗口关了,找不到被回退的那个commit id了怎么办。
一个简单的操作,我们目的是要找到这个版本的commit id就可以。git提供了一个命令:git reflog用来记录命令。
我现在关掉我的git bash(也可以用git cmd没大区别,但是感觉bash好用嘿嘿)
OK总结一下:改换版本需要commit id,git log查看提交历史,git reflog 查看命令历史。
管理修改
这个前提先理解暂存区的定义,即理解git add和git commit 的操作对象及目的。自己百度吧少年们。
git diff HEAD – readme.txt可以查看工作区和版本库里面最新版本的区别。那现在我对readme做一个修改,增加一行:管理修改 然后使用命令
确实没有被提交。继续愉快git add 然后commit吧
撤销修改
人难免有困的时候以及冲动的时候,想想B站开源泄露出来的备注。。。
假设不小心在提交文件中增加了一行
提交前 你忽然发现了这个愚蠢的错误可能会被某人小心眼了,那么我们需要纠正它,可以删掉最后一行,手动把文件恢复到上一个版本状态。
一个可爱的命令:git checkout – readme.txt 可以把文件在工作区的修改全部撤销。两种情况:①readme修改后还没被放到暂存区,现在撤销就直接回到版本库状态。②已经添加到暂存区后,又作了修改,现在撤销就回到添加到暂存区后的状态。总之就是让文件回到最近一次git commit或git add时的状态
①还没放暂存
②放了
注意这个命令中的-- 没有这个,就i按成了分支管理-切换分支的命令。
其实如果还没commit还可以用resed HEAD 把暂存修修改撤销重新放回工作区,HEAD表示最新的版本。丢弃工作区修改又到了刚才的那部分checkout --了朋友。那到了版本库呢,就reset版本库吧。。。但是前提是还在本地版本库。
总结:1)版本库撤销:回退版本 2)暂存区丢弃:reset HEAD file 然后回退到工作区:再用checkout – file 丢弃。
删除文件
先添加一个新文件test.txt到git并提交。
如果要从版本库中删除文件,用命令git rm test.txt 然后commit提交这个改动
如果是不小心删错了,OK你还可以checkout找回呀,一键还原。只是你会丢失最近一次提交后你修改的内容。慎重吧。
远程仓库
杀手级功能了算是。无聊的话也可以自己在一台电脑上搞几个远程库玩,但是但无聊了没必要ORZ,在此不做赘述。
实际情况一般会找一台电脑充当服务器,24h持续on,其他人从服务器克隆一份到自己电脑上,各自把提交推送到服务器仓库,或者拉去别人的提交。
自己使用无隐私的管理可以使用github,注册一个账号,获得免费git远程仓库。
注意:由于本地库和github仓库之间的传输是ssh加密,需要进行设置:1)创建SSH Key。检查主目录user下有无.ssh目录,目录里是否有id_rsa和id_rsa.pub文件。如果没有打开git bash创建:ssh-keygen -t rsa -C “邮箱” 一路回车就行,无需密码。pub文件是公钥可告诉别人,另一个是私钥。2)登陆github 打开acconut settings ➡ SSH Keys页面,add SSH Key,任意写title文本框粘贴pub内容。click add key。
这个SSH Key用来给github识别出推送的提交是你推送的,github支持ssh协议,所以公钥用来确认你的身份。
再次注意:github开源,所有人可见。除非花钱。
添加远程库
在自己github账号上create a new repo。
自己看着就会的事我就不写了。
接下来把本地库和这个建立的库做一个关联,我在github建立的库也叫learngit
这里后面记得替换成你自己的账户名和远程库。这个origin是自己命名的远程库的名字,git默认叫法origin。
如果之前做了连接那先remote -v查看什么链接然后觉得没用用remote rm 远程名 删掉就好了。
接下来把本地库所有内容推送到远程库上:
实际上这是个把分支master推送到远程,由于远程库一开始是空的,因此加了-u参数,git不但会把内容推送过去还会把本地master分支和远程的master分支关联起来,以后可以简化操作命令。
图中出现了一个警告,问yes/no ssh连接在第一次盐城github服务器的key时,需要你确认github的key的指纹信息是否来自github的服务器,yes然后git输出warning告诉你我本机添加了这个key到信任列表里。以后不会有了。
然后去github页面查看
现在起只要做了提交,就可以直接git push origin master本地master分支修改推送过去。
从远程库克隆
这样我在github另创建了一个库叫test428,里面有一个github自动创建的README.md文件。接下来克隆这个库 git clone![在这里插入图片描述](https://img-/0428124428117.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E1MzE1MjUwNjQ=,size_16,color_FFFFFF,t_70)这样大家一起工作就可以进行了。
注意:git也支持https协议,直接把https地址粘过来也可以用。只不过每次推送都必须输入口令,而且速度慢。
分支管理
同时干俩项目这么理解,或者同时俩人干一个项目。
创建与合并
HEAD指向当前分支。利用这个特性操作分支。
首先创建一个test分支,然后切换到test分支
git checkout -b dev也可以用git branch dev
git checkout dev 第一个命令的-b函数就表示创建并切换。
查看当前分支
现在我们可以在test分支正常提交。
给readme增加一句:今天也是愉快的一天
然后提交
切回master
内容没变化,因为你提交到test了。
现在合并呀。
git merge合并指定分支到当前分支,这是fast-forward提交,贼快,别的遇到再说。用完了test分支想删可以删了就,用git branch -d test就行。
总结命令:
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d
解决冲突
准备一个新的分支 test2,把readme增加一行:又到了晚饭学习时光
在test2分支提交,然后切到master分支进行修改并提交
此时master和test2各自有新的提交,这种情况下无法执行快速合并,只能试图把进行合并,可能就会发生冲突。
用git status查看冲突的文件
然后看readme的内容
<<<<<======>>>>>>这些符号标出了不同分支的内容,提示你需要手动修改才能行。
手动把最后一行改到自己想要的东西。然后提交
冲突被解决了,也可以用git log --graph看情况。
最后删除多余分支
总结:git无法快速合并时,就先要手动解决(编辑为我们想要的内容)再提交。
用git log --graph可以看到分支合并图
分支管理策略
一般git用fast forward模式,但这种模式删除分支后会丢掉分支信息。如果强制禁用fast forward模式,git就会在merge是生成一个新的commit,这样分支历史可以看到分支信息。
–no-ff方式的git merge
自己建立一个分支做点修改提交,然后合并分支
本次合并会创造一个新的commit,所以加个备注描述。
查看分支历史
函数解释:-2 查看最近两次
-p 查看历史记录以来哪几行被修改
-oneline 查看历史提交日志,单行显示
-graph图形化
-pretty美化
等等很多,用的时候自己谷歌吧
这里有一句标准美化函数
git config --global alias.lg “log --color --graph --pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ --abbrev-commit” 这里可以参考git alias
总结:1)master分支是非常稳定的,一般仅用来发布新版本不干活,干活都在其他分支,一般叫dev,合并的时候往dev合并然后最后把dev合并到master发布版本就可以了。
3)加–no-ff参数啊,这样我们就能知道坏事谁干的了。。。
bug分支-临时储藏一半的工作
同上,有一个bug就建立一个新的临时分支修复,修复后合并,然后删除。
工作做到一半不能提交的时候,先储藏起来。
git stash
然后看工作区就是干净的。
假设在master分支做修复,在master做临时分支,
建立bug分支bug-01,做改动,提交呀,合并呀,删除bug分支呀。
回去干活回复被stash的现场。
用git stash list查看现场,恢复方法:1)git stash apply回复,stash内容没删除,用git stash drop删除。2)git stash pop 恢复同时删除stash内容
然后再看一次发现没内容了。
当然这里可以多次stash,然后恢复指定的stash内容,感觉超级好用这个地方。
常识
最后补充一点常识(我也是刚知道哈哈哈)
增加一个新功能的开发就应该新建一个feature分支,方便管理。如果要删除这个没做完的feature那么用-D参数强制删除,因为没被合并的分支只能强制啦,-d不行。查看远程库,git remote -v 有权限就可以看到push的地址。推送是要指定本地分支。master和dev需要同步。建立远程origin的dev到本地,用git checkout -b dev origin/dev。在dev作修改,然后把dev分支push到远程。如果两个人同时向远程库把改了的同样的文件做推送,那会失败,有冲突啦。那么就先把最新提交抓下来(git pull)在本地合并,解决冲突,再推送。如果pull也失败了,原因是没有指定本地分支与远程的链接,设置链接:git branch --set-upstream-to=origin master
最后总结一下多人工作:git push origin 分支名 推送修改,失败就git pull合并,如果合并冲突那就解决冲突本地提交,然后再提交。
如果pull提示no tracking information,那说明链接没有创建,创建啊姐妹们。
小操作
用git rebase 可以让七扭八歪的合并历史分叉变直。。变好看,做了一个整理。
暂时就这么多了,我觉得别的用的时候我可能会继续补充。有问题请评论区发问,每日必上。
如果觉得《分布式管理系统git的使用(初步)及笔者学习过程中遇到的问题及解决方法》对你有帮助,请点赞、收藏,并留下你的观点哦!