git 简介, 配置与基本原理
简介
Git 当初是 Linus 为了管理 Linux 代码,用 C 语言写的一个分布式版本控制系统
- Git 是全平台的(Linux、Unix、Mac、Windows)
- 所有的版本控制系统,其实只能跟踪文本文件的改动,比如 TXT 文件,网页,所有的程序代码、markdown 等等,而 word、图片、视频等二进制格式的文件无法被跟踪改动,只是知道改动大小而已。
- 因为文本是有编码的,比如中文有常用的 GBK 编码,日文有 Shift_JIS 编码,如果没有历史遗留问题,强烈建议使用标准的 UTF-8 编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。
分布式与集中式
CVS 及 SVN 都是集中式的版本控制系统,由于 CVS 自身设计的问题,会造成提交文件不完整,版本库莫名其妙损坏的情况。同样是开源而且免费的 SVN 修正了 CVS 的一些稳定性问题,是目前用得最多的集中式版本库控制系统。而 Git 则是目前最流行的分布式版本控制系统。
集中式版本控制系统
集中式版本控制: 从中央服务器取 -> 修改 -> 推送给中央服务器 缺点:
- 集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个 10M 的文件就需要 5 分钟
- 中央服务器出问题,该项目就停滞了
分布式版本控制系统
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库 分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
Git 推崇的频繁且详细描述的提交,而不是确认无 Bug 才提交。
优点:
- 不需要联网,就可以工作,只需要在联网后推送上去即可
- 一份拷贝坏掉,只需从别的地方再拷贝一份即可
- Git 具有极其强大的分支管理
最小化配置
配置参与项目开发人员的 user.name 和 user.email, 便于在出现代码变更等情况时, git 服务器可以及时地通过邮件进行提醒。(因此,邮箱需要是一个你能够及时接收到信息的邮箱) 如果你忘记了进行该配置,后续在 git 做变更提交的时候,会提示你进行该配置。
1 | git config --global user.name "your_name" |
your_name
和 your_email
根据自己的信息填写。一般我就写 github 的用户名和邮箱。
config 的三个作用域
1 | git config --local |
local 只对某个仓库有效 global 对当前用户所有仓库有效 system 对系统所有登录的用户有效
显示 config 的配置, 加 --list
1 | git config --list --local |
工作区,暂存区与版本库
Git 管理的文件分为:工作区(Working Directory),版本库(Repository)。 版本库又分为暂存区 stage(或者叫 index)和 Git 为我们自动创建的第一个分支 master,以及指向 master 的一个指针叫 HEAD。
工作区 working directory --> 暂存区 stage --> 仓库 Repository
git add
将工作区 working directory 的文件纳入 git 的暂存区 stage 进行索引(index),git commit
把文件从暂存区 --> 仓库,git add filename1 foldername
显式指定文件或文件夹名,进行添加git add *.md
使用通配符添加满足条件的文件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.
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