CC BY 4.0 (除特别声明或转载文章外)
如果这篇博客帮助到你,可以请我喝一杯咖啡~
参考书目:Pro Git, by Scott Chacon, Ben Straub
Git 是什么?
直接记录快照,而非差异比较
- 基于差异的版本控制
- Git 基于快照流的方式存储数据:
- 每当提交更新或保存项目状态时,基本就会对当时全部文件创建一个快照并保存这个快照索引;
- 为了效率,没有修改的文件,Git 不再重新存储该文件,而是保留一个链接指向之前存储的文件。
本地执行
Git 保证完整性
采用校验和机制,数据存储前先做检验和。计算校验和的机制叫做 SHA-1 散列。基于文件的内容或目录结构计算出来,是一个由 40 个十六进制字符组成的字符串。
Git 一般只添加数据
三种状态
- 已提交 committed:表示数据已经安全地保存在本地数据库中。
- 已修改 modified: 表示修改了文件,但还没保存到数据库中。
- 已暂存 staged:表示对一个修改文件的当前版本做了标记,使之包含在下次提交的快照中。
初次运行 Git 前的配置
每台计算机上只需要配置一次,程序升级时会保留配置信息。可以再任何时候再次通过命令来修改它们。
Git自带一个git config
的工具来帮助设置控制 Git 外观和行为的配置变量。这些变量存储在三个不同的位置:
/etc/gitconfig
文件:包含系统上每一个用户及他们仓库的配置的通用配置。如果执行git config
时带上--system
选项,那么它就会读写该文件的配置变量。~/.gitconfig
或~/.config/git/config
文件:只针对当前用户。 你可以传递--global
选项让 Git 读写此文件,这会对你系统上 所有 的仓库生效。- 当前使用仓库的 Git 目录中的 config 文件(即
.git/config
):针对该仓库。 你可以传递 –local 选 项让 Git 强制读写此文件,虽然默认情况下用的就是它。。 (当然,你需要进入某个 Git 仓库中才能让该选 项生效。)
每一个级别会覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。
以下命令可以查看所有的配置以及它们所在的文件:
git config --list --show-origin
用户信息
安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使 用这些信息,它们会写入到你的每一次提交中,不可更改:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
再次强调,如果使用了 –global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事 情, Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运 行没有 –global 选项的命令来配置。
Git 基础
git status -s:
??: 表示未跟踪,即没有git add进来
MM: 第一栏表示暂存区被文件被修改,右边指明了工作区的状态被修改。
git diff志现实尚未暂存的改动。
撤销操作
有时候提交完了发现漏掉几个文件没有添加,或者提交信息写错了。此时,可以运行带有 --amend
选项的提交命令来重新提交:
git commit --amend
这个命令会将暂存区的文件提交。如果自上次提交依赖你未做任何修改,那么快照会保持不变,而你所修改的只是提交信息。
例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
最终你只会有一个提交——第二次提交将代替第一次提交的结果。
取消暂存的文件
使用 git reset HEAD <file>
来取消暂存。
撤销对文件的修改
如果你并不想保留对 CONTRIBUTING.md 文件的修改怎么办? 你该如何方便地撤消修改——将它还原成上次提 交时的样子(或者刚克隆完的样子,或者刚把它放入工作目录时的样子)? 幸运的是,git status 也告诉了 你应该如何做。 在最后一个例子中,未暂存区域是这样:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
远程仓库的使用
为了能在任意 Git 项目上协作,你需要知道如何管理自己的远程仓库。 远程仓库是指托管在因特网或其他网络中 的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及 管理远程仓库以及根据需要推送或拉取数据。 管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓 库、管理不同的远程分支并定义它们是否被跟踪等等。 在本节中,我们将介绍一部分远程管理的技能。
查看远程仓库
git remote
命令,查看已经配置的远程仓库服务器。
git remote -v
会显示远程仓库的URL。
添加远程仓库
git remote add >shortname> <url>
拉取某个仓库
git fetch <remote>
推送到远程仓库
git push origin master
Git 分支
有人把 Git 的分支模型称为它的“必杀技特性”,也正因为这一特性,使得 Git 从众多版本控制系统中脱颖而出。 为何 Git 的分支模型如此出众呢? Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能 在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。 与许多其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。 理解和精通这一特性,你便会意识到 Git 是如此的强大 而又独特,并且从此真正改变你的开发方式。