Git 命令备忘单:您实际使用的命令,以及示例

  1. 首页
  2. 博客
  3. 软件开发

软件开发

Git 命令备忘单:您实际使用的命令,带有示例

实用的 Git 参考,按您尝试执行的操作(从第一次提交到撤消错误)进行分组。工作时保持其打开状态,并在进行任何有风险的操作之前使用撤消指南。

阅读约 8 分钟
Git 命令备忘单:您实际使用的命令,以及示例

要点速览

  • 更改会经过三个区域:工作目录、暂存区域和存储库。
  • git status 是您拥有的最安全的命令,因此请不断运行它。
  • 使用 git revert 撤消共享提交,并保留 git reset --hard 进行您确定的本地工作。
  • git reflog 通常可以挽救您认为丢失的提交。

没有人记得每个 Git 命令,你也不需要记住。此 Git 命令备忘单 重点关注涵盖几乎所有日常工作的小集合,并按您想要执行的工作进行分组。

我们使用 Windows 版 Git 在一次性演示存储库中测试了本地命令,显示的输出来自该运行,并删除了行结束警告。您的提交哈希值会有所不同。远程命令需要服务器,因此我们没有运行它们。版本控制新手?从我们的 Git 初学者教程开始。

Git 如何思考:三个领域

一旦你知道变更发生在哪里,大多数困惑就会消失:

面积 它包含什么 搬到那里的
工作目录 编辑文件时的文件 编辑
暂存区(索引) 为下一次提交选择的更改 git添加
本地存储库 您保存的提交历史记录 git 提交
远程存储库 共享副本,例如在 GitHub 上 git 推送

设置并启动项目

命令 它的作用
git config --全局用户名“Asha” 在提交时设置您的名字
git config --global user.email“a@b.com” 设置您的提交电子邮件
git config --global init.defaultBranch main 命名新的默认分支 main
git初始化 在当前文件夹中创建存储库
git 克隆 <url> 下载现有存储库
git配置--列表 显示您当前的设置

保存您的工作

命令 它的作用
git 状态 显示发生了什么变化
git 添加文件.txt 暂存一个文件
git 添加 . 暂存此文件夹中的所有更改
git添加-p 暂存文件的选定部分
git 差异 显示未暂存的更改
git diff --暂存 显示将要提交的内容
git commit -m“消息” 将分阶段更改保存为提交
git commit -am“消息” 阶段跟踪文件并提交它们

以下是随着新文件的移动,简短状态视图如何变化:

$ echo "hello" > app.txt
$ git status --short
?? app.txt

$ git add app.txt
$ git status --short
A  app.txt

$ git commit -m "Add app file"

?? 表示未跟踪,A 表示添加到暂存中。在两列格式中,左列是暂存区域,右列是工作目录。请注意,git commit -am 会跳过全新文件,因此您必须首先明确添加这些文件。

分支机构

命令 它的作用
git分支 列出当地分支机构
git分支-a 包括远程分支
git 切换功能/登录 移至分行
git switch -c 功能/登录 创建一个分支并移动到它
git 合并功能/登录 将该分支合并到当前分支
git rebase 主要 在 main 之上重放您的提交
git分支-d功能/登录 删除合并分支
git分支-D功能/登录 强制删除未合并的分支

这是从开始到结束的一个小功能分支:

$ git switch -c feature/login
$ echo "login" >> app.txt
$ git commit -am "Add login"
$ git switch main
$ git merge --no-edit feature/login
$ git log --oneline --graph
* d0450b6 Add login
* 676b684 Add app file

$ git branch -d feature/login
Deleted branch feature/login (was d0450b6).

历史是一条直线,因为 main 没有移动,所以 Git 进行了快进合并。您仍然会在旧指南中看到 git checkout。它有效,但较新的 switch 和 restore 命令将其许多工作分解为更清晰的工作。要在合并和变基之间进行选择,请阅读 Git merge 与 rebase。

使用遥控器

命令 它的作用
git 远程-v 列出遥控器及其 URL
git 远程添加源 <url> 连接遥控器
git 获取 下载更改而不合并
git拉 获取,然后集成到您的分支中
git 推送 上传您的提交
git push -u 原始功能/登录 推送新分支并跟踪它
git push origin --删除功能/登录 删除远程分支
git push --force-with-lease git push --force-with-lease 强制推动,但前提是没有其他人推动

fetch 始终安全,因为它永远不会更改您的文件。如果您需要在变基后覆盖分支,请选择 --force-with-lease 而不是普通的 --force,因为它拒绝清除同事的新提交。

隐藏:把工作放在一边

