zoukankan      html  css  js  c++  java
  • Git知识体系笔记

    2020-03-07

    关键字:


    1、有关Git的配置

    Git在使用之前必须要先配置一下简单的个人信息:

    git config --global user.name 'your_name'
    git config --global user.email 'your@email.com'

    这个配置的主要目的是为了标识提交记录,甚至在某些平台上可以直接通过提交记录来发邮件给提交者。

    由此引申出来的一个知识点就是 git config 命令。这条命令专用于配置。它有三个作用域:

    git config --local    #该配置仅对某个仓库有效。
    git config --global   #该配置对当前用户有效,即该用户下的所有仓库都有效。
    git config --system   #该配置对系统上所有登录用户都有效,是一种作用范围最广的配置。

    git config 后面的作用域参数可以不填,不填写的话默认就是 '--local' 作用域。显然,--local 的应用优先级是最高的。

    如果想要查询当前的所有配置,则可以使用以下命令:

    git config --list --local
    git config --list --global
    git config --list --system

    2、有关Git的使用

    有关重命名:

    如果想对 Git  目录中的文件或目录做重命名操作,除了传统的在操作系统上完成更名,再通过 git rm / git add 来识别到以外,还可以直接通过一条命令一步到位:

    git mv old_name new_name

    当然,其实这种方式可能有点不太符合我们的使用习惯。

    有关 git log 命令:

    最传统的查看提交记录的就是直接敲 git log 命令了,它可以展示出一个相对详细的提交记录信息列表来:

    如果想查看简洁一点的提交记录,则可以加一个参数:

    git log --oneline

    如果只想查看某几条最新的提交记录,则可以加一个参数 -n

    git log -n2
    git log -n3 --oneline

    如果想同时查看所有分支的提交信息,可以加上 --all 参数,如果还想再看看图形化的所有分支提交信息,则可以再加上 --graph 参数:

    git log --all --graph

    有关分支:

    要查看本地仓库的分支信息通常可以有以下几种命令:

    git branch
    git branch -v    #展示本地已有分支名称及其最近的提交记录
    git branch -a    #展示所有的分支信息
    git branch -av   #综上

    如果想要创建分支,则可以使用如下命令:

    git branch new_branch_name                    #创建一个新分支
    git branch new_branch_name <commit-id>        #基于指定的提交记录创建一个新分支
    git checkout -b new_branch_name               #创建一个新分支并直接切换过去。
    git checkout -b new_branch_name <commit-id>   #综上。

    切换到指定分支可以使用如下命令:

    git checkout branch_name

    如果要删除分支,则可以使用如下两条命令:

    git branch -d branch_name   #普通删除
    git branch -D branch_name   #强制删除

    有关分离头指针:

    我们可以通过 git checkout 加任意一个 commit-id 来创建一个“临时分支”,这个“临时分支”在Git中就被称为分离头指针:

    $ git checkout aefd312b7f29
    Note: switching to 'aefd312b7f29'.
    
    You are in 'detached HEAD' state. You can look around, make experimental
    changes and commit them, and you can discard any commits you make in this
    state without impacting any branches by switching back to a branch.
    
    If you want to create a new branch to retain commits you create, you may
    do so (now or later) by using -c with the switch command. Example:
    
      git switch -c <new-branch-name>
    
    Or undo this operation with:
    
      git switch -
    
    Turn off this advice by setting config variable advice.detachedHead to false
    
    HEAD is now at aefd312 modify b.txt.

    然后我们就可以在基于这一指定分支下进行信息变更与提交记录。但是在提交的记录始终是属于“临时的”状态,如果在这种情况下我们切换到一个正常的分支,是有可能导致这些临时提交在后续被Git当成垃圾清理掉的。不过还好,Git还算比较贴心,当我们有临时状态的提交记录的时候切换分支时,会出现如下提示:

    $ git checkout master
    Warning: you are leaving 1 commit behind, not connected to
    any of your branches:
    
      151870b where is my accord?
    
    If you want to keep it by creating a new branch, this may be a good time
    to do so with:
    
     git branch <new-branch-name> 151870b
    
    Switched to branch 'master'

    这个时候,我们只需要记下上面的 git branch xxx 信息,就可以在后续我们需要的时候还原这个提交记录了。

    分离头指针常用于临时或试验性地开发某项功能。

    有关提交记录:

    我们可以修改最近一次提交记录的说明:

    git commit --amend

    在弹出的界面修改描述说明即可。以 # 号开头的行将会被忽略。

    当然,我们也可以修改任意一条提交记录的描述信息,这个操作的步骤会稍微麻烦点。首先先来看一下我们的提交记录:

    $ git log
    commit 450145f8b4e5bae27863ad073eb17ec4f3bb139f (HEAD -> master)
    Author: chorm <chorm@chorm.com>
    Date:   Wed Mar 4 21:37:13 2020 +0800
    
        master modified b.txt.
    
    commit c4a21ee6983fdf0a8bb2bcb763699b37dd0ae2f6
    Author: chorm <chorm@chorm.com>
    Date:   Wed Mar 4 21:22:42 2020 +0800
    
        add lemontea message.
    
    commit aefd312b7f29d76648464fcda79783ac1958b230
    Author: chorm <chorm@chorm.com>
    Date:   Wed Mar 4 21:17:05 2020 +0800
    
        modify b.txt.
    
    commit fa50d775caba35cf1ed4effa72144d7e32af14b7
    Author: chorm <chorm@chorm.com>
    Date:   Wed Mar 4 21:09:14 2020 +0800
    
        mv..yes.
    
    commit 8c857ca6ef049496057831aa5f873958361df757
    Author: chorm <chorm@chorm.com>
    Date:   Wed Mar 4 21:08:43 2020 +0800
    
        first.

    假设我们想要修改第二条提交记录的描述信息,那么我们可以先键入以下命令:

    git rebase -i aefd312b7f29d766

    这里需要注意了,这条命令所接的 commit-id 是我们要修改的记录的父记录的 commit-id。键入后会弹出如下界面:

    我们并不能直接在这个界面里修改描述信息,这个界面更像是一个“编程界面”,我们在这里敲下想做的动作后再交由 Git 去执行。在上图下方有一些命令说明文档,这里我们的目的是要修改第二条提交记录,因此,可以按如下形式编辑:

    随后保存并退出。然后立即便会发现Git弹出了另一个编辑界面,在这个界面我们就可以编辑我们想要的描述说明信息了:

    保存退出后再查看提交记录便可发现第二条记录的描述信息已经修改了,但同样 commit-id 也改变了:

    我们也可以用 git rebase 命令来合并历史记录。假设我们现在有如下所示的历史记录信息:

    我们想要将第二、第三、第四条记录合并为一条记录,那么,可以使用如下的命令:

    git rebase -i c6689a724c1fb6

    这里需要注意,所填的commit-id是我们所要合并的记录再前两个。在弹出来的界面按以下形式编辑并保存退出:

    同样再在弹出来的界面中填好我们想要的描述说明信息并保存即可:

    合并前后的记录对比如下所示:

    以上是将几个连续的提交记录合并成一个的操作方式。当然其实也可以合并两个不连续的提交记录,同样也是使用 git rebase -i 来实现。但是这种操作非常麻烦,不推荐使用,因此也就不作记录了。

    有关差异比较:

    在Git中,一般我们可以直接通过 git diff 来查看文件的修改情况。但如果我们已经将某个文件 git add 进暂存区了,这个时候想再查看它的修改情况,就得再加一个参数 --cached 了:

    git diff b.txt             #普通的查看文件修改情况的命令。
    git diff --cached b.txt    #已加进暂存区以后的查看文件修改情况的命令。

    Git还可以直接比较两个分支、两个分支中的指定文件的差异:

    git diff master branch2
    git diff master branch2 -- main.c
    git diff 871fac 98aef66 -- main.c

    有关stash暂存区:

    可以使用 git stash 命令来将当前工作区的变更临时存储起来,并将工作区恢复到当前最新提交记录的状态。不过这一命令并不会操作未被跟踪的文件。在后续可以很轻松地恢复stash暂存区的变更,这一套命令如下:

    git stash        #将工作区的变更暂存到stash暂存区并恢复工作区至当前最新提交
    git stash list   #查看stash暂存区
    git stash apply  #恢复最近暂存的变更
    git stash pop    #恢复最近一条暂存的变更,并删除这一暂存记录。

    3、Git目录探密

    .git 目录的文件结构大致如下所示:

    drwxr-xr-x 1 Administrator 197121   0  3月  4 21:38 ./
    drwxr-xr-x 1 Administrator 197121   0  3月  4 21:43 ../
    -rw-r--r-- 1 Administrator 197121  16  3月  4 21:37 COMMIT_EDITMSG
    -rw-r--r-- 1 Administrator 197121 130  3月  4 21:08 config
    -rw-r--r-- 1 Administrator 197121  73  3月  4 21:08 description
    -rw-r--r-- 1 Administrator 197121  23  3月  4 21:38 HEAD
    drwxr-xr-x 1 Administrator 197121   0  3月  4 21:08 hooks/
    -rw-r--r-- 1 Administrator 197121 217  3月  4 21:38 index
    drwxr-xr-x 1 Administrator 197121   0  3月  4 21:08 info/
    drwxr-xr-x 1 Administrator 197121   0  3月  4 21:08 logs/
    drwxr-xr-x 1 Administrator 197121   0  3月  4 21:37 objects/
    -rw-r--r-- 1 Administrator 197121  41  3月  4 21:09 ORIG_HEAD
    drwxr-xr-x 1 Administrator 197121   0  3月  4 21:08 refs/

    HEAD 文件存储的是Git仓库当前所工作的分支信息,如:

    $ cat HEAD
    ref: refs/heads/master

    config 文件则是存储与Git仓库的本地配置信息的,如:

    $ cat config
    [core]
            repositoryformatversion = 0
            filemode = false
            bare = false
            logallrefupdates = true
            symlinks = false
            ignorecase = true
    [user]
            name = local_user.name
            email = local_user.email

    可以简单理解成,所有以 git config --local 设置的配置信息都会保存在这个文件里。

    refs 目录下则保存了仓库的分支信息与标签信息:

    $ ls -al refs/
    total 4
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:08 ./
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:47 ../
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:37 heads/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:08 tags/

    heads 目录的内容如下:

    $ ls -al refs/heads/
    total 2
    drwxr-xr-x 1 Administrator 197121  0  3月  4 21:37 ./
    drwxr-xr-x 1 Administrator 197121  0  3月  4 21:08 ../
    -rw-r--r-- 1 Administrator 197121 41  3月  4 21:37 master
    -rw-r--r-- 1 Administrator 197121 41  3月  4 21:37 new_branch

    tags 目录的内容与 heads 类似,如果没有创建的话就是一个空目录。

    heads 与 tags 目录下存放的文件可不仅仅是简单的文本文件,如果我们只是使用 cat 来查看这些信息的话,只能看到一个简单的当前分支最新提交记录的id号,但我们可以通过 git cat-file 来查看它的详细信息:

    $ git cat-file -t refs/heads/master
    commit
    
    
    $ git cat-file -p refs/heads/master
    tree 5b2338616a6f35ec3442e6635d6385f31fcccfe5
    parent c4a21ee6983fdf0a8bb2bcb763699b37dd0ae2f6
    author chorm <chorm@chorm.com> 1583329033 +0800
    committer chorm <chorm@chorm.com> 1583329033 +0800
    
    master modified b.txt.

    还有一个很关键的就是 objects 目录,这个目录是专用于存储仓库中的提交信息与相应文件信息的,它的文件结构如下:

    $ ls -al objects/
    total 8
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:37 ./
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:47 ../
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:22 07/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:23 09/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:08 27/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:16 29/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:24 34/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:22 39/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:37 3f/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:37 45/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:17 53/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:37 5b/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:37 70/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:08 8c/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:17 ae/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:22 c4/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:09 c8/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:37 c9/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:24 cd/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:08 df/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:08 f9/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:09 fa/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:37 fb/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:08 info/
    drwxr-xr-x 1 Administrator 197121 0  3月  4 21:08 pack/

    对于任意一个目录,都会有一条 commit-id 的文件,如:

    $ ls -al objects/c8
    total 5
    drwxr-xr-x 1 Administrator 197121  0  3月  4 21:09 ./
    drwxr-xr-x 1 Administrator 197121  0  3月  4 21:37 ../
    -r--r--r-- 1 Administrator 197121 81  3月  4 21:09 91a87dcc9490a95deaa42d7f1500bfead34b2a

    同样,我们可以用 git cat-file 来查看这个文件的信息,但是这里的查看方式稍有不同,它的参数是目录名+文件名:

    $ git cat-file -t c891a87dcc9490a95deaa42d7f1500bfead34b2a
    tree
    
    
    
    $ git cat-file -p c891a87dcc9490a95deaa42d7f1500bfead34b2a
    100644 blob 274c0052dd5408f8ae2bc8440029ff67d79bc5c3    b.txt
    100644 blob df1730a29f58edc7961318a1ca71403f3ede74d8    readme.txt

    在 objects 目录下的子目录中存储的都是我们所跟踪的信息的具体备份。在 Git 中将这些信息分成三个对象来管理:

    1、commit

    2、tree

    3、blob

    commit 就是我们在提交记录时所录入的提交信息,包括提交注释、提交者信息等。

    tree 则表示这条记录的由来历史,包括它的父tree,以及在不同时期所指向的文件信息等。

    blob 就是纯粹的用于保存文件信息的了。

    它们之间的关系是:一条 commit 有且仅有一个 tree 与之对应,一个 tree 就像一个指针一样,可以链接无穷多的父 tree 与各种 blob ,一个 blob 就代表一个文件信息。

    同时,在 Git 中,文件内容与文件名是分开存储的,文件信息专门保存在 blob 中,文件名则保存在 tree 上。对于文件内容一样的多个文件,在Git的 objects 中仅会保存一份副本。

    $ git cat-file -t 0786e0797d60ff174aa2150c5bc8edf7a9f44531
    tree
    
    $ git cat-file -t c891a87dcc9490a95deaa42d7f1500bfead34b2a
    commit
    
    $ git cat-file -t 09ec4180e8b227a3fed1cac94cd9cd497c0fc262
    blob

    4、Git仓库创建

    Git的数据在仓库之间的传输可以分以下三种方式来实现:

    1、本地协议

    本地协议又可分为“哑协议”与“智能协议”两种,它们的区别是在传输时带不带传输进度以及是否压缩传输。它们的形式分别为:'/path/to/repo.git' 与 'file:///path/to/repo.git'

    2、http协议

    这种协议通常需要验证账号密码。它的形式为:'http://git-server.com:port/path/to/repo.git' 

    3、ssh协议

    一般在局域网中就用这种比较多了,它通常是基于公钥/私钥来通信的,它的形式为'user@git-server.com:path/to/repo.git'

    我们可以直接在任意一个 Git 仓库中克隆代码:

    git clone /path/to/repo.git repo2.git
    git clone --bare file:///path/to/repo.git repo3.git   #--bare参数的意思是创建一个不带工作区的Git仓库。

  • 相关阅读:
    Session的配置
    插件编程小窥
    今日遇到了困难,顺便看了下SMO
    初识三层架构
    .NET文件类库
    JQuery学习笔记
    反射整理学习<二>
    通俗道破单例模式
    菜鸟写代码生成器最后一天完结篇
    卧谈会:委托与事件
  • 原文地址:https://www.cnblogs.com/chorm590/p/12416075.html
Copyright © 2011-2022 走看看