Git Cheat Sheet
参考
https://github.com/suzeyu1992/GitOperateDemo#%E8%B7%9F%E8%B8%AA%E5%88%86%E6%94%AF
实用
删除添加.gitignore文件前错误提交的文件:
$ git rm -r --cached .
$ git add .
$ git commit -m "remove xyz file"
基本配置
配置用户信息
$ git config --global user.name "name"
$ git config --global user.email xxx@163.com
配置别名
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
.gitignore文件
可以配置git不跟踪的文件
如:
# 忽略所有以 .c结尾的文件
*.c
# 但是 stream.c 会被git追踪
!stream.c
# 只忽略当前文件夹下的TODO文件, 不包括其他文件夹下的TODO例如: subdir/TODO
/TODO
# 忽略所有在build文件夹下的文件
build/
# 忽略 doc/notes.txt, 但不包括多层下.txt例如: doc/server/arch.txt
doc/*.txt
# 忽略所有在doc目录下的.pdf文件
doc/**/*.pdf
基本操作
初始化
$ git init
添加文件到暂存区
# 添加全部暂存区和历史区不存在的或者有更改的 `.c`结尾的文件
$ git add *.c
# 添加全部暂存区和历史区不存在的或者有更改的文件
$ git add .
# 指定文件添加
$ git add test.c
status仓库
$ git status
# 如果需要显示一种紧凑式格式
$ git status --short # 等价于 $ git status -s
diff仓库
# 查看以追踪但尚未暂存的文件更新了哪些部分, 不添加额外参数
$ git diff
# 对使用了add添加到了暂存区的内容, 使用--staged参数或者--cached
$ git diff --staged
提交更新
# 常规做法
$ git commit -m "commit message"
# 如果不使用-m参数添加提交信息, git会使用默认的编译器如vi进行提交描述编写.
# 可通过$ git config --global core.edit 设定喜欢的编译器
# 跳过暂存区操作, 直接从工作区提交到历史区
$ git commit -a -m ""
# 等价于: $ git commit -am ""
移除文件
//当执行了这条语句之后, 只需要在下一次commit即可, 不需要考虑额外操作. 等价于如下:
$ mv file_from file_to
$ git rm file_from
$ git rm file_to
查看提交记录
# -p:仅显示最近x次的提交 格式 $ git log -p -x
$ git log -p -2 # 查看最近的两次提交内容
# --stat:简略的显示每次提交的内容更改, 如哪些文件变更,多少删除,多少添加等
$ git log --stat
# --pretty: 指定默认不同格式展示信息
$ git log --pretty=oneline #每次提交用一行显示
$ git log --pretty=format:"%h - %an, %ar : %s"
# 效果:1a99c42 - 苏, 19 hours ago : 无意义提交
# 使用限制符-S后面紧跟要查询的字符串
$ git log -Smethod_name
# 或者针对一个文件进行更改的提交查询, 只需要在后面追加文件名称即可
$ git log fileName
git log --pretty="%h - %s" --author=苏 --since="2016-11-01" \
--before="2016-11-07"
撤销操作
amend 重新提交
$ git commit -m "版本1.5开发代码"
# 正当你松了一口气的时候发现配置文件忘记修改了, 你赶紧修改,并适合用add到暂存区
$ git add project.property
$ git commit --amend
# 你会神奇的发现你没有增加任何多余的操作就把漏掉的文件补齐到最后一次提交中
取消暂存文件(add之后)
# 让暂存区的文件变成文件修改但是没有添加暂存区的状态
$ git reset HEAD fileName
撤销对文件的修改 (add 之前)
$ git checkout -- filename
标签
列出标签
$ git tag
# 如果你只关心某一部分的标签, 例如只对v2.x的标签感兴趣,你可以这样做
$ git tag -l 'v2.*'
添加标签
$ git tag -a v1.0 -m '附加信息'
$ git tag v1.0
# 可以先使用git log --oneline获取提交历史的hash值
$ git log --oneline
# 然后把hash值赋值到标签语句之后
$ git tag -a v1.1 a6b4c97
# 共享标签
$ git push origin v1.4
# 如果想把本地上所有在远程服务器上的不存在标签删除掉,可以这样
$ git push origin --tags
# 标签处创建分支
$ git checkout -b checkbranch2 v2.0
查看标签内容
$ git show v1.4
分支操作
创建
$ git branch dev
# 上面的只是创建了一个分支. 并没有切换, 可以使用一条命令创建并且换到新分支
$ git checkout -b dev
# 可以通过`git log`命令查看各个分支所指向的对象
$ git log --oneline --decorate
# 如果你想查看图形式的分叉历史,可以这样:
$ git log --oneline --decorate --graph --all
分支切换
$ git checkout dev
分支合并
$ git merge dev
分支删除
# 删除dev分支
$ git branch -d dev
# 如果dev分支还有未提交的内容,为了保证你的数据安全git默认是不允许删除,可以使用`-D`强制删除
$ git branch -D dev
分支管理
$ git branch # 其中一个分支前面的*代表,目前检出的分支就是HEAD指针所指向的分支
# 追加-v参数 可以展示每一个分支最后一次提交
$ git branch -v
# --merged:查看那些分支已经合并到当前分支
$ git branch --merged # 一般这个列表展示的除了*号的其他分支, 都可以删除
# --no-merged:查看所有包含未合并工作的分支
$ git branch --no-merged
变基
# rebase <目标分支名> [需要移动变基底的分支]
# 将其他分支的提交rebase到master
$ git rebase otherbranch master
# 此时目标分支后面会追加另一个分支的提交. 此时只需要切换到master分支,合并分支即可.
$ git checkout master
$ git merge experiment
远程分支
# 获得远程的仓库列表
$ git ls-remote origin
# 如果想获得更多的信息
$ git remote show origin
# 查看远程分支和本地分支
$ git branch -a
拉取远程分支
$ git checkout -b dev origin/dev
创建远程分支
$ git push origin dev
删除远程分支
# 删除远程dev分支
$ git push origin --delete dev
跟踪分支
$ git checkout --track origin/dev
# 如果想要自定义本地分支名字
$ git checkout -b 任意分支名字 origin/dev
# 设置HEAD指向的分支的上游为远程dev分支
$ git branch -u origin/dev
# 查看所有跟踪分支
$ git branch -vv
远程仓库操作
拉取信息
# clone 仓库
$ git clone <url>
# 如果你想创建自己的仓库名, 就是本地根文件夹的名称, 那么可以如下追加名称
$ git clone <url> [dirName]
# 默认查看远程仓库的方式
$ git remote
# 查看远程仓库的读写权限. 如果可以看到(push)说明提交的推送
$ git remote -v
# 详细信息
$ git remote show origin
# 格式: git remote add [shortName] <url> 同时可以指定一个仓库的引用名称,例如
$ git remote add rp git@github.com:suzeyu1992/GitOperateDemo.git
# 此时你想对新加的远程进行拉取动作, 只需要使用之前的引用名称就可以
$ git fetch rp
# 拉取
$ git pull
# 推送
$ git push origin master
远程仓库重命名和删除
$ git remote rename oldName newName
$ git remote rm 仓库名