当您需要切换任务但尚未准备好提交时,Stash 非常有用:

$ echo "wip" >> app.txt
$ git stash
$ git status --short
                       # clean, the change is put away
$ git stash pop
$ git status --short
 M app.txt
命令 它的作用
git 存储 保存更改并清理您的工作目录
git stash -u 包括未跟踪的文件
git 存储列表 显示已保存的存储
git stash 流行 恢复最新的存储并将其删除
git 存储应用 恢复它但保留它保存

查看历史记录

命令 它的作用
git log --oneline 每次提交显示一行
git log --oneline --graph --all 绘制所有分支
git log -p 文件.txt 显示文件随时间的变化
git show <哈希> 详细显示一项提交
git 责怪文件.txt 显示最后更改每一行的人
git reflog HEAD 去过的所有地方都显示
git 二等分 二进制搜索添加了错误的提交

撤消错误:“我想……”

这是大多数人查找的部分。找到你的情况:

情况 命令
放弃文件中未暂存的编辑 git 恢复文件.txt
取消暂存文件但保留编辑内容 git 恢复 --staged file.txt
修复上次提交的消息或文件 git commit --修改
撤消最后一次提交,保持更改暂存 git reset --soft HEAD~1
撤消最后一次提交,使更改保持未暂存状态 git 重置 HEAD~1
安全地撤消推送的提交 git 恢复 <哈希>
丢弃所有本地更改 git重置——硬
删除未跟踪的文件 git clean -fd(与-n一起预览)
恢复“丢失”的提交 git reflog,然后 git branch rescue <hash>

提示: 在进行任何冒险之前,请运行 git branch backup。它不需要花费任何费用,并且给你一个可以返回的标签。 git reset --hard和git clean可以永久破坏未提交的工作,甚至reflog也无法恢复。

重置、恢复、恢复

这三个名称引起很多混乱,但它们的作用却截然不同:

命令 作用于 改变历史? 在共享分支上安全吗?
git 恢复 文件 否 是的,但它会丢弃本地编辑
git 恢复 一次提交,通过添加其相反的内容 添加到它 是的
git重置 分支指针 重写它 否

在我们的演示中,我们犯了一个错误的行并将其恢复。文件返回到其先前的内容,而错误在日志中作为历史记录保持可见:

$ echo "oops" >> app.txt
$ git commit -am "Bad change"
$ git revert --no-edit HEAD
$ cat app.txt
hello
login

然后 git reset --soft HEAD~1 删除了最后一次提交,但保留了其更改,git status --short 显示为 M app.txt。

标签

命令 它的作用
git标签 列出标签
git标签 v1.0 创建轻量级标签
git tag -a v1.0 -m "发布" 创建带注释的标签,最适合发布
git推送源v1.0 推送标签(标签默认不推送)

正如我们的 GitHub Actions CI/CD 指南 所解释的,标签通常会触发发布管道。

简单的日常工作流程

git switch main
git pull
git switch -c feature/search
# edit files
git status
git add -p
git commit -m "Add search by product name"
git push -u origin feature/search
# open a pull request, get a review, then merge

编写提交消息来解释命令中的更改,例如“修复登录重定向”。六个月后阅读日志时,您会感谢自己。

常见错误

  • 提交机密。 在以后的提交中删除文件不会将其从历史记录中删除。立即旋转秘密,并使用.gitignore。
  • 重写共享历史记录。 不要重置或变基其他人已经拉取的提交。
  • 盲目使用git add .。首先检查git status,这样构建文件和日志就不会被影响。
  • 使用普通--force。更喜欢--force-with-lease。
  • 进行大量的提交。小的提交更容易审查、恢复和分割。

最后的话

学习这三个领域和十几个命令,Git 就不再那么可怕了。将撤消表放在手边,并记住 git status 和 git reflog 是您的安全网。为了建立信心,创建一个一次性存储库,并故意破坏和修复它,因为这是犯错误最便宜的地方。

常见问题

最常用的 Git 命令有哪些?

日常设置是 git status、add、commit、push、pull、switch、branch、merge 和 log。这几个命令涵盖了典型工作日的大部分时间。

如何撤消 Git 中的最后一次提交?

如果是本地的,请使用 git reset –soft HEAD~1 来暂存更改。如果您已经推送了它,请使用 git revert 以便其他人的历史记录保持完整。

git fetch 和 git pull 有什么区别?

git fetch 仅下载新数据并保留您的文件。 git pull 获取然后将这些更改合并或变基到当前分支中。

git重置和git恢复有什么区别?

git reset 移动分支指针并可以重写历史记录。 git revert 添加了一个新的提交来撤消先前的提交,这使得共享分支上的安全。

