0x.00 前言
Git 是一个功能强大、复杂的分布式VCS(version control system)
版本控制系统。它是针对开源项目的开发模式设计的,它极其适合管理大项目,有着令人难以置信的非线性分支管理系统。它的出现改变了软件开发流程,大大地提高了开发流畅度。随着Git代码托管服务越来越流行(github、gitlab、gitee),Git 成为了当今主流源代码管理首选,很多公司、个人将项目上传至 Git平台进行代码托管。
Git优缺点如此明显,爱它的人爱死,恨它的人恨死。它功能强大毋庸置疑,但是它概念繁多复杂且命名随意、命令行语法命名随意且不一致、命令行帮助提示晦涩难懂、缺乏良好的封装等等缺点让人无力吐槽。
虽然一般情况下只需要掌握git的几个常用命令即可满足日常工作,但是在使用的过程中难免会遇到各种复杂的情况,不得不面对底层实现,这时候经常需要搜索命令和参数,非常麻烦,让初学者头大。
对于初学者,每次代码合并提交时都是心跳加速的时候!我的代码哪里去了呢? 咋没保存成功?!白忙活了! 怎么办还能找回吗? 返回的提示信息啥意思啊 我到底需要干什么啊?....
瑕不掩瑜,优秀的工具软件还是需要学习掌握的。接下来我们化繁从简,通过融入示例情景的方式学习Git命令,实现快速入门。
本系列更多文章详见专栏 📚 Git从放弃到入门 。
0x.01 环境安装
Git官网 提供了下载、文档和其他资源:
Windows
操作系统是 Windows
,下载git for windows进行安装。
Mac
操作系统是 Mac OS
, 使用 brew
命令来安装。git for MacOS
$ brew install git
git --version 版本确认
使用 git --version
命令查看环境是否成功安装,返回版本信息。
$ git --version
git version 2.28.0
0x.02 git config 配置
用户信息
安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改。
$ git config --global user.name "your name"
$ git config --global user.email "your_email@xxx.com"
检查配置信息
使用 git config --list 命令来列出所有 Git 配置。
//查看所有配置项
$ git config -l , --list
...
user.name=Anduril
user.email=egger@outlook.com
...
core.autocrlf
解决跨平台格式化不同导致的各种问题。Windows 使用回车(CR)和换行(LF)两个字符来结束一行,而 macOS 和 Linux 只使用换行(LF)一个字符,会极大地扰乱跨平台协作。
Unix/Mac用户
# 提交时转换为LF,检出时不转换
$ git config --global core.autocrlf input
# 提交包含混合换行符的文件时给出警告
$ git config --global core.safecrlf warn
Windows 用户
# 提交时转换为LF,检出时转换CRLF
$ git config --global core.autocrlf true
# 提交包含混合换行符的文件时给出警告
$ git config --global core.safecrlf warn
0x.03 创建项目
接下来从头开始创建 git 仓库(repository)。
创建目录/文件
创建一个名为helloworld
的空目录,然后在该目录中创建一个包含以下内容的文件 helloworld.html
。
$ mkdir helloworld
$ cd helloworld
// 新建 helloworld.html,内容如下
Hello, World!
git init 初始化仓库
运行git init
初始化仓库。
使用 git add
命令开始跟踪页面,并处于暂存状态。使用git commit
提交至仓库中。
git add helloworld.html
git commit -m "首次提交"
0x.04 git status 检查存储库的状态
运行 git status
检查存储库的当前状态。
0x.05 进行更改
更改helloworld.html
页面内容。
<h1>Hello, World!</h1>
使用 git status
检查工作目录的状态。
返回结果内容
helloworld.html
文件已更改,但尚未提交到仓库 。- 提示下一步操作。提交
git add <file>
或者撤销git restore <file>
更改。
0x.06 git add 暂存更改
运行 git add
将helloworld.html
放到暂存区,然后再检查目录状态.
$ git add helloworld.html
$ git status
git add 是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。
helloworld.html
已暂存。 它在仓库中时临时的,可以使用 git reset HEAD <file>...
取消暂存这些更改。
暂存与提交
通过分开暂存和提交步骤,可以更加灵活精确的纪录每一个更改提交。
假设您已编辑了三个文件。你可以一次提交所有更改,也可以分开单独提交。
$ git add a.html
$ git add b.html
$ git commit -m "a和b的更改"
$ git add c.html
$ git commit -m "c单独更改"
0x.07 git commit 提交更改
git commit
增加 -m 标识可以提交描述信息。
直接输入git commit
默认编辑器会打开 COMMIT_EDITMSG
文件,输入提交信息,关闭文件后提交成功(如果空信息则终止提交)。
编辑器打开顺序:
- GIT_EDITOR 环境变量
- core.editor 配置设置
- VISUAL 环境变量
- EDITOR 环境变量
提交后,查看目录状态。
文件更改而不是文件
Git聚焦的是对文件的更改,而不是文件本身。使用 git add
命令并不是告诉git将文件添加到仓库中,而是记录文件的当前状态,以便稍后提交。
更改 helloworld.html
内容。
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
暂存下更改。
$ git add helloworld.html
再次修改 helloworld.html
内容。
<html>
<head>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
git status
查看当前状态
helloworld.html
在状态中列出了两次。第一次更改已经暂存并准备提交。第二次更改未暂存。如果现在进行提交,则不会将第二次的更改保存到仓库中。
提交下进行验证
$ git commit -m "添加HTML标签"
$ git status
仍提示由更改尚未暂存。
提交第二次更改。
# 将当前目录所有更改暂存最便捷方法。
$ git add .
# 检查状态 确保不会添加任何不应添加的文件
$ git status
# 提交更改
$ git commit -m "添加 HTML header"
0x.08 git log 查看提交历史
使用git log
命令何查看项目的提交历史。不传入任何参数的默认情况下,git log
会按时间先后顺序列出所有的提交,最近的更新排在最上面。 正如你所看到的,这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
可以看到对仓库所作的总共 4 次提交。
选项 --pretty
--pretty
选项可以使用不同于默认格式的方式展示提交历史。 这个选项有一些内建的子选项供你使用。
单行展示
oneline 会将每个提交放在一行显示,在浏览大量的提交时非常有用。
git log --pretty=oneline
条件过滤
有许多选项可以过滤出匹配指定条件的提交,控制显示结果。
# 列出最多两条提交纪录
$ git log --pretty=oneline --max-count=2
# 列出最近5分钟内的所有提交
$ git log --pretty=oneline --since='5 minutes ago'
# 列出5分钟之前的所有提交
$ git log --pretty=oneline --until='5 minutes ago'
# 列出指定作者的提交
$ git log --pretty=oneline --author=<your name>
# 列出所有分支的提交
$ git log --pretty=oneline --all
格式化
定制记录的显示格式。 --graph
告诉 git 以 ASCII 图形布局的形式显示提交树,--date=short
保持日期格式简短美观。
$ git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short
git log --pretty=format
常用的选项
选项 | 说明 |
---|---|
%H | 提交的完整哈希值 |
%h | 提交的简写哈希值 |
%d | 提交装饰(例如 (HEAD -> master)) |
%T | 树的完整哈希值 |
%t | 树的简写哈希值 |
%P | 父提交的完整哈希值 |
%p | 父提交的简写哈希值 |
%an | 作者名字 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用 --date=选项 来定制格式) |
%ar | 作者修订日期,按多久以前的方式显示 |
%cn | 提交者的名字 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期(距今多长时间) |
%s | 提交说明 |
作者 vs 提交者
作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。 所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者。
📚参考&关联阅读
关注专栏
如果本文对您有所帮助请关注➕、 点赞👍、 收藏⭐!您的认可就是对我的最大支持!
此文章已收录到专栏中 👇,可以直接关注。