git config --global user.email "user@example.com"
cd [project_path]
git init
git add
——(--all 或 -a,添加所有)(--interactive 可以开启交互模式,选取具体的修改加入待提交的队列)
—— 将指定的修改加入暂存区(staging area,索引 index)
—— 通过 git reset HEAD filename 可以将已加入暂存区的文件移出暂存区(如果文件在被 git add 之后有新的修改,则新的修改将被丢弃)
—— 在项目的根目录下创建 .gitignore 文件,其中列举不需要提交的文件(具体文件、包含在某个目录里的文件、具有特定模式的文件、例外文件等),那么在文件加入暂存区的时候就会忽略指定的文件。如果只在子目录里创建 .gitignore 文件,则只影响相应目录下的结果。如果要忽略一个已经被加入到版本里的文件,那么可以用 update-index 命令的 --assume-unchanged。
—— 每一次 add 操作只将已经发生的更改添加到暂存区,add 操作之后发生的修改需要再次执行 add 才会被加入暂存区。
git stash
—— 将工作区和暂存区中的修改保存在储藏栈(stash stack,缓存区)
—— 通过 git stash list 可以查看位于储藏栈的修改
—— 通过 git stash pop 恢复位于栈顶的修改
—— 通过 git stash pop stash@{1} 恢复指定的修改
git rm
—— 不在追踪某个文件的变化
git commit
—— 选择性提交有利于某些修改之间的隔离。将不同的修改分多次提交可以使得被提交的历史记录更清晰,而且更方便后期定位和获取(git checkout)某个单一的修改。
git status
—— 可查看当前工作区中已经发生的所有修改(包含增删文件),以及已经加入暂存区的修改。使用 --short 选项可以让输出显示更紧凑。
—— 已加入暂存区可以提交的修改:changes to be committed
—— 未加入暂存区的修改:changed but not updated
—— 未被跟踪的文件(新增文件):untracked files
git diff <a> <b> <c>
——(a、b 可以是不同的分支、标签、散列值、HEAD等;其中 “版本标识^!” 表示比较当前提交与上一次提交;c 可以用于指定是哪个目录或文件的比较)
——(git diff --stat <a> <b> 可以统计每个文件中的修改的数量)
——(git diff --staged 可以查看 HEAD 与暂存区,即已经加入待提交队列的文件的区别)
——(git diff 可以查看工作区与暂存区之间的差别)
git log
——(-n 显示最近几次的提交)
——(--oneline 单行显示每一次提交,--format 格式化输出)
——(--stat 只显示被修改的文件,--dirstat 显示那些包含被修改文件的目录,--shortstat 显示项目中有多少文件被修改、新增或删除)
——(--graph 图形化显示各提交之间的关系)
git clone
git pull(= git fetch + git merge)
git push
git checkout <版本标签或散列值> —— 恢复/回滚到某个版本
git fsck —— 验证版本库的完整性
版本库:
项目版本库(blessed repository)
子项目的版本库(子模块,submodule)
裸版本库(bare repository)
git 的文件存储机制
—— git hash-object -w filename 可以得到一个文件对象的 hash 值
—— git cat-file -p hash值 可以 cat 该 hash 值对应的文件的内容
—— git 通过维护文件对象的 hash 值来管理文件的存储