我可以在 Git 中恢复已删除的分支吗?

通常,是的。使用 git reflog 查找其最后一次提交,然后使用 git 分支名称后跟哈希值重新创建分支,前提是 Git 尚未清理它。

继续学习

与Stack Quora合作

需要测试、WordPress 或 SEO 方面的帮助?

我们帮助团队交付更好的软件并发展他们的网站。告诉我们您正在做什么,我们将建议明确的下一步。

继续阅读

更多指南 测试、人工智能和现代开发

喜欢这篇文章吗?选择一个主题并直接跳至我们最新的教程。

人工智能

人工智能幻觉解释:语言模型为何会产生幻觉以及如何减少它

人工智能幻觉解释:它们是什么,为什么语言模型产生它们,常见类型,如何通过基础和提示来减少它们,以及我们进行的简单检查。

阅读文章 →
DevOps

环境变量解释:.env 文件、秘密和配置正确完成

使用我们运行的 Python 示例解释环境变量:读取和设置它们、为什么每个值都是字符串、.env 文件、进程继承、秘密和验证。

阅读文章 →
软件开发

API 速率限制解释:算法、标头和处理 429 错误

API 速率限制通过我们运行的模拟进行了解释:令牌桶、固定窗口、滑动窗口、429 响应、速率限制标头、带回退的重试和测试限制。

阅读文章 →
测试自动化

Python 中的模拟:unittest.mock、补丁以及导致测试谎言的错误

使用unittest.mock 在Python 中进行模拟,经过测试:模拟和return_value、side_effect、修补使用名称的位置、spec 和autospec、模拟日期以及常见错误。

阅读文章 →
软件测试

代码覆盖率解释:行覆盖率与分支覆盖率以及 100% 的真正含义

用真实的coverage.py运行来解释代码覆盖率:行、分支和条件覆盖率,阅读报告,为什么100%覆盖率仍然会错过错误,以及合理的目标。

阅读文章 →
数据库与 SQL

SQL 中的 DELETE、TRUNCATE 和 DROP:差异、回滚以及何时使用它们

DELETE、TRUNCATE 和 DROP 通过经过测试的 SQL 进行了解释:各自删除什么、回滚、触发器、身份重置、速度,以及 PostgreSQL、MySQL、SQL Server 和 SQLite 有何不同。

阅读文章 →
数据库与 SQL

SQL 视图解释:创建、使用和避免陷阱(附示例)

SQL 视图通过我们运行的查询进行解释:创建视图、实时结果、隐藏列、性能、可更新和物化视图、破坏的依赖关系和最佳实践。

阅读文章 →
软件开发

TypeScript 接口与类型:真正的差异,使用编译器进行测试

TypeScript 接口与类型,使用真实编译器进行检查:两者都可以做什么,只有一个可以做什么,声明合并,扩展与交集以及要遵循的简单规则。

阅读文章 →
软件开发

Python *args 和 **kwargs 解释:灵活的函数和清晰的示例

Python *args 和 **kwargs 用我们运行的代码进行了解释:打包和解包、参数顺序、仅关键字和仅位置参数、装饰器和常见错误。

阅读文章 →
软件开发

Python Lambda 函数:语法、实际用途以及何时不使用它们

Python lambda 函数用我们运行的代码进行了解释:语法、使用键排序、映射和过滤器、闭包、后期绑定陷阱,以及何时普通 def 是更好的选择。

阅读文章 →
人工智能

什么是人工智能代理?它们是如何工作的,只需运行一个简单的代理循环

什么是人工智能代理?关于代理循环、工具、内存和护栏的简单指南,以及我们运行的一个小型 Python 循环、真正的风险以及何时简单的聊天机器人是更好的选择。

阅读文章 →
DevOps

监控与可观察性:真正的区别,包括日志、指标和跟踪

监控与可观察性解释:已知和未知的故障、日志、指标和跟踪、检查事件演练、黄金信号、OpenTelemetry 和有用的警报。

阅读文章 →
DevOps

Docker Volumes 与 Bind Mounts:以正确的方式保留容器数据

Docker 卷与绑定挂载解释:为什么容器数据消失、命名卷、绑定挂载、tmpfs、Compose 示例、备份、权限以及何时使用它们。

阅读文章 →
测试自动化

TDD 与 BDD:主要区别、以两种方式构建的一个功能以及何时使用每种方式

TDD 与 BDD 的解释是通过一种双向构建的折扣功能:使用我们运行的代码进行红绿重构、Given-When-Then 场景、工具、权衡以及何时使用每种方案。

