• Git三剑客之基础部分


    git三剑客

    概要

    本篇文章基于极客时间中苏玲老师的《玩转git三剑客》完成

    课程资料:https://gitee.com/geekbang-courseware/Git-Learning

    一、Git基础

    安装Git

    **官方下载网址:**https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git

    • Windows:

      开 https://git-scm.com/download/win,下载会自动开始

    • Linux:

      centos等RPM发行版:sudo yum install git-all

      Ubuntu等Debian发行版:sudo apt install git-all

    • MacOS

      下载网址 https://git-scm.com/download/mac

      下载后解压安装包,双击bkg文件即可安装

    验证安装

    git --version

    配置信息

    配置user.name和user.email

    git config --global user.name ‘your_name’

    git config --global user.email ‘your_email’

    注意:这里的email是为了可以联系到你,当代码出现问题可以直接发邮件通知你

    config三个作用域

    • 配置config

      git config --local 只对当前仓库有效

      git config --global 对当前用户的所有仓库有效

      git config --system 对系统所有用户有效(极少用)

    • 显示config信息

      git config --list --local 如果当前位置没有创建git仓库,则会报错

      git config --list --global

      git config --list --system

    创建仓库&&local信息

    • 创建仓库

      mkdir git_project && git init git_project && cd git_project 创建一个新文件,用来学习git相关命令

    • 配置local信息

      git config --local user.name ‘owl’

      git config --local user.email ‘owl@163.com’

    • 对比local和global信息是否一致(结果明显不一致)

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2b55fgKL-1670468434100)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211100914631.png)]

    • 创建一个文件,将文件提交到根部

      echo ‘hello git’>> README.txt 创建README.txt文件,然后将hello git内容写入

      git add README.txt 将文件写入到暂存区

      git commit -m"add README.txt" 提交commit -m是描述信息

    • **git log:**查看log日志

      git log

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1PCzfUKT-1670468434101)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211100943859.png)]

    
    
    • 1
    footer{
      right: 0;
      bottom: 0;
      position: relative;
      padding: 10px 1rem 10px 0;
      margin-top: 50px;
      font-size: 0.7em;
      text-align: right;
    }
    
    footer p{
      margin-bottom:0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    简单认识工作区、暂存区

    该部分用到相关资料,在资料链接中可以获取。通过四次提交代码来不断完善一个静态页面,从而理解工作区暂存区

    1. 加入index.html和git-log
    2. 加入style.css
    3. 加入script.js
    4. 修改index.html和style.css
    1.生成git文件
    • 创建git文件&& 初始化git文件

      mkdir git_learning && git init git_learning && cd git_learning

      • 拷贝index.html和image文件到该目录下

        cp …/data_git/index.html.01 index.html

        cp …/data_git/images . -r

        浏览器打开:file:///home/user/git_learning/index.html 显示一下效果即为成功

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I2tNwTGJ-1670468434102)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101432337.png)]

      • 将文件提交到暂存区&& 提交代码到仓库

        git add index.html

        git add image/

        git commit -m “add index.html&&image”

      • 查看状态 && 查看log日志

        git status

        git log

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LrDfROwe-1670468434102)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101437479.png)]

    2.加入style.css
    • 拷贝文件到路径下

      mkdir styles

      cp …/data_git/styles/style.css.01 styles/style.css

      • 刷新界面即可看到页面变化

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u5F8YaVX-1670468434103)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101441231.png)]

    • 将代码添加到暂存区&& 提交到仓库 && 查看日志

      git add styles/

      git ci -m “add styles”

      git log

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R8tpYgE0-1670468434104)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101444168.png)]

    3.加入js文件
    • 拷贝文件 && 查看效果

      cp …/data_git/js -r .

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-muOJ5p0z-1670468434105)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101448276.png)]

    • 提交文件到暂存区&& 提交到仓库 && 查看日志

      git add js/

      git ci -m"add js"

      git log

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yNzn82z8-1670468434106)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101450824.png)]

    4.修改文件
    • 修改index.html文件,打开该文件,最后加入一下代码

      <footer>
      	<p>
              <a href="https://github.com/TTN-js/unforGITtable">参考项目01a>
          p>
      footer>
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 修改style.css文件,最后加入一下代码

      footer{
        right: 0;
        bottom: 0;
        position: relative;
        padding: 10px 1rem 10px 0;
        margin-top: 50px;
        font-size: 0.7em;
        text-align: right;
      }
      
      footer p{
        margin-bottom:0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
    • 提交代码(这里就不截图了,实现的效果是添加了参考文献,显示在页面右下角位置,自行测试吧)

      git add -u

      git ci -m"update code"

    重命名

    • git mv命令

      git mv README.txt README.md

      git ci -m"changh name" 改完名字记得提交

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sNNX6gd8-1670468434107)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101510593.png)]

    log-版本演进

    • 基本命令

      git log 查看当前分支提交日志

      git log --all 查看所有分支提交日志

      git log --online 查看简介的提交日志

      git log --n4 查看近四条日志

      git log --all --graph 查看所有分支提交日志,并且显示分支详情

    • 分支基本命令

      git branch -av 查看有哪些分支

      git checkout -b branch_name version_id 创建新分支:branch_name为分支名字,xxx为版本号,从哪个地方创建分支

      git branch -b branch_name realy_branch_name 这里-b后面跟着创建的分支名,以及基于哪个已存在的分支创建分支

      git branch -d branch_name 删除分支

      git checkout branche_name 切换分支

    • 部分演示

      [user@localhost git_learning]$ git log --oneline
      61c5e33 (HEAD -> temp) checkout index.html
      e956d0b add js
      391fdd0 add styles
      c39af74 add index.html && image
      
      • 1
      • 2
      • 3
      • 4
      • 5
      [user@localhost git_learning]$ git log --all --graph
      
      * commit 61c5e33d112e54759ff51dee9eb1fc744b5c5d50 (HEAD -> temp)
      | Author: ronghaili <ronghaili.work.com>
      | Date:   Fri Nov 11 10:22:56 2022 +0800
      | 
      |     checkout index.html
      |   
      | * commit dddb933a4d1a6f3ea483d406b203ce5e7434677f (master)
      | | Author: ronghaili <ronghaili.work.com>
      | | Date:   Thu Nov 10 15:09:40 2022 +0800
      | | 
      | |     changh name
      | | 
      | * commit 5ab7e21666d123e7ff63ea81eb18d8b650af0c81
      |/  Author: ronghaili <ronghaili.work.com>
      |   Date:   Thu Nov 10 15:08:16 2022 +0800
      |   
      |       add readmi
      | 
      * commit e956d0b4a585ef13255cdedd9b2a0199264b7e00
      | Author: ronghaili <ronghaili.work.com>
      | Date:   Thu Nov 10 14:49:51 2022 +0800
      | 
      |     add js
      | 
      * commit 391fdd0c1acc576f32fd12459ade35e5b89875ac
      | Author: ronghaili <ronghaili.work.com>
      | Date:   Thu Nov 10 14:43:36 2022 +0800
      | 
      |     add styles
      | 
      * commit c39af74c4a4e764da490f5070eaaddc3fffb14af
        Author: ronghaili <ronghaili.work.com>
        Date:   Thu Nov 10 14:36:45 2022 +0800
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35

    .git文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qmFGcNR9-1670468434108)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211111221046.png)]

    重点文件

    • config

      记录的是local的配置信息,可用于修改相关配置

    • HEAD

      记录的是指向当前分支的引用,具体内容在.git/refs文件加中

    • refs

      存放的是分支信息,分支中保存最新的commit对象

    • objects

      存放的是git对象信息

    查看命令

    git cat-file -t object_id 查看对象类型

    git cat-file -p object_id 查看对象内容

    git三大对象

    Git对象

    Git有三大对象:commit(提交对象)、tree(树对象)、blob(数据对象);所有对象都保存在.git/objects文件夹中

    • commit:是提交时的一个快照,记录着提交时的所有文件快照

    • tree:可以理解为一个文件夹,包含tree和blob对象

    • blob:一个具体文件,包含文件的内容

    注意:

    blob和自身文件名没有任何关系,只与文件内容相关,即文件相同在git中只有一份blob;

    在文件被存放在缓存区,就会自动生成一个blob对象。当进行commit提交,就会生成tree(如果提交存在目录的话)和commit对象

    分离头指针

    • 进入分离头指针

      git checkout version_id 使用版本号进入分离头指针

      [user@localhost git_learning]$ git checkout e956d0b
      注意:正在切换到 'e956d0b'。
      
      您正处于分离头指针状态。您可以查看、做试验性的修改及提交,并且您可以在切换
      回一个分支时,丢弃在此状态下所做的提交而不对分支造成影响。
      
      如果您想要通过创建分支来保留在此状态下所做的提交,您可以通过在 switch 命令
      中添加参数 -c 来实现(现在或稍后)。例如:
        git switch -c <新分支名>
      或者撤销此操作:
        git switch -
      
      通过将配置变量 advice.detachedHead 设置为 false 来关闭此建议
      
      HEAD 目前位于 e956d0b add js
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
    • 含义

      分离头指针状态就是 当前处于没有分支的状态;在这种状态下可以继续commit操作,对其他分支没有影响

    • 缺点

      在分离头指针状态下做的一些提交,当切换到新的分支后,有可能git会默认为垃圾清理掉

    • 应用场景

      想做一些尝试性的变更,这样可以随时丢弃掉,无需做其他操作,直接切换到新分支就可以

    • 进入分离状态,HEAD值指向commit引用

      [user@localhost git_learning]$ git cat-file -t 59daf57784
      commit
      
      • 1
      • 2
    • 离开分离头指针,同时保存提交记录,可以根据提示创建分支

      [user@localhost git_learning]$ git checkout master
      
      警告:您正丢下 1 个提交,未和任何分支关联:
        59daf57 Backgroud to green
      如果您想要通过创建新分支保存它,这可能是一个好时候。
      如下操作:
       git branch <新分支名> 59daf57
      切换到分支 'master'
      
      [user@localhost git_learning]$ gitk --all
      [user@localhost git_learning]$ git branch fix_css 59daf57
      [user@localhost git_learning]$ git branch -av
      
        fix_css 59daf57 Backgroud to green
      * master  dddb933 changh name
        temp    61c5e33 checkout index.html
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17

    HEAD && branch

    branch
    • 创建分支

      git branch -b branch_name realy_branch_name 这里-b后面跟着创建的分支名,以及基于哪个已存在的分支创建分支

    diff
    • 查看不同

      git diff version_id version_id

      git diff HEAD HEAD^ 这里的HEAD表示当前提交的信息,HEAD^表示他的上一次提交

    HEAD
    • 指向问题

      当处于分离头指针状态,HEAD指向一个commit对象

      当处于某个分支,HEAD指向某个分支,分支本质也是指向某个commit对象

    错误演示

    • 添加文件后直接commit

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6nrHHH76-1670468434110)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211100931640.png)]

    二、git应用场景

    删除分支

    • 普通删除

      git branch -d branch_name
      
      • 1
    • 强制删除

      git branch -D branch_name
      
      • 1

    commit–修改

    • 修改最近的commit
    git commit --amend
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n3VGV40G-1670468434111)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211151431784.png)]

    • 修改旧的commit

      使用的到的命令

      git rebase -i branch_id

    1. 首先查看log日志确认修改哪一个分支的commit
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cHsCpedL-1670468434112)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190911747.png)]

    2. 使用命令

      [owl@owl learning_git]$ git rebase -i 324c28046bdae
      
      • 1

      执行命令会弹出一下窗口个

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KRlbHzdm-1670468434112)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190914236.png)]

      这里我们将之前的commit信息:a update index.html 改为 update index.html,如下图

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vc23geEA-1670468434113)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190916085.png)]

      退出该窗口后,会弹出另一个页面,同样修改第一行commit的信息为最新的commit信息,然后退出就完成了commit的修改
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O0bq40WD-1670468434114)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190918870.png)]

    3. 修改commit后,除了commit信息发生了改变,其修改commit的分支到最新的分支的分支id也会变化,对比如下
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5pEu55GH-1670468434114)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190923938.png)]

    commit–整合

    • 连续多个合并为一个

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XuR7mN9a-1670468434115)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190933279.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7RsiIf1T-1670468434115)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190935030.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ai50bUUf-1670468434116)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190938860.png)]

      修改完输入 wq!退出

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6lC4A6BS-1670468434116)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190954824.png)]

    • 把间隔的几个commit整合到一起
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTBdQedc-1670468434117)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211191006089.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aTsqDHEP-1670468434117)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211191005229.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iwS5deXZ-1670468434118)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211191008189.png)]

    文件比较

    • 暂存区 VS HEAD

      git diff --cached

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2xwaw1WE-1670468434118)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211191021811.png)]

    • 暂存区 VS 工作区

      git diff

    • 比较某个文件的区别

      git diff – file_name --cached

    • 比较几个commit的差异

      git diff branch1_name branch2_name – file_name 比较两个分支中某个文件的差异

      git diff branch_id branch_i --file_name

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t9NYy3CA-1670468434119)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211211641920.png)]

    文件恢复

    • 暂存区恢复与HEAD一致

    git reset HEAD

    git reset HEAD – file_name

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Or6S5R7o-1670468434120)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211191728675.png)]

    • 工作区恢复与暂存区一致

    git checkout file_name

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R8CEGSdr-1670468434120)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211191734669.png)]

    消除最近几次提交

    git reset --hard 慎用

    正确删除文件

    • 方式一

      rm -rf file_name

      git rm file_name

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1UC6AztY-1670468434121)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211211646973.png)]

    • 方式二

      git rm file_name

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0CfK8aD1-1670468434122)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211211649581.png)]

    处理紧急任务

    临时保存修改中的git,处理完紧急任务恢复

    git stash 将临时修改隐藏起来

    git stash list 查看stash 中的记录

    git stash pop 将隐藏的文件取出来 同时删除该记录

    git stash apply 将隐藏的文件取出来 保留记录

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E2q89QVp-1670468434122)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211211658411.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f4hJYdFh-1670468434123)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211211658586.png)]

    无需提交文件

    创建文件.gitignore

    注意,如果是过滤文件夹的话,文件夹名后面需要夹/

    备份

    其他

    • git reset --hard

      比如我们想将暂存区的文件全部清理掉,可以使用该命令

      git reset --hard

      git ci -am"描述" 添加到暂存区&&提交到仓库

      特别注意,这命令是会清理掉暂存区所有文件,谨慎使用

      • 效果

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TKoynwF0-1670468434124)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101525002.png)]

    三、Git与GitHub

    注册GitHub

    配置公私钥

    • centos端

    检查是否存在.ssh文件

    cd ~/.ssh

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCqX0jKL-1670468434124)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211221939817.png)]

    生成一个新的公私钥

    ssh-keygen -t 4096 -C “you email”

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v03uuPWJ-1670468434125)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211221942872.png)]

    查看公私钥

    ls -la

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qZerzHjP-1670468434125)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211221943633.png)]

    获取公钥

    cat id_rsa.pub

    • github 端

      找到ssh添加key

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mL0FYCBP-1670468434126)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211221945502.png)]

    github创建个人仓库

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WATG1FFs-1670468434127)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211222033371.png)]

    本地仓库同步到GitHUb

    1. 添加远程版本库

    git remote add [name] [url] 添加远程版本库

    git remote -v 显示所有远程仓库

    git remote rm [name] 删除远程仓库

    name:自定义远程仓库名

    URL:远程ssh地址

    [owl@owl learning_git]$ git remote add origin git@github.com:PyGriffin/learning_git.git
    [owl@owl learning_git]$ git remote -v
    
    github	git@github.com:PyGriffin/learning_git.git (fetch)
    github	git@github.com:PyGriffin/learning_git.git (push)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.远端存在本地不存在的文件,首先要拉取远端的数据

    git pull origin

    git branch -av 显示线上线下所有分支

    git merge origin/master 合并master分支

    git push origin

    [owl@owl learning_git]$ git merge origin/master
    
    自动合并 README.md
    冲突(添加/添加):合并冲突于 README.md
    自动合并失败,修正冲突然后提交修正的结果。
    [owl@owl learning_git]$ vi README.md 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    YOLOv5、YOLOv8改进:Decoupled Head解耦头
    人工神经网络与神经网络,人工神经网络基本概念
    Ionic list - ion-item的相关用法
    CUDA中的函数执行空间说明符
    Linux标准IO和文件IO
    springBoot全局异常定义
    121. 买卖股票的最佳时机
    windows 下 vs code 格式化代码(clang-format)
    元宇宙场景技术实践|实现“虚拟人”自由
    深度学习知识点
  • 原文地址:https://blog.csdn.net/py_xiaoguaishou/article/details/127816550