第1章 Git&GitHub(命令行的操作方式)

一、版本控制介绍

1、 目前主流版本控制工具

 SVN : 集中式版本控制工具的代表

Git : 分布式版本控制工具的代表

 

2、Git&GitHub_为什么要使用版本控制

协同修改

     多人并行不悖的修改服务器端的同一个文件。

数据备份

     不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态。

版本管理

     在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空间,提高运行效率。

        这方面 SVN 采用的是增量式管理的方式,

        而 Git 采取了文件系统快照的方式。

权限控制

     对团队中参与开发的人员进行权限控制。

     对团队外开发者贡献的代码进行审核——Git 独有。

历史记录

     查看修改人、修改时间、修改内容、日志信息。

     将本地文件恢复到某一个历史状态。

分支管理

     允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。

 

 

二、版本控制简介

1、版本控制

工程设计领域中使用版本控制管理工程蓝图的设计过程。在 IT 开发过程中也可以使用版本控制思想管理

代码的版本迭代。

 

2.2版本控制工具

思想:版本控制

实现:版本控制工具

 

集中式版本控制工具:

CVS、SVN、VSS……

 

分布式版本控制工具:Git、Mercurial、Bazaar、Darcs

 

 

三、Git 简史

 

1、Linu系统版本控制历史

1991年

       Linus本人手动合并代码

2002年

      使用 商业软件:Bitkeeper

      BitKeeper的东家  BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。但是要求不能进行破解。

2005年

     Linux社区无法向商业公司那样对参与开发者进行强有力的约束

     开发Samba的Andrew试图破解BitKeeper的协议,被BitMover公司发现,要回收Linux社区的免费使用权

     因此 Linus自己用C语言开发了一个分布式版本控制系统:Git     

     主体程序开发完成只用了两周,一个月后Linux系统代码管理有Git管理

2008年

GitHub上线很多开源项目都迁移至上面:

jQuery、PHP、Ruby、……

 

 

 

2、Git 官网和 Logo

 

官网地址:https://git-scm.com/

 

3、Git 的优势

 大部分操作在本地完成,不需要联网

 完整性保证

 尽可能添加数据而不是删除或修改数据

 分支操作非常快捷流畅

 与 Linux 命令全面兼容

分布式的版本控制相对于集中式的版本控制的优点式,有效的避免了单点故障问题

(单点故障是:当远程服务器损坏了,那相应的版本历史数据,就没有了,如果拿其他人的代码在上传就当前版本就以上传的版本为基准,以前的历史数据就没有了)。

 

 

4、Git 安装

https://git-scm.com/

去下载如下exe应用双击运行

Git-2.19.1-64-bit.exe

 

5、Git概念

 

6、Git 和代码托管中心

代码托管中心的任务:维护远程库

 局域网环境下

    GitLab 服务器

 

外网环境下

     GitHub  https://github.com/

    码云    https://gitee.com/

 

 

7、本地库和远程库

(1)、 团队内部协作

 

 

 

(2)跨团队

 

 

 

 

四、Git 命令行操作

 

1、本地库初始化

    命令: 初始化创git创库: git init

    效果

 

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

 

 

2、设置签名

形式

    用户名:tom

    Email 地址:goodMorning@atguigu.com

作用:区分不同开发人员的身份

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

命令

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

         git config user.name tom_pro

         git config user.email goodMorning_pro@atguigu.com

         信息保存位置:./.git/config 文件

 

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

         git config --global user.name tom_glb

         git config --global goodMorning_pro@atguigu.com

         信息保存位置:~/.gitconfig

 

在当前用户的家目录下的.gitconfig   :   cd ~

 

     级别优先级

         就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名

         如果只有系统用户级别的签名,就以系统用户级别的签名为准

         二者都没有不

 

 

 

 

3、基本操作

(1)状态查看

git status

查看工作区、暂存区状态

 

 

(2)添加

git add [file name]

