获取帮助
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 commit
git 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> --tags
git 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_HEAD
reset错误时,可以通过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提交的修改