最近比较完整的学习了一遍《Pro Git》这本书,书中的版本是Version 2.1.33。虽然之前了解和使用过一些git命令,但碰到一些更复杂的使用场景还是明显感觉到很茫然。这本书既讲的很深入,也很通俗易懂。下面的内容都是学习这本书的总结。
我学习时本地的git版本是windows 2.24.1。
$ git --version
git version 2.24.1.windows.2
在 Fedora 上可以使用 yum:
$ sudo yum install git
在基于 Debian 的发行版上,可以使用 apt-get
$ sudo apt-get install git
在Windows上,打开https://git-scm.com/download/win,下载安装包进行安装。
初次运行 Git 前的配置
Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位
置:
1. /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的git config 时,它会从此文件读写配置变量。
2. ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 可以传递 --global 选项让 Git读写此文件。
3. 当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。
配置用户名称和邮件地址
$ git config --global user.name "XXXX"
$ git config --global user.email [email protected]
配置默认文本编辑器。windows上可以不用配,默认用vim编辑。
$ git config --global core.editor emacs
检查配置信息
$ git config --list
或者只查看global配置
$ git config --global --list
获取帮助
$ git help
$ git --help
$ man git-
获取git仓库的2种方式
1. 在已存在目录中初始化仓库
$ git init
2. 克隆现有的仓库
$ git clone url
缩短状态命令的输出
$ git status -s
M README 被修改了但是还没被放入暂存区
MM Rakefile 在工作区被修改并提交到暂存区后又在工作区中被修改了
A lib/git.rb 新添加到暂存区
M lib/simplegit.rb 新修改添加到暂存区
?? LICENSE.txt 未跟踪
提交到本地仓库
$ git add 将修改提交到暂存区
$ git commit -m 'add file' 将暂存区的内容提交
或者
$ git commit -am 'add file' 直接提交,省去了暂存的操作
忽略文件.gitignore
文件.gitignore 的格式规范如下:
• 所有空行或者以 # 开头的行都会被 Git 忽略。
• 可以使用标准的 glob 模式匹配。
• 匹配模式可以以(/)开头防止递归。
• 匹配模式可以以(/)结尾指定目录。
• 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
比较差异
$ git diff 比较工作区与暂存区
$ git diff --staged 或 git diff --cached 比较暂存区与HEAD
$ git diff HEAD -- test1.txt 比较HEAD与工作区 test1.txt文件的差异
$ git diff --no-index -- test1.txt test2.txt 比较指定的2个文件 test1.txt和test2.txt的差异
$ git diff 5124f500 -- test1.txt 比较commit与工作区 test1.txt文件的差异
$ git diff 5124f500 64017f411 -- test1.txt 比较2个commit test1.txt文件的差异
$ git diff master 64017f411 -- test1.txt 比较2个commit test1.txt文件的差异
$ git diff master feature1 -- test.txt
删除操作
git rm 从已跟踪文件清单中移除文件,并连带从工作目录中删除指定的文件
git rm --cached README 从Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中
$ git rm log/\*.log 可以使用 glob 模式
移动文件
$ git mv file_from file_to
查看提交历史
git log --pretty=oneline 或 git log --oneline 单行显示
git log --graph --pretty=oneline --abbrev-commit 查看分支合并图
git log -p -2 git log 选项 -p会显示每次提交所引入的差异, -2 只显示最近2次提交
git log --stat 每次提交的简略统计信息,可以使用 --stat 选项
git log --oneline --all --graph 查看多分支的情况
$ git log --no-merges issue54..origin/master 只显示所有在后面分支(origin/master)但不在前面分支( issue54)的提交列表
$ git log -p featureA..origin/featureA 与上一条命令相似,显示origin/featureA相对于featureA 的差异提交
$ git log -p HEAD^..HEAD 显示当前与上一个提交的差异提交,并展示git diff的比较信息。
撤销操作
重新提交或修改最后一次提交的信息-
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
取消暂存的文件
git restore --staged file 撤销暂存区的修改(不会影响工作区)
git restore file 撤销工作区的修改
远程仓库的使用
$ git remote -v 查看远程仓库
$ git remote add 添加远程仓库
$ git fetch origin 拉取
$ git push origin master 推送
$ git remote show origin 查看某个远程仓库
$ git remote rename pb paul 将 远程仓库pb重命名为 paul
$ git remote rm paul 删除远程仓库
打标签
$ git tag 列出标签
$ git tag -l 'v1.8.5*' 使用特定的模式查找标签
有2种类型的标签:轻量标签(lightweight)与附注标签(annotated)
一个轻量标签很像一个不会改变的分支——它只是一个特定提交的引用。
附注标签是存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。
$ git tag -a v1.4 -m "my version 1.4" 创建一个附注标签,运行 tag 命令时指定 -a 选项
$ git show v1.4 查看标签信息
$ git tag v1.5 创建一个轻量标签
$ git tag -a v1.2 9fceb02 在某个提交上打标签
$ git push origin v1.5 显式地推送标签到共享服务器上
$ git push origin --tags 把所有不在远程仓库服务器上的标签都推送过去
$ git tag -d v1.4-lw 删除标签
$ git push origin :refs/tags/v0.9 删除远程标签
$ git push origin :refs/tags/v1.4-lw 从任何远程仓库中移除这个标签
$ git checkout 2.0.0 查看某个标签2.0.0所指向的文件版本(会使你的仓库处于“分离头指针(detacthed HEAD)”状态)
$ git checkout -b version2 v2.0.0 基于标签v2.0.0创建一个新分支version2
Bug分支处理策略
$ git stash 把当前工作现场“储藏”起来,等以后恢复现场后继续工作
$ git stash list 查看工作现场
恢复工作现场
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了
git cherry-pick
为git命令创建别名
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
通过修改用户家目录下的.gitconfig也可以创建别名
kuang@LAPTOP-A42TLRAL MINGW64 ~
$ cat ~/.gitconfig
...
[alias]
dog = log --all --decorate --oneline --graph
st = status
ch = checkout
ci = commit
co = checkout
br = branch
其他更多的操作,可以参考:
http://www.ruanyifeng.com/blog/2019/12/git-undo.html
https://www.yiibai.com/git/git_rebase.html