借笑傲江湖学习Git,让Git不在枯燥乏味,还能让你笑傲Git

       git是用于Linux内核开发的版本控制工具。与CVS、Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。git的速度很快,这对于诸如Linux内核这样的大项目来说自然很重要。git最为出色的是它的合并追踪(merge tracing)能力。因此学习Git是很有必要的!

Git的优势

  • 大部分操作本地完成,不需要联网
  • 完整性保证
  • 尽可能添加数据而不是删除或修改数据
  • 分支操作非常快捷流畅
  • 与Linux命令全面兼容

Git的安装

       想要使用这么一个工具我们必须要安装Git工具,网上已经有很多关于Git安装的详细步骤,这里推荐一篇写的很详细的Git安装的详细教程(基于Windows版本的)

Git的结构

Alt

本地库和远程库

       为了更好更形象的描述本地库与远程库的关系,我借鉴了B站老师的金庸小说《笑傲江湖》谈Git来方便大家理解。
       有一个经理叫岳不群,手下有一个程序员叫令狐冲。某一天岳不群创建了一个本地库,为了能把本地库托管到远程,因此岳不群在代码托管中心创建了一个远程库,但是远程库是没有内容的,因此岳不群通过千里传送将本地库的内容推送(push)到远程库。岳不群觉得的自己的领悟能力不够,练习不了辟邪剑法。于是决定把如何炼成辟邪剑法推送给令狐冲让令狐冲来完成。令狐冲作为大弟子谨遵师命,令狐冲远程库克隆(clone)工程自己的本地库,当然克隆的同时也顺带把自己的本地库给初始化好了。经过一番努力令狐冲终于参悟了这本武功秘籍,在自己本地库的基础上进行修改,写了详细的注意事项以后提交到本地库,然后再通过自己本地库提交到远程库,但是岳不群对令狐冲设有防线(远程库是岳不群创建的),因此令狐冲不能直接提交本地库到远程库,令狐冲需要通过push来加入团队。令狐冲提交完成以后,岳不群通过pull拉取令狐冲的远程修改到自己的本地,这样就能实现团队内的协助操作。
Alt
       某一天,岳不群发现辟邪剑法不香了,想研究葵花宝典。于是语重心长对令狐冲说:“冲儿啊!为师最近喜得武功秘籍一部,鉴于你上次表现还不错,为师决定借你看看这本武功秘籍。过几天为师会来问你领悟到的精髓的”。令狐冲很开心的收下了宝典,通宵看了两夜也没有一点启发。想着过几天师傅就要检查了,这不行得想想办法。于是,令狐冲想到了日月神教的东方姑娘(东方不败)让东方不败来帮助自己参悟。令狐冲找到东方姑娘,表明了来意,东方姑娘怎么会拒绝呢?当然豪爽的就答应了!
       岳不群和令狐冲有自己的本地库,同时岳不群也有自己的远程库。东方不败为了帮助令狐冲,她将岳不群的远程库复制(fork)了一份,生成了一个新的和岳不群的远程库内容相同的远程库,然后她将这个复制的远程库下载到本地(clone),经过大量的修改后,再将自己的本地库的内容上传(push)到自己复制的远程库。东方不败想着帮兄弟就要帮到底,随后她向岳不群的远程库发送了一个拉起(pull request)的请求,经过岳不群的审核通过后。发现原来如此,毫不犹豫的将东方不败提交的内容进行合并(merge)了。然后,令狐冲和岳不群就可以从岳不群创建的远程仓库拉取(pull)东方不败提交的内容了。这样也就实现了团队外的协助操作了!
Alt

本地库初始化

  • 进入一个空的文件夹目录,鼠标右键打开git bash
  • 输入命令 git init,会发现创建一个.git的隐藏文件
  • 通过ls -la查看当前文件下是否生成的隐藏文件
  • 通过命令 cd .git/进入该隐藏的文件夹

注意:.git目录中存放的是本地库相关的子目录和文件,不要删除,也不要乱改动

设置签名

       作用:通过用户名和Email地址来区别不同开发人员的身份。

       辨析:这里设置的签名和登录远程库的(代码托管中心)的账号、密码没有任何关系。

       命令:
              项目级别/仓库级别:仅仅在当前本地库范围有效

git config user.name '用户名'
git config user.email '用户邮箱'

              信息保存目录:.git/.config

              系统用户级别:登录操作系统的用户范围

git config --global user.name '用户名'
git config --global user.email '用户邮箱' 

              信息保存目录:~/.gitconfig

              级别优先级:就近原则

  •               项目级别优于系统级别,两者都有时,采用项目级别签名
  •               如果只有系统用户签名,就以系统用户签名为准
  •               二者都没有不允许

基本操作

  • 状态查看操作
git status#查看工作区、暂存区状态
  • 添加操作
git add 'file name'#将工作区的 新建/修改 添加到转存区
  • 提交操作
git commit -m "commit message"#将暂存区的内容提交到本地库
  • 查看历史记录操作
git log#查看历史提交参数

git log --pretty==oneline#漂亮的显示历史记录

git log --oneline#更简洁的显示历史记录信息

git reflog#会提示回到之前的版本需要移动多少步指针

多屏幕显示方法:

空格:向下翻页
b:向上翻页
q:退出
  • 前进后退

        本质:移动HEAD指针

        一、索引值法:
        ① 先查看记录对应的索引值
