获取帮助
git help <command>获取名为command命令的帮助文档
配置
配置的级别
- 使用
git config命令修改配置,等价于直接修改config文件 git config <key> <value>或git config --local <key> <value>仓库级配置,修改的是当前使用仓库的 Git 目录中的 config 文件(就是.git/config)git config --global <key> <value>当前用户级设置 修改的是~/.gitconfig 或 ~/.config/git/config文件(e.g. C:/Users/Oliver/.gitconfig)git config --system <key> <value>系统级设置 修改的是 /etc/gitconfig文件(e.g. C:/Oliver/run/Git/etc/gitconfig)
提交信息配置
git config --global user.name "<name>"设置提交信息的用户名namegit config --global user.email <email>设置提交信息的电子邮箱email
查看配置
git config --list查看所有配置,重复的配置以最后一个为准。重复的原因是可以有多级配置。git config <key>查看名为key的单个配置的值
其它常用配置
git config --global alias.<alias> <command>设置别名,示例中将command命令设置alias为别名git config --global color.ui true命令行关键字颜色区分git config --global merge.conflictstyle diff3默认冲突文件生成三方版本比较信息
正向流程
初始化本地仓库
git init在你的项目文件夹路径执行该命令,该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是Git 仓库的骨干。但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。git init命令默认创建一条分支,名称为master。master分支只是一条普通的分支。
检查当前文件状态
-
git status
-
git status -s
文件加入暂存区
git add <file>加入单个文件git rm <file>或git add <file>加入删除的文件git add -u加入所有被跟踪的已修改文件git add .加入所有被跟踪的已修改文件以及未跟踪文件,不包括删除的文件git add --all加入所有
.gitignore文件
-
定义Git忽略文件的规则,被忽略的文件不再提示未跟踪

-
文本编辑器里“保存”或者“另存为”就可以把文件命名为.gitignore
查看文件差异
git diff查看文件在工作区与暂存区的区别git diff --cached或git diff --staged查看文件在暂存区与HEAD树的区别
提交
git commitgit commit -m <comment>git commit -a -m <comment>
再一次修改提交
- 生命周期示意图

移除文件
git rm <file>或git add <file>git rm -f <file>git rm --cached <file>git rm --cached <file>暂存区中删除,工作区文件不删除,但变成未跟踪状态
移动文件
git mv <file-from> <file-to>
交互式暂存
-
git add -i交互式暂存

-
git add -p或git add --patch部分文件暂存
储藏
- 转换分支之前,工作区或者暂存区有修改内容,但暂时不想提交,则可以使用stash先缓存起来
git stash或git stash save保存当前工作区与暂存区状态,可多次保存git stash save --keep-index只存工作区git stash save --patch部分存储git stash --include-untracked或git stash -u存储包括未跟踪文件git stash -all存储所有东西(与git stash -u是否有区别存疑)git stash list查看stash列表git stash apply <stash-id>恢复工作区与暂存区git stash drop <stash-id>删除stashgit stash pop弹出stash,等于apply加上dropgit stash <branch>创建一个新分支,检出储藏工作时所在的提交,重新在那应用工作,然后在应用成功后扔掉储藏
清理
git clean -f移除工作目录中所有未追踪的文件git clean -d移除空的子目录- 加上
-n预览将会移除什么
标签
- 标签分为轻量标签(lightweight)和附注标签(annotated)两类
git tag查看所有标签git tag -l '<format>'以format格式搜索标签git tag <tag-name>增加名为tag-name的轻量标签git tag -a <tag-name> -m "<comment>"增加名为tag-name的附注标签,加上comment注释git show <tag-name>显示标签的详细信息git tag <tag-name> <commit-id>针对commit-id这次提交增加tag-name轻量标签git push <remote-name> <tag-name>推送tag-name标签到远程仓库git push <remote-name> --tagsgit tag -d <tag-name>git push <remote-name> :refs/tags/<tagname>git checkout <tag-name>
查看历史
查看提交历史
git log

git log --pretty=format:"<format>"格式化日志
git log --oneline每个提交只显示一行git show <commit-id>查看commit id提交的详细信息git log --follow <file>查看单文件的提交日志
选定提交版本
- 作为commit id的SHA-1校验和在没有歧义的情况下可只写前几位,最少4位
- 分支名代替commit id,即代表分支指针所指的commit的id
- HEAD代替commit id,即代表HEAD指针所指的commit的id
<commit-id>^指向commit-id的父提交。假如commit-id是合并提交,则指向第一父提交<commit-id>~n指向commit-id的上n次提交,也可以用n个^表示 (e.g.<commit-id>~2等价<commit-id>^^)- 合并提交会有多个父提交。第一父提交是你合并时所在分支,而第二父提交是你所合 并的分支
<commit-id>^2指向commit-id的第二父提交。
选定提交区间
git log <excluded-branch>..<included-branch>双点git log ^<excluded-branch> <included-branch> --not <excluded-branch>多点git log <first-branch>...<second-branch>三点 包含且非共有git log --left-right <first-branch>...<second-branch>显示提交属于哪一条分支git log -S<string>文件内容更改包含string的日志搜索
查看命令历史
git reflog或git log -g引用日志,查看Git执行命令的历史
反向流程
一般撤消操作
-
git commit --amend修改最近一次提交 -
git reset HEAD <file>暂存区被重置为HEAD树的状态 -
git checkout <file>或git checkout -- <file>检出文件file在Git仓库(是否包含暂存区存疑)的最新快照,工作区的修改被丢弃,file前加上双横线为了防止与分支名冲突
reset
git reset <commit-id>命令会移动HEAD指针以及HEAD所指的分支指针git reset --soft <commit-id>数据区域只重置HEAD树,重置到commit-id的状态

git reset <commit-id>或git reset --mixed <commit-id>数据区域重置HEAD树与暂存区
git reset --hard <commit-id>数据区域重置HEAD树、暂存区以及工作目录git reset --hard ORIG_HEADreset错误时,可以通过reset到ORIG_HEAD撤销
git reset <file>HEAD指针以及HEAD所指的分支指针不移动,只针对file文件作重置,重置到HEAD树的状态
git reset <commit-id> -- <file>
git reset --soft HEAD~<n>git commit压缩最后n次提交git reset --patch <commit-id> --<file>文件部分reset
checkout
git checkout <commit-id>命令只会移动HEAD指针,且重置暂存区和工作目录的数据git checkout <commit-id> <file>HEAD指针不移动,重置file文件在暂存区和工作目录的数据git checkout <commit-id>commit id不在分支指针位置,也就是不是分支的最新提交,这会使你的仓库处于“分离头指针(detached HEAD)”状态,假如再进行提交操作,新提交会处于匿名分支内git checkout --patch <commit-id> <file>文件部分checkout
reset与checkout的对比
- 指针变化

- 数据区域变化

交互式变基
git rebase -i <parent-commit-id>parent commit id 以后的提交参与变基,不包括自身
- 通过修改头几行前面的命令来更改提交,edit命令将回到该次提交的状态,然后通过
git commit --amend修改提交
- pick 且修改行的顺序,则可以修改提交顺序
- reword 只修改提交注释
- squash 该次提交并入它的父提交(下图三次提交合并成一次)

revert
git revert <commit-id>再提交一次,新提交的变更内容是取消了commit id提交的修改