- 更改会经过三个区域:工作目录、暂存区域和存储库。
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 尚未清理它。
继续学习
需要测试、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%覆盖率仍然会错过错误,以及合理的目标。
阅读文章 →数据库与 SQLSQL 中的 DELETE、TRUNCATE 和 DROP:差异、回滚以及何时使用它们
DELETE、TRUNCATE 和 DROP 通过经过测试的 SQL 进行了解释:各自删除什么、回滚、触发器、身份重置、速度,以及 PostgreSQL、MySQL、SQL Server 和 SQLite 有何不同。
阅读文章 →数据库与 SQLSQL 视图解释:创建、使用和避免陷阱(附示例)
SQL 视图通过我们运行的查询进行解释:创建视图、实时结果、隐藏列、性能、可更新和物化视图、破坏的依赖关系和最佳实践。
阅读文章 →软件开发TypeScript 接口与类型:真正的差异,使用编译器进行测试
TypeScript 接口与类型,使用真实编译器进行检查:两者都可以做什么,只有一个可以做什么,声明合并,扩展与交集以及要遵循的简单规则。
阅读文章 →软件开发Python *args 和 **kwargs 解释:灵活的函数和清晰的示例
Python *args 和 **kwargs 用我们运行的代码进行了解释:打包和解包、参数顺序、仅关键字和仅位置参数、装饰器和常见错误。
阅读文章 →软件开发Python Lambda 函数:语法、实际用途以及何时不使用它们
Python lambda 函数用我们运行的代码进行了解释:语法、使用键排序、映射和过滤器、闭包、后期绑定陷阱,以及何时普通 def 是更好的选择。
阅读文章 →人工智能什么是人工智能代理?它们是如何工作的,只需运行一个简单的代理循环
什么是人工智能代理?关于代理循环、工具、内存和护栏的简单指南,以及我们运行的一个小型 Python 循环、真正的风险以及何时简单的聊天机器人是更好的选择。
阅读文章 →DevOps监控与可观察性:真正的区别,包括日志、指标和跟踪
监控与可观察性解释:已知和未知的故障、日志、指标和跟踪、检查事件演练、黄金信号、OpenTelemetry 和有用的警报。
阅读文章 →DevOpsDocker Volumes 与 Bind Mounts:以正确的方式保留容器数据
Docker 卷与绑定挂载解释:为什么容器数据消失、命名卷、绑定挂载、tmpfs、Compose 示例、备份、权限以及何时使用它们。
阅读文章 →测试自动化TDD 与 BDD:主要区别、以两种方式构建的一个功能以及何时使用每种方式
TDD 与 BDD 的解释是通过一种双向构建的折扣功能:使用我们运行的代码进行红绿重构、Given-When-Then 场景、工具、权衡以及何时使用每种方案。
阅读文章 →软件测试用户验收测试 (UAT):流程、清单和真实示例
用户验收测试解释:谁运行它、它与 QA 有何不同、七步流程、UAT 测试用例模板、清单、签核标准和常见错误。
阅读文章 →数据库与 SQLSQL NULL 值解释:IS NULL、COALESCE、NULLIF 和要避免的陷阱
通过我们运行的查询解释了 SQL NULL 值:三值逻辑、IS NULL、COALESCE、NULLIF,聚合、连接和排序如何处理 NULL,以及它悄悄引起的错误。
阅读文章 →数据库与 SQLSQL 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 个示例以及如何计划测试。
阅读文章 →软件测试测试用例与测试场景:主要区别、示例以及何时使用它们
测试用例与测试场景的解释:清晰的定义、并排的表格、从场景到案例的密码重置功能、模板以及何时使用每个功能。
阅读文章 →数据库与 SQLSQL 查询优化:读取执行计划并修复慢速查询(带计时)
对一百万行进行 SQL 查询优化测试:读取执行计划、添加正确的索引、修复不可控制的过滤器、使用复合索引和键集分页。
阅读文章 →数据库与 SQLSQL 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 比较:架构、等待、浏览器和语言支持、调试、两种工具中的相同测试、迁移建议以及如何选择。
阅读文章 →软件测试等价划分:通过实例解释测试设计技术
等效分区解释:如何找到有效和无效分区,年龄、密码和优惠券的工作示例,我们运行的测试,以及为什么将其与边界配对。
阅读文章 →软件测试软件测试中的严重性与优先级:差异、矩阵和实例
软件测试中的严重性与优先级解释:清晰的定义、带有示例的四向矩阵、级别尺度、谁设置每个级别以及如何运行错误分类。
阅读文章 →数据库与 SQLSQL 子查询教程:类型、相关子查询和 EXISTS 以及示例
SQL 子查询教程,其中包含我们运行的查询:标量、IN、FROM 和 SELECT 子查询、相关子查询、EXISTS、NOT IN NULL 陷阱以及子查询与 JOIN 与 CTE。
阅读文章 →数据库与 SQLSQL 事务和 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 工作示例、评估和常见故障。
阅读文章 →DevOpsTerraform 初学者教程:从第一个文件到模块的基础设施即代码
适合初学者的 Terraform 教程:从没有云帐户开始,学习初始化、计划和应用,然后是变量、输出、状态、模块和安全的团队工作流程。
阅读文章 →DevOpsDocker 与 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 循环更合适。
阅读文章 →数据库与 SQLSQL JOIN 详解:附示例(INNER、LEFT、RIGHT、FULL)
通过示例表和查询,一步步讲解 SQL JOIN:INNER、LEFT、RIGHT、FULL、CROSS 和 SELF,并介绍常见错误与性能技巧。
阅读文章 →