概念
文件三种状态
- 已修改-modified
- 已暂存-staged
- 已提交-commit
分支
指针将每个提交连接成一条时间线,HEAD 指针指向当前分支指针, 所有的操作都是操作指针
常用基础命令
-
git add files
把文件的修改添加到暂存区
-
git commit
把暂存区的修改提交到当前分支,提交之后暂存区就被清空了
-
git reset – files
使用当前分支上的修改覆盖暂存区,用来撤销最后一次 git add files
-
git checkout – files
使用暂存区的修改覆盖工作目录,用来撤销本地修改
跳过暂存区, 直接工作区和分支进行操作
-
git commit -a 直接把所有文件的修改添加到暂存区然后执行提交
-
git checkout HEAD – files 取出最后一次修改,可以用来进行回滚操作
禁用 Fast forward 模式
“快进式合并”(fast-farward merge),会直接将 master 分支指向合并的分支,这种模式下进行分支合并会丢失分支信息,也就不能在分支历史上看出分支信息。
例: B为master分出一个bugfix分支进行提交X和Y。最终master merge bugfix 根据fastforward会直接将master指向bugfix。将丢失bugfix分支的信息
如果–no-ff, 会在master的基础上生成一个合并的commit这样分支记录也会被保存下来
- git merge –no-ff -m “merge with no-ff” dev
rebase 分支合并
rebase 和 merge的区别:
rebase将两个分支的历史连在了一起,会把整个 feature 分支移动到 master 分支的后面,有效地把所有 master 分支上新的提交并入过来。rebase 为原分支上每一个提交创建一个新的提交,重写了项目历史,并且不会带来合并提交。
-
git rebase master
-
git rebase -i master // 交互式的rebase过程
存储工作区
所有分支都共用一个工作区的缘故
一个分支上操作之后,如果还没有将修改提交到分支上,此时进行切换分支,那么另一个分支上也能看到新的修改
使用 git stash 将当前分支的修改储藏起来,当前工作区的所有修改都会被存到栈上
- git stash
gitignore
高层命令
获得版本库
git init
初始化仓库
git clone
克隆版本库
版本管理
git add
修改文件纳入到暂存区
git commit
暂存区提交版本库
git rm
删除版本库特定文件
git reset
回退版本
git checkout
丢弃工作区修改
查看信息
git status
git状态
git help
帮助
git log
提交日志
git diff
比较当前文件的修改。工作区和版本库
远程协作
git pull
更新远程版本库
git push
提交远程版本库
内部原理
从根本上来讲 Git 是一个内容寻址(content-addressable)文件系统,并在此之上提供了一个版本控制系统的用户界面。
意味着Git 的核心部分是一个简单的
键值对数据库
(key-value data store)
.git目录
-
HEAD
目前被检出的分支, 当前分支
-
config
项目特有的配置选项
-
description
-
index
保存暂存区信息
-
hooks/
包含客户端或服务端的钩子脚本
-
info/
包含一个全局性排除(global exclude)文件
放置那些不希望被记录在 .gitignore 文件中的忽略模式(ignored patterns)
-
objects/
存储所有数据内容
-
refs/
存储指向数据(分支)的提交对象的指针
底层命令
hash-object
存入git数据库中
1 |
echo 'test content' | git hash-object -w --stdin |
cat-file
从 Git 那里取回数据
1 |
git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4 |
update-index
更新暂存区
write-tree
暂存区内容写入一个树对象
1 |
git write-tree |