阅读文章 →
软件测试

用户验收测试 (UAT):流程、清单和真实示例

用户验收测试解释:谁运行它、它与 QA 有何不同、七步流程、UAT 测试用例模板、清单、签核标准和常见错误。

阅读文章 →
数据库与 SQL

SQL NULL 值解释:IS NULL、COALESCE、NULLIF 和要避免的陷阱

通过我们运行的查询解释了 SQL NULL 值:三值逻辑、IS NULL、COALESCE、NULLIF,聚合、连接和排序如何处理 NULL,以及它悄悄引起的错误。

阅读文章 →
数据库与 SQL

SQL CASE WHEN 语句:语法、实例和常见错误

SQL CASE WHEN 解释了我们运行的查询:简单和搜索表单、条件顺序、SUM 透视、COUNT 技巧、自定义排序、更新和要避免的 NULL 陷阱。

阅读文章 →
软件开发

什么是智威汤逊?通过工作示例解释 JSON Web 令牌

什么是智威汤逊? JSON Web Tokens 解释:这三个部分,在我们运行的代码中构建和篡改的令牌,JWT 与会话,存储,刷新令牌和安全错误。

阅读文章 →
软件开发

JavaScript 事件循环解释:调用堆栈、微任务和计时器以及示例

JavaScript 事件循环用我们运行的代码进行了解释:调用堆栈、任务和微任务队列、为什么 setTimeout 0 不是立即执行、阻塞、饥饿和面试测验。

阅读文章 →
软件开发

Python 生成器和 Yield 解释:通过真实示例节省内存

Python 生成器和yield 用我们运行的代码进行了解释:它们如何暂停和恢复、测量内存节省、管道、无限序列、yield from、发送和常见陷阱。

阅读文章 →
人工智能

什么是嵌入?向量和余弦相似度简单解释

什么是嵌入?关于向量、余弦相似度和语义搜索的简单语言指南,其中包含我们运行的一个小示例、常见用途、选择模型和已知限制。

阅读文章 →
DevOps

蓝绿部署与金丝雀部署:差异、权衡以及如何选择

蓝绿部署与金丝雀部署解释:每种部署的工作原理、成本、风险和回滚、我们测试的稳定用户分桶、数据库迁移、滚动更新以及如何选择。

阅读文章 →
测试自动化

不稳定的测试:造成这些问题的原因以及如何彻底解决它们

我们运行的演示解释了不稳定的测试:主要原因、如何确认和诊断、正确的时间修复、共享状态和日期以及隔离过程。

阅读文章 →
软件测试

负载测试与压力测试:差异、指标和 k6 示例

负载测试与压力测试的解释:各自证明什么、峰值和浸泡测试、重要的指标、为什么平均值会误导、k6 个示例以及如何计划测试。

阅读文章 →
软件测试

测试用例与测试场景:主要区别、示例以及何时使用它们

测试用例与测试场景的解释:清晰的定义、并排的表格、从场景到案例的密码重置功能、模板以及何时使用每个功能。

阅读文章 →
数据库与 SQL

SQL 查询优化:读取执行计划并修复慢速查询(带计时)

对一百万行进行 SQL 查询优化测试:读取执行计划、添加正确的索引、修复不可控制的过滤器、使用复合索引和键集分页。

阅读文章 →
数据库与 SQL

SQL UNION 与 UNION ALL:差异、示例和性能测试

SQL UNION 与 UNION ALL 通过我们运行的查询进行了解释:重复、都遵循的规则、真实的数据错误、测量的性能、INTERSECT 和 EXCEPT 以及何时使用它们。

阅读文章 →
软件开发

JavaScript Fetch API 教程:GET、POST、错误处理和超时

针对本地服务器测试的 JavaScript Fetch API 教程:GET 和 POST、为什么不抛出 404、可重用的帮助程序、查询字符串、超时、CORS 和常见错误。

阅读文章 →
软件开发

Python 文件处理:读取、写入、CSV、JSON 和 pathlib 以及示例

使用我们运行的代码解释了 Python 文件处理:打开模式、使用、读取大文件、CSV、JSON、pathlib、二进制文件、安全写入、错误处理和常见错误。

阅读文章 →
软件开发

Python 类和对象:带有实际示例的 OOP 教程

用我们运行的代码解释 Python 类和对象:__init__、方法、类与实例属性、继承、属性、dunder 方法、数据类和常见错误。

阅读文章 →
人工智能

什么是大语言模型?法学硕士如何运作,在没有炒作的情况下进行解释

什么是大语言模型?法学硕士用简单的语言解释:标记、嵌入、注意力、训练、温度和上下文窗口、一个微小的下一个单词演示和真正的限制。