将工作区的“新建/修改”添加到暂存区

 

删除暂存区的文件 git rm --cached goot.txt

 

给vim设置行号  :set nu

 

 

(3) 提交

git commit -m "commit message" [file name]

将暂存区的内容提交到本地库

 

(4)查看历史记录

git log

多屏显示控制方式:

    空格向下翻页

    b 向上翻页

    q 退出

 

git log --pretty=oneline

 

 

git log --oneline  (只能显示以前的记录)

 

 

git reflog    (显示全部的记录)

HEAD@{移动到当前版本需要多少步}

 

 

(5)前进后退

 本质

 

 基于索引值操作[推荐]

     git reset --hard [局部索引值]

     git reset --hard a6ace91

 

 使用^符号:只能后退

     git reset --hard HEAD^ 

      注:一个^表示后退一步,n 个表示后退 n 步

 

只显示指定行的内容: tail -n 3 goods.txt

 

 

 使用~符号:只能后退

     git reset --hard HEAD~n

     注:表示后退 n步

 

 

(6) reset 命令的三个参数对比


当我们想要查看一个命令的用法时可以打开git的文档查看,使用命令为:

git help [命令]

git help reset

 

 

 --soft 参数

     仅仅在本地库移动 HEAD 指针

 

 

 

 --mixed 参数

     在本地库移动 HEAD 指针

     重置暂存区

 

 

 --hard 参数

     在本地库移动 HEAD 指针

     重置暂存区

     重置工作区

 

 

(7) 删除文件并找回


     前提:删除前,文件存在时的状态提交到了本地库。

git reset --hard  :重置到当前指针(它拿到本地库的指针,将暂存区和工作区都重置到和本地库的指针一样的位置)

 

        查看位置:  git reflog

     操作:git reset --hard [指针位置]

             删除操作已经提交到本地库:指针位置指向历史记录

             删除操作尚未提交到本地库:指针位置使用 HEAD

 

 

(8)比较文件差异


    git diff [文件名]

            将工作区中的文件和暂存区进行比较

 

和本地库进行比较:

git diff HEAD aa.txt

 

    git diff [本地库中历史版本] [文件名]

            将工作区中的文件和本地库历史记录比较

和 本地仓库的前一个版本比较: git diff HEAD^   aa.txt

 

    不带文件名比较多个文件(不指定文件名,默认当前文件全部比较)

 

 

 

添加到暂存区的删除文件找回

git reset --hard :   刷新暂存区,和工作区

 

 

4、分支管理


 

(1)什么是分支?

在版本控制过程中,使用多条线同时推进多个任务

 

 

(2)分支的好处?

 同时并行推进多个功能开发,提高开发效率

 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。

 

 

(3)分支操作

 

 创建分支

    git branch [分支名]

 查看分支

    git branch -v

 切换分支

    git checkout [分支名]

 

 合并分支

     第一步:切换到接受修改的分支(被合并,增加新内容)上

        git checkout [被合并分支名]

 

     第二步:执行 merge 命令

        git merge [有新内容分支名]

 

 解决冲突

     冲突的表现

 

没有产生额外的文件

 

 

 冲突的解决

     第一步:编辑文件,删除特殊符号

     第二步:把文件修改到满意的程度,保存退出

     第三步:git add [文件名]

     第四步:git commit -m "日志信息" 

             注意:此时 commit 一定不能带具体文件名

 

 

 

五、 Git 基本原理


 

1、哈希

 

哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下

几个共同点:

①不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。

②哈希算法确定,输入数据确定,输出数据能够保证不变

③哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大

④哈希算法不可逆

Git 底层采用的是 SHA-1 算法。

哈希算法可以被用来验证文件。原理如下图所示:

 

Git 就是靠这种机制来从根本上保证数据完整性的

 

 

2、Git 保存版本的机制


 

(1) 集中式版本控制工具的文件管理机制

        以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基文件

