以下Git
学习内容,来自官方文档,本文整理学习过程笔记。
Git基础
环境配置
-
设置用户信息
- git config --global user.name "XXX"
- git config --global user.email "YYY"
-
配置文件
- 全局配置文件: /etc/gitconfig,包含系统每个用户以及他们仓库的通用配置。
- 当前用户配置文件: ~/.gitconfig
- 当前仓库的配置文件: .git/config ,针对该仓库有效。
-
查看当前配置
- git config --list
-
查看命令帮助,以
git add
为例子。执行git add -h
。 -
Git别名。
可通过git config
文件来轻松为每一个命令设置一个别名git config --global alias.co checkout git config --global alias.st status git config --global alias.br branch
-
设置git的默认提交模板文件,
git config --global commit.template ~/.gitmessage.txt
不同平台的换行格式化功能
Windows平台上使用CRLF来结束一行,linux平台上使用LF。Git可以在你提交时自动将回车和换行转换为换行,而在检出代码时将换行换回回车和换行。
在windows平台上,设置如下选项:git config --global core.autocrlf true
在Linux平台上,不需要Git在检出文件时进行自动转换。然而当一个以回车加换行作为行结束符的文件不小心被引入时,Git能不能修正呢?可以,通过
git config --global core.autocrlf input
让git只在捡入时进行转换,检出时不再转换。
如果仅仅是在windows平台上开发项目,可将此项设置为false,在版本库中保留回车换行符号。git config --global core.autocrlf false
忽略文件
在仓库根目录下新建.gitignore
文件,列出要忽略的文件模式匹配符,以免将来误提交这类无用文件。
GitHub
有一个十分详细的针对数十种项目及语言的.gitignore
文件列表。
全局忽略文件,通过以下命令来设置
git config --global core.excludesfile ~/.gitignore_global
在~/.gitignore_global
中进行编辑,使之全局有效,所有版本库都保持一样的忽略文件列表。
以下是一个简单例子:
# 忽略所有的 .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
基础操作
- 查看当前
Git
状态:git status
- 新增文件到暂存区:
git add fileName
。- git add:
- 用于跟踪新文件
- 将已跟踪的文件放到暂存区。
- 合并时,把有冲突的文件标记为已解决状态。
- git add:
- 从暂存区中去掉暂存:
git reset fileName
- 提交暂存区文件到本地仓库:
git commit -m "comment"
- 合并1和3的操作,
git commit -a -m "comment"
- 比较差异
git diff
: 比较工作目录和暂存区域快照之间的差异。(如果全部add的话,git diff不会显示差异)git diff --staged
:比较暂存区域快照和仓库之间的差异。git diff --check
: 检测未暂存的文件是否有空白提交错误git commit
:启动默认文本编辑器来输入提交说明。可以通过-m选项将提交信息与命令放在同一行。提交说明为空时会禁止提交。git commit -m "XXXX: Fix benchmarks for speed."
- 提交信息应当少于50个字符(25个汉字)的单行开始且简要地描述变更,接着是一个空白行,再接着是一个更详细的解释。分隔摘要与正文是必须的,如果将两者混合在一起,那么类似变基等工具无法正常工作。
*在提交描述中输入 #<编号>,可引用任何一个PR请求或者Issue编号。
- 提交信息应当少于50个字符(25个汉字)的单行开始且简要地描述变更,接着是一个空白行,再接着是一个更详细的解释。分隔摘要与正文是必须的,如果将两者混合在一起,那么类似变基等工具无法正常工作。
- 删除跟踪文件:
git rm
- 文件重命名:
git mv Afile BFile
查看提交历史
git log
默认情况下,会按照时间先后顺序列出所有提交,最近的更新排在最上面。该命令有许多选项,此处列出其最常用的选项:
- -p:显示每次提交所引入的差异(按补丁的格式输出),当进行代码审查,或者快速浏览某次提交所带来的变化时,很有用。
- -n:显示最近的n次提交。
- --stat:查看每次提交的简略统计信息
- --pretty:以不同方式展示提交历史,有很多子选项可供使用。
- oneline:每个提交放在一行显示
- format:定制记录的显示格式,有助于提取日志分析。
- git log --pretty=format:"%h - %an, %ar : %s"
- %h:提交的简写哈希值
- %an:作者名字
- %ar:作者修订日志,按多久之前的方式显示
- %s: 提交说明
- git log --pretty=format:"%h - %an, %ar : %s"
- --graph:在输出日志旁以ASCII图形显示分支与合并历史
- --since:按时间做限制,例如: --since=2.weeks,列出最近两周的所有提交。类似的有until,在指定时间之前的提交。
- --author:显示指定作者的提交
- --grep:搜索提交中的关键字
- -S function_name: 找出添加或删除某个特定函数引用的提交
- -- file/dir_path:只关心某个文件或目录的历史提交,将该路径选项放到最后位置。
- --no-merges:排除掉合并提交
- --decorate:查看各分支当前所指的对象
git log master..experiment
:想查看experiment分支中海油哪些提交尚未合并入mater分支
git log origin/master..HEAD
查看即将推送到远端的内容与实际远端的差异。输出在当前分支中,而不再远程origin分支中的提交。
修改上次提交
有时候提交完后发现漏提交文件,或者提交信息写错,此时,可以运行带 --amend
选项来重新提交。
git commit --amend
这样可以修改前一次提交的信息,同时将本次提交的修改合并到前一次中,在log
中只保留一条记录。
修复提交最明显的价值是可以稍微改进最后的提交,而不会让“啊,忘了添加一个文件”或者“小修补,修正笔误”这种提交信息扰乱你的仓库历史。
打标签
Git
可以给仓库历史的某次提交打上标签,以示重要,比如V1.0
,V2.0
等等。
列出已有标签: git tag -l “XXMatch”
,可根据字符串来搜索匹配的标签
Git
支持两种标签,
- 轻量标签,它是某个特定提交的引用
git tag v1.4
。只显示提交信息,不会显示打标签的作者信息。
- 附注标签:支持打标签者名字、邮件、日期和标签信息。建议用这种。
git tag -a 标签名称 -m "remark"
- 给指定提交打上标签,先用
git log --pretty=oneline
查看提交历史,得到特定提交的部分校验和,然后执行git tag -a 标签名称 校验和 -m "remark"
git show 标签名称
: 查看标签和与之对应的提交信息。
默认情况下,标签不会推送到远程服务器,可使用
git push origin <tagname>
,推送单条标签git push origin --tags
,推送多条标签
删除本地标签:git tag -d
删除远程标签:git push origin --delete
如果需要查看某个标签的版本,并修复该版本中的错误,通常需要据此标签创建一个新分支,在此分支上进行提交。git checkout -b version2 tagname