阅读文章 →
DevOps

适合初学者的 Linux 命令:带有示例的基本终端指南

适合初学者的 Linux 命令,按任务分组:导航、文件、查看日志、grep、管道、权限、进程和档案,并附有实用的日志分析示例。

阅读文章 →
测试自动化

Selenium 与 Playwright:主要区别、代码比较以及选择

Selenium 与 Playwright 比较:架构、等待、浏览器和语言支持、调试、两种工具中的相同测试、迁移建议以及如何选择。

阅读文章 →
软件测试

等价划分:通过实例解释测试设计技术

等效分区解释:如何找到有效和无效分区,年龄、密码和优惠券的工作示例,我们运行的测试,以及为什么将其与边界配对。

阅读文章 →
软件测试

软件测试中的严重性与优先级:差异、矩阵和实例

软件测试中的严重性与优先级解释:清晰的定义、带有示例的四向矩阵、级别尺度、谁设置每个级别以及如何运行错误分类。

阅读文章 →
数据库与 SQL

SQL 子查询教程:类型、相关子查询和 EXISTS 以及示例

SQL 子查询教程,其中包含我们运行的查询:标量、IN、FROM 和 SELECT 子查询、相关子查询、EXISTS、NOT IN NULL 陷阱以及子查询与 JOIN 与 CTE。

阅读文章 →
数据库与 SQL

SQL 事务和 ACID 解释:COMMIT、ROLLBACK 和隔离级别

SQL 事务和 ACID 通过我们运行的银行转账进行了解释:COMMIT、ROLLBACK、保存点、锁、隔离级别、脏读、死锁和最佳实践。

阅读文章 →
软件开发

Git 命令备忘单:您实际使用的命令,以及示例

Git 命令备忘单按任务分组:设置、暂存、分支、远程、存储、历史记录和撤消错误,以及来自真实演示存储库的输出。

阅读文章 →
软件开发

JavaScript Promise 解释:then、catch、Promise.all 和常见错误

JavaScript 承诺用我们运行的代码进行了解释:状态、then 和 catch 链、错误处理、Promise.all、allSettled、race 和 any、事件循环和常见错误。

阅读文章 →
软件开发

Python 字典教程:方法、示例和常见模式

Python 字典教程,包含我们运行的代码:创建、读取和更新字典、关键方法、合并、理解、计数和分组模式以及常见错误。

阅读文章 →
人工智能

什么是 RAG?通过工作示例解释检索增强生成

什么是RAG?检索增强生成逐步解释:索引、分块、嵌入、检索、一个小型的 Python 工作示例、评估和常见故障。

阅读文章 →
DevOps

Terraform 初学者教程:从第一个文件到模块的基础设施即代码

适合初学者的 Terraform 教程:从没有云帐户开始,学习初始化、计划和应用,然后是变量、输出、状态、模块和安全的团队工作流程。

阅读文章 →
DevOps

Docker 与 Kubernetes:主要区别、它们如何协同工作以及您需要哪些

Docker 与 Kubernetes 的解释:各自的作用、同一个应用程序同时运行、Docker Compose 和 Swarm 的比较、dockershim 的变化以及如何决定您需要什么。

阅读文章 →
测试自动化

Pytest 初学者教程:夹具、参数化和真实示例

面向初学者的 pytest 教程,其中包含我们在 pytest 9.2 上运行的测试:断言、固定装置、参数化、conftest、标记、tmp_path、monkeypatch、有用的标志和 CI。

阅读文章 →
软件测试

软件测试生命周期 (STLC):6 个阶段、进入和退出标准、示例

软件测试生命周期解释:六个 STLC 阶段,包括进入和退出标准、可交付成果、有效的登录功能示例、STLC 与 SDLC 以及敏捷中的 STLC。

阅读文章 →
软件开发

Git merge 与 rebase 的区别:示例及如何选择

用真实的 log 输出、对比表、rebase 黄金法则和安全的团队工作流,讲清 Git merge 与 rebase 的区别。

阅读文章 →
软件开发

Python 列表推导式:语法、示例与何时避免使用

Python 列表推导式详解:语法、过滤、if-else、嵌套循环、实测耗时,以及何时普通 for 循环更合适。

阅读文章 →
数据库与 SQL

SQL JOIN 详解:附示例(INNER、LEFT、RIGHT、FULL)

通过示例表和查询,一步步讲解 SQL JOIN:INNER、LEFT、RIGHT、FULL、CROSS 和 SELF,并介绍常见错误与性能技巧。

阅读文章 →