简介

Git 当初是 Linus 为了管理 Linux 代码,用 C 语言写的一个分布式版本控制系统

  • Git 是全平台的(Linux、Unix、Mac、Windows)
  • 所有的版本控制系统,其实只能跟踪文本文件的改动,比如 TXT 文件,网页,所有的程序代码、markdown 等等,而 word、图片、视频等二进制格式的文件无法被跟踪改动,只是知道改动大小而已。
  • 因为文本是有编码的,比如中文有常用的 GBK 编码,日文有 Shift_JIS 编码,如果没有历史遗留问题,强烈建议使用标准的 UTF-8 编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。

分布式与集中式

CVS 及 SVN 都是集中式的版本控制系统,由于 CVS 自身设计的问题,会造成提交文件不完整,版本库莫名其妙损坏的情况。同样是开源而且免费的 SVN 修正了 CVS 的一些稳定性问题,是目前用得最多的集中式版本库控制系统。而 Git 则是目前最流行的分布式版本控制系统。

集中式版本控制系统

集中式版本控制: 从中央服务器取 -> 修改 -> 推送给中央服务器 缺点:

  1. 集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个 10M 的文件就需要 5 分钟
  2. 中央服务器出问题,该项目就停滞了

分布式版本控制系统

分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库 分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

Git 推崇的频繁且详细描述的提交,而不是确认无 Bug 才提交。

优点:

  1. 不需要联网,就可以工作,只需要在联网后推送上去即可
  2. 一份拷贝坏掉,只需从别的地方再拷贝一份即可
  3. Git 具有极其强大的分支管理

最小化配置

配置参与项目开发人员的 user.name 和 user.email, 便于在出现代码变更等情况时, git 服务器可以及时地通过邮件进行提醒。(因此,邮箱需要是一个你能够及时接收到信息的邮箱) 如果你忘记了进行该配置,后续在 git 做变更提交的时候,会提示你进行该配置。

1
2
git config --global user.name "your_name"
git config --global user.email "your_email"

your_nameyour_email 根据自己的信息填写。一般我就写 github 的用户名和邮箱。

config 的三个作用域

1
2
3
git config --local
git config --global
git config --system

local 只对某个仓库有效 global 对当前用户所有仓库有效 system 对系统所有登录的用户有效

显示 config 的配置, 加 --list

1
2
3
git config --list --local
git config --list --global
git config --list --system

工作区,暂存区与版本库

Git 管理的文件分为:工作区(Working Directory),版本库(Repository)。 版本库又分为暂存区 stage(或者叫 index)和 Git 为我们自动创建的第一个分支 master,以及指向 master 的一个指针叫 HEAD。

image-20200314170717871 git sectors

工作区 working directory --> 暂存区 stage --> 仓库 Repository

  • git add 将工作区 working directory 的文件纳入 git 的暂存区 stage 进行索引(index),git commit 把文件从暂存区 --> 仓库,

    1. git add filename1 foldername 显式指定文件或文件夹名,进行添加

    2. git add *.md 使用通配符添加满足条件的文件

    3. git add -u

      Update the index just where it already has an entry matching <pathspec>. This removes as well as modifies index entries to match the working tree, but adds no new files.

      If no <pathspec> is given when -u option is used, all tracked files in the entire working tree are updated

      修改、删除已被 stage 索引的项,但不会将新增文件纳入 stage 进行 index.

    4. git add -A

      Update the index not only where the working tree has a file matching <pathspec> but also where the index already has an entry. This adds, modifies, and removes index entries to match the working tree.

      If no <pathspec> is given when -A option is used, all files in the entire working tree are updated

      更新已被 stage 索引的项,并将新增文件纳入 stage 索引。

  • git diff 查看工作区和暂存区差异

  • git diff filename: 比较工作区和暂存区

  • git diff --cached 查看暂存区和仓库差异,

  • git diff HEAD 查看工作区和仓库的差异,

  • git diff HEAD -- filename 命令可以查看工作区和仓库里面最新版本的区别

  • git add 的反向命令:

    旧命令:git checkout -- <filename> 可以用新命令 git restore <filename> 替代 ,撤销工作区修改,即把暂存区最新版本转移到工作区, git checkout -- file 命令中的 -- 很重要,没有 --,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到 git checkout 命令。

  • 查看 git 版本:git --version

  • git status 查看工作区的状态

  • 如果 git status 告诉你有文件被修改过,用 git diff 可以查看修改内容。

帮助手册

git log 为例: 1. git log --help 查看 git log 的帮助。 2. git help log

参考资料

  1. github_pages_learning
  2. A Visual Git Reference
  3. github 新建本地仓库并将代码提交到远程仓库