在这里插入图片描述
        ②在通过命令到相关的记录

git reset --hard '对应的索引值'

        二、其它方法

git reset --hard HEAD^ #向后移动一步
git reset --hard HEAD^^ #向后移动两步
git reset --hard HEAD^^^ #向后移动三步

git reset --hard HEAD~1 #向后移动1步
git reset --hard HEAD~n #向后移动n步

        使用 ^ 和~只能实现版本的后退,并且后退几步就有几个该符号(^)。通过以上比较发现还是索引值法比较方便

  • reset命令的三个参数对比
参数 作用
- -soft 仅仅在本地库移动HEAD指针
- -mixed 本地库移动指针的同时重置缓存区
- - hard 本地库移动HEAD指针,同时重置暂存区和工作区
  • 删除文件并找回
           前提:删除前,文件存在时的状态提交到本地库
           因为Git进行操作时只会增加版本,而不会删除任何一个版本。因为历史记录没有删除,所以只要本地库没有删除就是可以退回到之前版本的。依旧是通过命令git reset --hard '相关版本的索引值'
  • 比较文件差异
git diff [文件名] #将工作区中的文件和暂存区进行比较

git diff [本地库历史版本][文件名]#将工作区的文件和本地历史记录进行比较

#不带文件名,可以比较当前工作区的所有文件

分支管理

  • 分支概念
           在版本控制中,使用多条线同时推进多个任务。
           在初始化本地库之后,本身会创建一个master分支(主干),某一天突然想重新创建一个新的功能,但是不想在master分支上进行开发(不想对它造成污染)。我创建了一个新的feature_blue分支来进行开发,创建时是从master分支复制过来的。另外,我又想开发一个功能。因此,我又创建了另外一个分支(feature_game)。会发现每个分支都是彼此独立的,各自向前开发,如果不合并各个分支之间是不会有任何影响的。如果在开发过程中遇到了bug,那么就需要及时进行修复bug。这个时候就又需要创建另一个hot_fix修复分支
    在这里插入图片描述
  • 分支操作
操作 命令
创建分支 git branch '分支名'
查看分支 git branch -v
切换分支 git checkout '分支名'
合并分支 ①使用git checkout [被合并分支名]切换到接受修改的分支上②执行git merge [有新内容的分支名]

分支冲突:

       我在给master分支下创建提交了一个hello.py文件文件内容如下:

print('hello world')
print('hello python')
print('中国')edit by master

       我在给git_fix分支下也修改了hello.py的内容如下:

print('hello world')
print('hello python')
print('中国')edit by git_fix1

       但是当我将master分支合并到git_fix分支时会出现以下问题:
Alt
       当我再打开hello.py文件时就发现了冲突的表现
在这里插入图片描述
       解决冲突:
       ① 编辑文件,删除特殊符号
       ② 把文件修改到自己满意的程度,保存退出
       ③ git add [文件名]
       ④ git commit -m ‘日志信息’
       注意:使用git commit -m提交合并后的文件时,一定不能带具体的文件名
       分支管理的本质是创建和移动指针

Git基本原理

  • 哈希
    哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
    ①不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定(16个字节)
    ②哈希算法确定,输入数据确定,输出数据能够保证不变
    ⑧哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
    ④哈希算法不可逆
    Git底层采用的是SHA-1算法
    哈希算法可以被用来验证文件。原理如下图所示:
    Alt
  • Git版本数据管理机制
           Git把数据看作是小型文件系统的一组快照。每次提交更新时Git都会对当前的全部文件制作-个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再重新存储该文件,而是只保留一“个链接指向之前存储的文件。所以Git的工作方式可以称之为快照流。

本地库和远程库的交互

  • 创建本地库
    岳不群为了广大门楣,打开一个新的文件夹,给文件里创建了一个yuebuqun.txt的文件夹,文件夹内容如下:
壮大华山,称霸武林!

       创建完成以后添加到暂存区,然后再提交到远程库

  • 创建远程库
    Alt
    Alt
    在这里插入图片描述
  • 本地创建远程库别名
    在这里插入图片描述
    然后通过git remote -v命令查看
  • 推送本地库到远程库
    通过命令git push new_git master推送本地库到远程库,需要输入github的账户和密码,然后点击Login,再进入远程库就看到了相关内容!
    在这里插入图片描述
  • 从远程库克隆项目
    ①完整的把远程库下载到本地
    ②创建new_git远程地址别名
    ③初始化本地库
    命令:git clone [远程地址]

SSH免密登录

① 进入当前用户家目录 $ cd~
② 运用命令生成.shh密钥目录
       $ ssh-keygen -t rsa -C ‘对应的邮箱’(注意:参数-C是大写的
③进入.ssh目录查看文件列表
       $ cd .ssh
       $ ls -lF
④查看id_rsa.pub文件内容
       $ cat id_rsa.pub
⑤复制id_rsa.pub文件内容,登录GitHub,点击头像——Settings——SHH and GPG keys
⑥New SHH Key
⑦输入复制的密钥信息
⑧回到Gitbash创建远程地址别名
       git remote add new_git_ssh ‘对应的SSH链接’
Alt

       不积小流无以成江河,不积跬步无以至千里。而我想要成为万里羊,就必须坚持学习来获取更多知识,用知识来改变命运,用博客见证成长,用行动证明我在努力。
       如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论” “收藏”三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那我祝你开心每一天,欢迎下次再来!
Alt

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章