和每个文件随时间逐步累积的差

 

 

(2)Git 的文件管理机制

 

Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前的全部文件制作一个快照并保存这

个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的

文件。所以 Git 的工作方式可以称之为快照流。

 

 

 

 

(3) Git 文件管理机制细节

 

     Git 的“提交对象"

提交对象及其父对象形成的链条

 

 

 

 

3、Git 分支管理机制


 

(1)分支的创建

 

 

(2) 分支的切换

 

 

 

 

 

六、GitHub


 

1、账号信息

        GitHub 首页就是注册页面:https://github.com/

登录到GuiHub

 

2、创建远程库

 

 

 

 

3、创建远程库地址别名


git remote -v 查看当前所有远程地址别名

git remote add [别名] [远程地址]

 

 

4、推送


    git push [别名] [分支]

在推送的过程中会有登录界面弹出,登录即可

 

 

5、克隆


命令

    git   clone   [远程地]

 

 效果

     完整的把远程库下载到本地

     创建 origin 远程地址别名

     初始化本地库

 

 

小知识:

在git bash 中执行

设置记住密码(默认15分钟):

git config –global credential.helper cache

 

如果想自己设置时间,可以这样做:

git config credential.helper ‘cache –timeout=3600’

这样就设置一个小时之后失效

 

长期存储密码:

git config –global credential.helper store

 

 

6、团队成员邀请

 

 

 

关于记住密码的原因:

http 本身没有记住密码的功能,能记住密码是因为window系统中的凭据。

如果要输入其他gitHub账号需要删除凭据才能再次登录。

 

 

 

7、拉取


     pull=fetch+merge

     git fetch [远程库地址别名] [远程分支名]

     git merge [远程库地址别名/远程分支名]

     git pull [远程库地址别名] [远程分支名]

 

注: pull = fetch+merge

 

 

 

8、解决冲突


 

 

 

 要点

     如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。

     拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。

 

 

9、跨团队协作


 

 Fork


如果想要一个项目功能想要外人帮助就需要借助git的跨团队协助的功能

1、需要将项目的clone 地址给你帮助你的那个人

2、让帮助你的那个人访问你的项目,然后点击 fork

 

 

正在fork...

 

fork 完成

 

 本地修改,然后推送到远程


 

 

 

 Pull Request


1、

 

 

2、

 

3、外来协助者提交,给项目的所有者审核。

 

 

 

 

 

 

4、 项目所有者的操作

 

 

5、如果有疑问gitHub上还可以发消息,询问对方

 

 

 

6、对代码进行审核

 

 

 

7、合并代码

 

 

 

添加合并的日志信息:

 

 

 

 

8、将项目所有者将远程库的代码拉取到本地

 

 

 

10、SSH 登录


 进入当前用户的家目录

    $ cd ~ 

 

 删除.ssh 目录

    $ rm -rvf .ssh

 

 运行命令生成.ssh 密钥目录

    $ ssh-keygen -t rsa -C atguigu2018ybuq@aliyun.com

    [注意:这里-C 这个参数是大写的 C]

 

 进入.ssh 目录查看文件列表

    $ cd .ssh

    $ ls -lF

 

 查看 id_rsa.pub 文件内容

    $ cat id_rsa.pub

 

 复制 id_  rsa.pub 文件内容,登录 GitHub,点击用户头像→Settings→SSH and GPG

    keys

 

 New SSH Key

 

 

 

 

 输入复制的密钥信息

 

 回到 Git bash 创建远程地址别名

        git remote add origin_ssh git@github.com:atguigu2018ybuq/huashan.git

 

 推送文件进行

admin@DESKTOP-L1ORG9F MINGW64 ~
$ cd ~

admin@DESKTOP-L1ORG9F MINGW64 ~
$ rm -rvf .ssh

