Git基础
Git基础#
如需查看详细版本,请翻阅:https://git-scm.com/book/en/v2
1. 获取仓库#
-
从已存在目录中初始化仓库
// 基础版 git init
-
克隆现有的仓库
// 基础版 git clone https://github.com/libgit2/libgit2 // 指定本地目录名 git clone https://github.com/libgit2/libgit2 mylibgit // 克隆仓库以及其所有的子模块 git clone https://github.com/libgit2/libgit2 --recursive
2. 基础提交命令的使用#
-
查看仓库状态
// 基础版 git status // 精简输出结果 git status --short
-
跟踪文件(将已跟踪的文件放入暂存区)
// 基础版 git add readme.md // 直接添加所有本地被修改的文件 git add .
-
.gitignore文件的使用
# 忽略所有的 .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
GitHub有一个针对大多数语言的.gitignore文件列表:https://github.com/github/gitignore
-
查看已暂存和未暂存文件之间的差异(这个一般用图形化的工具查看比较方便)
// 查看未暂存的提交更新了哪些内容 git diff // 查看暂存区和最后一次提交的文件差异 git diff --staged
-
删除文件(从暂存区移除,然后提交)
// 从工作目录中删除文件 rm README.md // 记录此次删除文件的操作 git rm README.md // 从暂存区移除,但是在当前工作目录中保存 git rm --cached README.md // 删除当前目录下所有名字以~结尾的文件 git rm \*~
-
移动文件(相当于重命名操作)
// 对文件重命名 git mv README.md MEREAD.md // mv命令的本质相当于运行了以下三条命令 mv README.md MEREAD.md git rm README.md git add MEREAD.md
3. 和Log相关的命令#
- 查看log
// 基础版
git log
// 查看指定数量的提交
git log -n
// 显示每次提交的差异
git log -p(-patch)
// 格式化输出
git log --pretty=oneline
git log --pretty=format: "%h - %an, %ar : %s"
// 显示最近一段时间的所有提交
git log --since=2.weeks
// 指定作者
git log --author=yaya
Git Log常用的格式化输出选项如下:
%H |
提交的完整哈希值 |
---|---|
%h |
提交的简写哈希值 |
%T |
树的完整哈希值 |
%t |
树的简写哈希值 |
%P |
父提交的完整哈希值 |
%p |
父提交的简写哈希值 |
%an |
作者名字 |
%ae |
作者的电子邮件地址 |
%ad |
作者修订日期(可以用 --date=选项 来定制格式) |
%ar |
作者修订日期,按多久以前的方式显示 |
%cn |
提交者的名字 |
%ce |
提交者的电子邮件地址 |
%cd |
提交日期 |
%cr |
提交日期(距今多长时间) |
%s |
提交说明 |
Git Log的常用选项如下:
选项 | 说明 |
---|---|
-p |
按补丁格式显示每个提交引入的差异。 |
--stat |
显示每次提交的文件修改统计信息。 |
--shortstat |
只显示 --stat 中最后的行数修改添加移除统计。 |
--name-only |
仅在提交信息后显示已修改的文件清单。 |
--name-status |
显示新增、修改、删除的文件清单。 |
--abbrev-commit |
仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。 |
--relative-date |
使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。 |
--graph |
在日志旁以 ASCII 图形显示分支与合并历史。 |
--pretty |
使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。 |
--oneline |
--pretty=oneline --abbrev-commit 合用的简写。 |
显示Git Log输出的常用选项如下:
选项 | 说明 |
---|---|
-n | 仅显示最近的n条提交 |
--since,--after | 仅显示指定时间之后的提交 |
--until,--before | 仅显示指定时间之前的提交 |
--author | 仅显示作者匹配指定字符串的提交 |
--committer | 仅显示提交者匹配指定字符串的提交 |
--grep | 仅显示提交说明中包含指定字符串的提交 |
-S | 仅显示添加或删除内容匹配指定字符串的提交 |
4. 和撤销相关的命令#
注意,有些撤销操作是可逆的,但是有些撤销操作是不可逆的,需要谨慎操作。
// 修改最新的一次提交的提交内容(本质上是用另一个提交覆盖之前的提交)
git commit --amend
// 取消暂存的文件
git reset HEAD CONTRIBUTING.md
// 撤销对文件的修改(极其危险的命令,无法恢复)
git checkout -- CONTRIBUTING.md
5. 和“远程”仓库相关的命令#
远程表示仓库不在你本地的主机上
// 查看已经配置的远程仓库服务器
git remote
// 显示远程仓库的简写名字以及其对应的URL
git remote -v
git remote命令会列出你指定的每个远程服务器的简写,如果你已经克隆了自己的仓库,那么至少会看到origin,因为这个git给你克隆的仓库服务器的默认简写名字。
// 给本地仓库添加远程仓库(后续可以用字符串<shortname>来代替URL)
git remote add <shortname> <url>
// 从远程仓库中获取数据,执行之后可以拥有那个远程仓库的所有分支的引用,并且随时查看和合并
git fetch <shortname>
// 推送到远程仓库
git push <shortname> <branch>
// 查看某个远程仓库的具体信息
git remote show <shortname>
// 修改一个远程仓库的简写名字
git remote rename old_name new_name
// 移除一个远程仓库
git remote remove <shortname>
6. 打标签#
和其他版本控制系统(VSC)一样,Git可以给仓库历史中的某个提交打上标签,用来表示一些信息。通常我们会用这个功能来标记发布节点(v1,v2)。
// 列出标签
git tag
// 根据特定的模式查找标签
git tag -l "v1.8.5*"
// 创建一个附注标签
git tag -a v1.4 -m "version 1.4"
// 查看标签信息以及对应的提交信息
git show v1.4
// 创建一个轻量标签
git tag v1.4-1w
// 显示轻量标签
git show v1.4-1w
Git支持创建两种标签,轻量标签——lightweight和附注标签——annotated
轻量标签只是某个特定提交的引用,本质上是把提交校验存储到一个文件中,没有保存任何其他的信息。附注标签是存储在Git数据库中的一个完整对象,通常我们使用附注标签。
// 后期补充标签
git tag -a v1.2 <commit_id>
// 推送本地指定标签
git push origin v1.5
// 推送本地全部标签
git push origin --tags
// 删除本地标签
git tag -d v1.5
// 删除远程标签
git push origin --delete <tagname>
注意,git push命令默认不会推送标签到远程服务器上。而且推送标签会同时推送lightweight和annotated,没有选项可以只选择推送其中一种标签。
// 检出标签,查看对应标签指向的文件版本
git checkout v1.5
git checkout命令会让你的仓库处于detached head状态(分离头指针),这个状态下如果你做了一些修改并且提交,你的标签不会发生任何变化,而且新的提交也不属于任何分支,并且无法访问,只能通过确切的提交哈希才可以访问他们,因此,不建议在分离头指针状态下进行修改并提交。
7. Git命令别名#
通过Git命令别名,可以让你的Git体验更加简单,容易熟悉。
// 给checkout命令起别名
git config --global alias.co checkout
// 给commit命令起别名
git config --global alias.br branch
不仅可以给现有的命令关键字起别名,还可以整合参数
git config --global alias.unstage 'reset HEAD --'
// 下面两个命令等价
git unstate fileA
git reset HEAD -- fileA
// 简单的获取第一个log: git last
git config --global alias.last 'log -1 HEAD'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix