git分阶段了解学习

git看起来很棒

git我个人理解,管理的是改变和历史,能将不同的版本有条理有顺序的进行系统的管理。比起svn必须选择从中央服务器取得最新版本改完再送回去的这种方式(它必须要有网)更适合随时随地管理。

git安装

这里笔者使用的是windows系统,仅对windows做出说明,mac不甚了解,linux一贯的命令安装非常简便容易。
官网下载文件,全部默认安装即可,安装完毕打开git bash窗口,类似命令行。
这里需要做一个处理,在命令行输入:

    $ git config --global user.name "Your Name"$ git config --global user.email "email@example.com"

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

这里github.com后面记得替换成你自己的账户名和远程库。这个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-blog.csdnimg.cn/20190428124428117.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内容,感觉超级好用这个地方。

常识

最后补充一点常识(我也是刚知道哈哈哈)

  1. 增加一个新功能的开发就应该新建一个feature分支,方便管理。
  2. 如果要删除这个没做完的feature那么用-D参数强制删除,因为没被合并的分支只能强制啦,-d不行。
  3. 查看远程库,git remote -v 有权限就可以看到push的地址。
  4. 推送是要指定本地分支。
  5. master和dev需要同步。
  6. 建立远程origin的dev到本地,用git checkout -b dev origin/dev。在dev作修改,然后把dev分支push到远程。
  7. 如果两个人同时向远程库把改了的同样的文件做推送,那会失败,有冲突啦。那么就先把最新提交抓下来(git pull)在本地合并,解决冲突,再推送。
  8. 如果pull也失败了,原因是没有指定本地分支与远程的链接,设置链接:git branch --set-upstream-to=origin master
    最后总结一下多人工作:git push origin 分支名 推送修改,失败就git pull合并,如果合并冲突那就解决冲突本地提交,然后再提交。
    如果pull提示no tracking information,那说明链接没有创建,创建啊姐妹们。

小操作

用git rebase 可以让七扭八歪的合并历史分叉变直。。变好看,做了一个整理。
暂时就这么多了,我觉得别的用的时候我可能会继续补充。有问题请评论区发问,每日必上。

分布式管理系统git的使用(初步)及笔者学习过程中遇到的问题及解决方法相关推荐

  1. 使用git提交到github,每次都要输入用户名和密码的解决方法

    使用git提交到github,每次都要输入用户名和密码的解决方法 参考文章: (1)使用git提交到github,每次都要输入用户名和密码的解决方法 (2)https://www.cnblogs.co ...

  2. git使用报错:fatal: Couldn't find remote ref master的解决方法

    git使用报错:fatal: Couldn't find remote ref master的解决方法 fatal: Couldn't find remote ref master 翻译过来就是:致命 ...

  3. git使用报错: fatal: Couldn‘t find remote ref master的解决方法

    git使用报错: fatal: Couldn't find remote ref master的解决方法 参考文章: (1)git使用报错: fatal: Couldn't find remote r ...

  4. git使用报错:fatal: Couldn‘t find remote ref master的解决方法

    git使用报错:fatal: Couldn't find remote ref master的解决方法 参考文章: (1)git使用报错:fatal: Couldn't find remote ref ...

  5. git 中遇到的错误及解决方法

    ​ 1.git pull遇到错误:error: Your local changes to the following files would be overwritten by merge: 方法1 ...

  6. idea git拉取文件变蓝色,将蓝色变成白色的解决方法

    解决:git提交,IDEA中发现有的文件名变成蓝色,检查自己也没有更改代码,将蓝色变成白色的解决方法 1.在IDEA中下方打开Terminal,输入git status查看文件,回车后会发现显示的正是 ...

  7. 分布式管理系统Git工具的使用

    Git 与 GitHub不是一个东西,它俩是属于依赖关系. Hub就是社区的意思,也就是所有可以供展示的地方,当然它也为你提供了服务器存储的支持. 使用Git之前要有自己的GitHub账户和仓库 Gi ...

  8. 【git】报错unsafe repository xxx is owned by someone else解决方法

    git近期进行了版本升级,添加了新的目录安全限制.造成在进行git常规操作时,或在各类编辑器如VSCode中无法发现.git文件,报错: fatal: unsafe repository(xxx is ...

  9. git clone拉取过大的项目拉不下来的解决方法

    在地址后加上 –depth=1 depth用于指定克隆深度,为1即表示只克隆最近一次commit git clone xxx.git --depth=1

最新文章

  1. log函数 oracle power_数学函数
  2. 设置***遇到一个小问题
  3. npm 卸载_完全免费!GitHub发布软件包管理服务:NPM瑟瑟发抖
  4. 打印机打印网页不清晰_针式打印机不开机故障维修
  5. .net2.0 orm_Hibernate 4.3 ORM工具
  6. 最全Pycharm教程(10)——Pycharm调试器总篇
  7. script片段在前导致对下文的html元素引用失效
  8. 我学习的自定义ASP.NET分页控件
  9. 简单sql存储过程实例、储过程实战
  10. 基于图像的三维模型重建 ——双视角SFM
  11. 先手获胜逻辑题_宣布障碍塔挑战赛的获胜者和开源版本
  12. 第十一周项目1——二叉树算法验证(3) 中序线索化二叉树的算法验证
  13. 大星星学物联网概览篇-硬件
  14. 如何看待家长培训课?
  15. CDH主机网络接口似乎未以全速运行
  16. 【用过的抢票软件汇总】
  17. 云呐|固定资产盘点中,支持多种盘点方式(资产清查盘点)
  18. vijos 、洛谷 —— 珠心算测验(java实现)
  19. 体会视觉的震撼,从10亿光年到0.1飞米
  20. autocad 2021 mac中文版

热门文章

  1. Mybatis自学笔记进阶篇(ResultMap和Log4j)
  2. ocv特性_OCV是什么意思啊!!!
  3. VMware 16.2.3 Window 版本下载
  4. css怎么恢复清背景,如何清除css背景透明?
  5. 基础体温软件测试初学者,基础体温测试表
  6. Nature | 基因组定位涉及精神分裂症的基因和突触生物学
  7. un7.7:如何在IDEA中实现图片上传功能并将图片展示出来?
  8. 隐马尔可夫模型 实验报告
  9. linux c语言 格式化,格式化C语言命令indent
  10. FPGA设计中inout端口信号的仿真测试