Git 学习笔记 Chapter 01 - Git 基础概念

----- 最近更新【2022-02-02】-----

本文目录结构预览:

  • 一、简介
  • 二、文件状态与工作区域
    1、文件状态
    2、工作区域
    3、基本工作流程
  • 三、Git 的配置
    1、配置文件
    2、配置案例
  • 四、查看手册
  • 五、参考

一、简介

Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。 概念上来区分,其它大部分系统以文件变更列表的方式存储信息。 这类系统(CVS、Subversion、Perforce、Bazaar 等等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。

Git 不按照以上方式对待或保存数据。 反之,Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个快照流

这是 Git 与几乎所有其它版本控制系统的重要区别。 因此 Git 重新考虑了以前每一代版本控制系统延续下来的诸多方面。 Git 更像是一个小型的文件系统,提供了许多以此为基础构建的超强工具,而不只是一个简单的 VCS。

二、文件状态与工作区域

1、文件状态

在 Git 的工作目录下,每一个文件都不外乎这两种状态:已跟踪(tracked)或 未跟踪(untracked)。

已跟踪的文件是指那些被纳入了版本控制的文件,已跟踪的文件又可以再分为三种状态:

  • 未修改(unmodified),也可以叫 已提交(committed)
  • 已修改(modified)
  • 已暂存(staged)

工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。

图解:

文字解释:

  • ①③:添加文件到“已暂存”状态。(如git add filename
  • ②:从“未修改”状态到“已修改”状态。(修改文件,如vim fimename
  • ④:从“未修改”状态到“未跟踪”状态。(mv 移动 / 重命名文件,如mv filename
    mv 移动文件可以理解为是两个步骤:删除原文件、新建一个名字不一样但内容一样的新文件。
  • ⑤:从“已暂存”状态到“已提交”状态。(如git commit

2、工作区域

由文件的状态,可以引入 Git 项目的三个工作区域的概念:Git 仓库工作目录 以及 暂存区域

已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

1)Git 仓库目录
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。

2)工作目录
工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。

3)暂存区域
暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作“索引”,不过一般说法还是叫暂存区域。

3、基本工作流程
基本的 Git 工作流程如下:

  • 修改文件——在工作目录中修改文件。
  • 暂存文件——将文件的快照放入暂存区域。
  • 提交更新——找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

如果 Git 目录中保存着的特定版本文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已暂存状态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。

三、Git 的配置

1、配置文件

Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:

  • 1)/etc/gitconfig 文件:包含系统上每一个用户及他们仓库的通用配置。 如果使用带有--system选项的git config时,它会从此文件读写配置变量。
  • 2)~/.gitconfig~/.config/git/config文件:只针对当前用户。 可以传递--global选项让git config读写此文件。
  • 3).git/config文件,当前使用仓库的 Git 目录中的 config 文件,这个配置文件只针对该仓库起作用。

以上三个层次中每层的配置(系统、全局、本地)都会覆盖掉上一层次的配置,如.git/config中的值会覆盖掉/etc/gitconfig中所对应的值。

在 Windows 系统中,Git 会查找 $HOME 目录下(一般情况下是 C:\Users\$USER)的.gitconfig文件。 Git 同样也会寻找/etc/gitconfig文件,但只限于 MSys 的根目录下(即安装 Git 时所选的目标位置)。

Git 的配置文件是纯文本的,所以你可以直接手动编辑这些配置文件,输入合乎语法的值。 但是运行 git config 命令会更简单些。

2、配置案例

1)用户信息

当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中

$ git config --global user.name "John Doe"
$ git config --global user.email [email protected]

如果使用了--global选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有--global选项的命令来配置。

2)文本编辑器

当 Git 需要你输入信息时会调用它,Git 会使用操作系统默认的文本编辑器,通常是 Vim。 如果你想使用不同的文本编辑器,例如 Emacs,可以这样做:

git config --global core.editor emacs

3)查看配置信息

如果想要检查你的配置,可以使用git config --list命令来列出所有 Git 当时能找到的配置。如:

$ git config --list
core.autocrlf=true
pull.rebase=false
init.defaultbranch=master
[email protected]
user.name=noseeWin
core.autocrlf=input
core.ignorecase=true
[email protected]:/home/nosee/git
remote.mv-server.fetch=+refs/heads/*:refs/remotes/mv-server/*
branch.master.remote=mv-server
branch.master.merge=refs/heads/master

你可能会看到重复的变量名,因为 Git 会从不同的文件中读取同一个配置(例如:/etc/gitconfig 与 ~/.gitconfig)。 这种情况下,Git 会使用它找到的每一个变量的最后一个配置。

你可以通过输入 git config : 来检查 Git 的某一项配置

$ git config user.name
John Doe

4)查看配置命令
使用命令补全功能(双击键),可以大概预览git config可以作哪些配置,如下:

$ git config 
Display all 89 possibilities? (y or n)
add.               commitGraph.       fsck.              interactive.       push.              status.
advice.            committer.         gc.                log.               rebase.            submodule.
alias.             completion.        gitcvs.            lsrefs.            receive.           tag.
am.                core.              gitweb.            mailinfo.          remote.            tar.
apply.             credential.        gpg.               mailmap.           remotes.           trace2.
author.            credentialCache.   grep.              maintenance.       repack.            transfer.
blame.             credentialStore.   gui.               man.               rerere.            uploadarchive.
branch.            diff.              guitool.           merge.             reset.             uploadpack.
browser.           difftool.          help.              mergetool.         sendemail.         uploadpackfilter.
checkout.          extensions.        http.              notes.             sendpack.          url.
clean.             fastimport.        i18n.              pack.              sequence.          user.
clone.             feature.           imap.              pager.             showBranch.        versionsort.
color.             fetch.             index.             pretty.            splitIndex.        web.
column.            filter.            init.              protocol.          ssh.               worktree.
commit.            format.            instaweb.          pull.              stash.

$ git config --
--add              --edit             --get-color        --int              --null             --show-scope
--blob=            --expiry-date      --get-colorbool    --list             --path             --system
--bool             --file=            --get-regexp       --local            --remove-section   --type=
--bool-or-int      --fixed-value      --get-urlmatch     --name-only        --rename-section   --unset
--bool-or-str      --get              --global           --no-...           --replace-all      --unset-all
--default=         --get-all          --includes         --no-global        --show-origin      --worktree

四、查看手册

若你使用 Git 时需要获取帮助,有三种方法可以找到 Git 命令的使用手册:

$ git help 
$ git  --help
$ man git-

以上方法可以查询几乎所有 git 相关命令的使用手册。

例如,想要查看git add命令的使用手册,可输入git help addgit add --helpman git-add,查询结果如下:

GIT-ADD(1)                                     Git Manual                                     GIT-ADD(1)

NAME
       git-add - Add file contents to the index

SYNOPSIS
       git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
                 [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]
                 [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--renormalize]
                 [--chmod=(+|-)x] [--pathspec-from-file= [--pathspec-file-nul]]
                 [--] [...]

DESCRIPTION
       This command updates the index using the current content found in the working tree, to prepare
       the content staged for the next commit. It typically adds the current content of existing paths
       as a whole, but with some options it can also be used to add content with only part of the
       changes made to the working tree files applied, or remove paths that do not exist in the working
       tree anymore.

       The "index" holds a snapshot of the content of the working tree, and it is this snapshot that is
       taken as the contents of the next commit. Thus after making any changes to the working tree, and
       before running the commit command, you must use the add command to add any new or modified files
       to the index.
......(省略一万字)

如果不确定想要查看的git help 命令是什么,可以使用命令补全功能(双击键)来查看都有哪些命令:

$ git help
Display all 183 possibilities? (y or n)
add                       everyday                  merge-one-file            reset
am                        faq                       merge-ours                restore
annotate                  fast-export               merge-recursive           rev-list
apply                     fast-import               merge-recursive-ours      rev-parse
archive                   fetch                     merge-recursive-theirs    revert
attributes                fetch-pack                merge-resolve             revisions
bisect                    filter-branch             merge-subtree             rm
blame                     fmt-merge-msg             merge-tree                send-email
branch                    for-each-ref              mergetool                 send-pack
bugreport                 for-each-repo             mktag                     shortlog
bundle                    format-patch              mktree                    show
cat-file                  fsck                      modules                   show-branch
check-attr                fsck-objects              multi-pack-index          show-index
check-ignore              gc                        mv                        show-ref
check-mailmap             get-tar-commit-id         name-rev                  sparse-checkout
check-ref-format          gitk                      namespaces                stage
checkout                  glossary                  notes                     stash
checkout-index            grep                      p4                        status
cherry                    gui                       pack-objects              stripspace
cherry-pick               gui.tcl                   pack-redundant            submodule
citool                    hash-object               pack-refs                 submodules
clean                     help                      patch-id                  subtree
cli                       hooks                     pickaxe                   svn
clone                     http-backend              prune                     switch
column                    http-fetch                prune-packed              symbolic-ref
commit                    http-push                 pull                      tag
commit-graph              ignore                    push                      tutorial
commit-tree               imap-send                 quiltimport               tutorial-2
config                    index-pack                range-diff                unpack-file
core-tutorial             init                      read-tree                 unpack-objects
count-objects             init-db                   rebase                    update
credential                instaweb                  receive-pack              update-index
credential-cache          interpret-trailers        reflog                    update-ref
credential-manager-core   log                       remote                    update-server-info
credential-store          ls-files                  remote-ext                upload-archive
credential-wincred        ls-remote                 remote-fd                 upload-pack
credentials               ls-tree                   remote-ftp                var
cvs-migration             mailinfo                  remote-ftps               verify-commit
daemon                    mailmap                   remote-helpers            verify-pack
describe                  mailsplit                 remote-http               verify-tag
diff                      maintenance               remote-https              version
diff-files                merge                     repack                    whatchanged
diff-index                merge-base                replace                   workflows
diff-tree                 merge-file                repository-layout         worktree
diffcore                  merge-index               request-pull              write-tree
difftool                  merge-octopus             rerere

五、参考

Git 官网:http://git-scm.com/

中文版《Pro Git》:https://www.kancloud.cn/kancloud/progit
英文版《Pro Git》:http://www.git-scm.com/book/en/v2

你可能感兴趣的:(Git 学习笔记 Chapter 01 - Git 基础概念)