本章主要介绍Git的基本结构和基本指令。
如下图(记为图1)所示,一个Git工程可以分为三个区域:工作目录,缓存区域,git仓库。
工作目录就是你的所有文件,缓存区域是暂存下一次commit要更改的内容的区域,git仓库则存着所有的commits。
在上图介于working directory 和 staging area之间的文件的状态大致可以分为如下几种(记为图2):
untracked表示该文件还未被git跟踪,不会进行版本管理。后面的unmodified、modified、staged均为 tracked之后的状态。staged即表面加入了staging area。
git status
我们可以使用这个命令来查看当前工程中所有文件的状态。它的结果大致如下(记为图3):
git add
如图2所示,add的作用是将各种状态的文件变成staged状态。它可以添加多个文件或使用通配符:
git add *.cpp
git add a.doc b.txt
# 以下两个都代表所有文件
git add .
git add *
git commit
用于将staging area中的文件存到git仓库中。
基础用法如下:
# -m 表示该commit的 message
git commit -m “ add new files”
# -a 表示将已经跟踪(tracked)的文件都加入staging area,比如图3中“changes not staged for commit”中的文件。可以省去git add的步骤。
git commit -a -m “ change some files“
# 可以将这两个指令合并
git commit -am “change some files”
git rm
用于删除文件。常用
# 不能删除图2中 untracked 和 staged 的文件
git rm a.cpp
# 强制删除(如untracked 和 staged 的文件)
git rm -f a.cpp
# 只从staging area中删除,而不从working directory中删除
git rm --cached a.cpp
# 删除所有文件(不能删除文件夹)
git rm *
# 删除所有文件包括文件夹
git rm \*
# 和上面效果相同
git rm * -r 或 git rm . -r
# 删除log文件夹下的.log文件,不包括子目录
git rm log/*.log
# 包括子目录中的
git rm log/\*.log
git diff
显示working directory与staging area中的内容的不同之处。如下图所示:
git diff
# 显示 staging area和 上一次提交(commit)之间的区别
git diff --cached
# 显示 working directory和 上一次提交(commit)之间的区别
git diff HEAD
# 显示两个 <branch>(或 commit)之间的区别
git diff <branch>..<branch>
如 git diff master..origin/master
git log
显示commits的历史记录,效果如下图所示:
git log <commit>..<commit>
显示指定范围的log(注:A..B在Git中的意思是B中含有的而A中不含有的那些commits,如master..test表示test分支含有的,而master分支不含有的那些commits)
git log --stat
同时显示改动的统计信息
git log -p
同时显示改动的详细信息
git log --oneline
每个commit 一行
git log --graph --decorate
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s - %Cgreen(%cr) %C(cyan)(%cd) %C(blue)<%an>%Creset' --date=format:'%Y-%m-%d %H:%M'
可以使用alias来给这个命令取一个别名。方法是在.gitconfig中添加
[alias]
<name> = log .....