admin@DESKTOP-L1ORG9F MINGW64 ~
$ ssh-keygen -t rsa -C 675015048@qq.com
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/admin/.ssh/id_rsa):
Created directory '/c/Users/admin/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/admin/.ssh/id_rsa.
Your public key has been saved in /c/Users/admin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:E67n8hLzq5XNffuX56FgU0M6CML1x32BdYj7Z6zlwtA 675015048@qq.com
The key's randomart image is:
+---[RSA 2048]----+
|       .     .o+.|
|    . . . . o.. o|
|     o ... o + . |
|      ....o + .  |
|        S. o = . |
|      o. = .+ E =|
|      .++ o+.o.B.|
|      o+. . o.=o=|
|      .=+.   ..+=|
+----[SHA256]-----+

admin@DESKTOP-L1ORG9F MINGW64 ~
$ cd .s
.soapuios/    .spyder-py3/  .ssh/         .SwitchHosts/ .swt/

admin@DESKTOP-L1ORG9F MINGW64 ~
$ cd .s
.soapuios/    .spyder-py3/  .ssh/         .SwitchHosts/ .swt/

admin@DESKTOP-L1ORG9F MINGW64 ~
$ cd .ssh/

admin@DESKTOP-L1ORG9F MINGW64 ~/.ssh
$ ll
total 5
-rw-r--r-- 1 admin 197121 1679 10月 21 15:56 id_rsa
-rw-r--r-- 1 admin 197121  398 10月 21 15:56 id_rsa.pub

admin@DESKTOP-L1ORG9F MINGW64 ~/.ssh
$ cat  id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMr8N3zpLEBpLy+IbrpZ2kz2ywaeIz2AeKVEIi2zzNnsy+AeCdlLjooEZ9tW6dfQHjBTrEMCS3KXM5oSX+rEx7jL9aGmYFAfwbqZdxfeipQKUUMKE0K1UN+jz7Mn800pS+p0sR5P9SiUco/GLAhGVvbRMAVwmfwg1Tqyn3ZpAjD4MsG7sDpJJDcRYJbhdRRuU+CBK0WeXWEq4H1E4ozzfC2Br1THQBAvUQ4FBCLFV1OCKYPORYJb2vy5TluJugVyoV2Wj+7XVVru5CwxjAgA0C9NLKJmYXs6cZwM94xvN3AOsxs9Zx423q2+CSs7gp/6nj226Nxu9sfRfkyi09RqAJ 675015048@qq.com
admin@DESKTOP-L1ORG9F MINGW64 ~/.ssh
$ cd f:/Git/

admin@DESKTOP-L1ORG9F MINGW64 /f/Git
$ cd huashan

admin@DESKTOP-L1ORG9F MINGW64 /f/Git/huashan (master)
$ vim huashanjianfa.txt

admin@DESKTOP-L1ORG9F MINGW64 /f/Git/huashan (master)
$ git commit -m " test ssh login" huashanjianfa.txt
[master 4eed0a3]  test ssh login
 1 file changed, 8 insertions(+), 9 deletions(-)
 rewrite huashanjianfa.txt (88%)
admin@DESKTOP-L1ORG9F MINGW64 /f/Git/huashan (master)
$ git remote  add origin_ssh git@github.com:yaojun1234/huashan.git

admin@DESKTOP-L1ORG9F MINGW64 /f/Git/huashan (master)
$ git remote -v
origin  https://github.com/yaojun1234/huashan.git (fetch)
origin  https://github.com/yaojun1234/huashan.git (push)
origin_ssh      git@github.com:yaojun1234/huashan.git (fetch)
origin_ssh      git@github.com:yaojun1234/huashan.git (push)

admin@DESKTOP-L1ORG9F MINGW64 /f/Git/huashan (master)
$ git push origin_ssh master
The authenticity of host 'github.com (192.30.253.112)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added 'github.com,192.30.253.112' (RSA) to the list of known hosts.
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 276 bytes | 276.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:yaojun1234/huashan.git
   0787145..4eed0a3  master -> master

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值