示意图
仓库
// 将当前目录初始化为git仓库
$ git init
// 新建一个目录,初始化为git仓库
$ git init [project-name]
// 下载项目及代码历史
$ git clone [url]
// 克隆远程仓库,同时自定义本地仓库名称
$ git clone [url] [my-project-name]
配置
// 显示当前配置
$ git config --list
// 编辑git配置文件
$ git config -e --global
// 设置代码提交时的用户信息
$ git config --global user.name "username"
$ git config --global user.email "email"
忽略文件
文件.gitignore
格式规范:
- 所有空行或者以 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
- 匹配模式可以以(/)开头防止递归
- 匹配模式可以以(/)结尾指定目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc] 匹配
任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); 问号(?)只
匹配一个任意字符;如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配
(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号()表示匹配任意中间目录,比如 a//z 可以
匹配 a/z 、 a/b/z 或 a/b/c/z 等。
我们再看一个 .gitignore 文件的例子:
# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
stash暂存
# 保存当前工作区与暂存区的状态,将修改内容保存到git栈
# 可以多次添加,会生成编号,stash@{num}
git stash
# 暂存修改内容并添加注释,方便查找
git stash save '注释'
# 默认将最近一次的修改内容恢复,同时栈中删除当前修改信息
git stash pop
# 查看stash的所有内容
git stash list
检查文件状态
# 查看当前工作区的文件状态,比如有些文件被修改,有些文件被添加,等等
$ git status
# 得到更为简洁的状态信息
$ git status --short
$ git status -s
# 查看更详细的内容修改
$ git status -v
# 查看尚未暂存的改动
$ git diff
# 查看已暂存需要添加到下次提交的内容,下面两条命令作用相同
$ git diff --staged
$ git diff --cached
添加
// 添加当前目录下所有修改的文件
$ git add .
// 添加当前目录下某个文件 或多个文件(空格隔开)
$ git add [file1] [file2] [file3]
// 添加当前目录下 某个目录(包括其下的子目录)
$ git add [dir]
// 添加某个目录下的目录或文件,可以进入该目录操作,方法同上
提交
# 提交更改
$ git commit -m '提交信息'
# add 和commit放在一起执行
$ git commit -am '提交信息'
$ git commit -a -m '提交信息'
# 查看提交历史
$ git log
# 查看提交简略信息
$ git log --stat
# 按补丁格式显示每次提交引入差异
$ git log --patch
$ git log -p
# 查看最近n次提交信息,可配合其他命令使用
# eg:git log -2
$ git log -n
# 在日志旁以ASCII图形显示分支与合并历史
$ git log --graph
# 一行显示提交信息
$ git log --oneline
删除(待补充)
// 删除工作区当前目录文件,并将这次删除放到暂存区
$ git rm [file1] [file2]
// 改名文件,并将这个改名放入暂存区
$ git mv [file-origin] [file-renamed]
查看提交历史
# 查看所有提交日志,按时间倒序排列
$ git log
# 以补丁的格式输出最近两条日志
# -<n>表示最近的n条提交
$ git -p -2
$ git --patch -2
# 查看提交的简略信息
$ git log --stat
# 在日志旁以ASCII图形显示分支与合并历史
$ git log --graph
# 查看最近两周内的所有提交
git log --since=2.weeks
分支
// 列出本地所有分支
$ git branch
// 列出远程所有分支
$ git branch -r
// 列出所有分支
$ git branch -a
// 新建一个分支,停留在当前分支
$ git branch [branch]
// 新建一个分支并切换到该分支
$ git checkout -b [branch]
// 切换到指定分支,并更新工作区
$ git checkout [branch]
// 切换到上一个分支
$ git checkout -
// 建立追踪关系,在当前分支在指定的远程分支之间
$ git branch --set-upstream=origin/dev dev
// 合并指定分支到当前分支
$ git merge [branch]
// 合并分支有冲突,取消合并
$ git merge --abort
// 删除本地分支
git branch -d [branch]
// 删除远程分支
$ git push origin --D [branch]
$ git push origin --delete [branch]
$ git branch -dr [remote/branch]
// 推送一个本地的空分支到远程分支,相当于删除远程分支
$ git push origin :dev
// 新建远程分支
$ git checkout -b dev
$ git branch -a
// git push [主机名] [本地分支]:[远程分支]
// 远程分支名和本地分支名一致可省略
$ git push origin dev
$ git push origin dev:dev
// --set-upstream(-u)选项会与远程分支建立追踪关系,下次修改代码可以直接push
$ git push --set-upstream origin dev
$ git push -u origin dev
撤销
// 恢复暂存区的指定文件到工作区
$ git checkout [file]
// 将暂存区的文件恢复到工作区
$ git reset HEAD [file]
// 回退到上个版本,并提交到远程仓库
$ git reset --hard HEAD^
$ git push -f(--force) origin dev
// 取消上次提交,返回到Index, ^和~的区别待研究
$ git reset --soft HEAD^
$ git reset --soft HEAD~
// 取消上次提交,返回workspace(本地代码保留)
// --mixed为默认参数可省略
$ git reset HEAD^
$ git reset HEAD^ --mixed
$ git reset -q HEAD -- .
更新分支信息
// 查看分支信息
$ git remote show origin
// 剪除远程仓库已删除,还遗留的远程分支
$ git remote prune origin
// 本地分支直接删除即可
PS:文章参考来自Git官方文档-.-!