git 仓库特点
- 使用快照流
- 近乎所有操作都是本地执行
- 一般只添加数据
三种状态:modified -> committed -> staged
在 Git 中任何已提交的东西几乎总是可以恢复的。甚至那些被删除的分支中的提交或使用 --amend 选项覆盖的提交也可以恢复。然而,任何你未提交的东西丢失后很可能再也找不到了。
config
全局读:~/.gitconfig(在无.git目录下 或者 加上--global 参数)
项目读:.git/config
- git config --list
列出当前所有配置信息 - git config <key>
查询某一项配置信息
status
git status -s 简短输出各文件状态
diff
git diff 查看未放入暂存区的文件变化
git diff --cached 查看已放入暂存区的文件变化
commit
git commit -a 可以跳过 git add . 步骤
git commit --amend 提交后发现忘记了暂存某些需要的修改,可以使用此命令,最终只会有一个提交 - 第二次提交将代替第一次提交的结果
reset
- git reset:回滚 git add 操作
- git reset --soft HEAD^:回滚最近一次提交(commit)
- git reset --hard HEAD~n:永久删除最近的 n 个提交
- git reset --hard:回滚 git pull 操作
- git reset -- {fileName}:回滚 git add fileName 操作
- git reset --keep {tagName}:回滚到 tagName 之前
rm
git rm 从已跟踪文件清单中移除(确切地说,是从暂存区域移除)
git rm --cached 把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中
mv
git 不会显示地跟踪文件的重命名和移动
所以需要使用git mv命令
git mv {originFile} {targetFile}
相当于以下三条命令
mv {originFile} {targetFile}
git rm {originFile}
git add {targetFile}
log
git log 查看提交历史
-p 查看提交历史的变化
-2 查看最近两次提交
--stat 查看简略信息
--pretty=oneline 一行表示一次提交信息
--pretty=format:"%h - %an, %ar : %s" 指定格式显示提交信息
tag
- git tag:列出已有的标签
- git tag -a {tagName} -m {‘description’}:创建标签
- git tag -s {tagName} -m {‘description’}:使用私钥创建标签
- git tag -d {tagName}:删除标签
- git tag {tagName}:创建轻量级标签(无描述)
- git tag -a {tagName} {HEAD} -m {‘description’}:对某一次提交打上标签
- git push --tags:分享标签
show
git show 命令指定提交ID(hash HEAD)来查看具体的变化
stash
git stash 将当前工作区的更改隐藏起来 保存在一个栈中
git stash pop 将隐藏栈顶部的工作去更改推出
git stash list 显示当前的隐藏栈
git stash 详解
git工作流程
- 将Git的一个存储库克隆为工作副本。
- 可以通过添加/编辑文件修改工作副本。
- 如有必要,还可以通过让其他开发人员一起来更改/更新工作副本。
- 在提交之前查看更改。
- 提交更改:如果一切正常,那么将您的更改推送到存储库。
- 提交后,如果意识到某些错误并修改错误后,则将最后一个正确的修改提交并将推送到存储库。
rebase
好用的 git rebase
delete branch
- 删除本地分支:git branch -d 分支名称
- 强制删除本地分支:git branch -D 分支名称
- 删除远程分支:git push origin --delete 分支名称
shortlog
git shortlog 统计提交(commit)次数
-s 只显示次数,不显示commit描述
-n 从多到少排序
强行将远程代码回滚
git reset HASH_HEAD
git push -f
.gitignore 存放忽略文件
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf