QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

Git 实用技巧和命令

  • 2018-08-10
  • 本文字数:2004 字

    阅读完需:约 7 分钟

Git 是一个非常强大的工具,它包含丰富的工具用以维护项目。本文我们将会看见一些 Git 日常使用过程中的实用技巧和命令。希望其中的一些内容能够对读者有所帮助。

Git diff

通常情况下,我们会在自己的独立分支中完成需求开发,此时就会有需求将自己的分支和其他分支进行对比。这个功能可以通过

复制代码
git diff branch1 branch

命令来实现。

如果希望对比暂存区和当前的 HEAD,那么使用

复制代码
git diff --cached

命令会非常方便。普通的git diff命令默认对比的是没有加到索引中的文件。

恢复暂存区

如果已经将一些文件添加到暂存区后又后悔了,Git 提供了多个命令来实现这个功能,具体需要根据当时情况而定。

复制代码
git rm path/to/file --cached

命令将文件从暂存区索引中删除,但是仍然会将文件保留在工作目录。这比直接使用

复制代码
git rm file -f

命令完全删除文件会安全一点。

Git reset

如果希望恢复一些已经提交的改动,我们可以使用

复制代码
git reset

命令。该命令有许多不同的行为,因此需要按照实际场景进行使用。

如果希望的是去除所有修改,包括索引中的内容和工作目录中的修改,那么可以使用

复制代码
git reset --hard

如果仅仅是希望重置索引,那么可以使用

复制代码
git reset --mixed

命令,这也是 git reset 命令的默认行为。混合的重置会保留当前工作目录中的改动。最后,如果仅仅希望修改分支的 HEAD,可以通过

复制代码
git reset --soft

实现。

当运行 git reset 命令的时候,我们可以指定多个目标文件作为参数传入。当然可以通过

复制代码
git reset --hard COMMIT_ID

恢复到指定的提交版本。

Git stash

大家应该对 git stash 命令并不陌生,它可以通过 git stash pop 命令方便的将之前的改动恢复回来。然而,如果工作目录中有未追踪的文件,默认情况下是不会将其存入临时储藏区的。为了能够临时保存未追踪的文件,可以使用

复制代码
git stash --include-untracked

命令。另外一个非常有用的命令是

复制代码
git stash list

它能列出临时储藏区中的内容。

历史记录

Git 自带了非常强大的工具来查看项目以及特定文件的变更情况。我个人非常喜欢用其中的一个命令:

复制代码
git log --graph --decorate --oneline

用以展示经过修饰的提交历史。这个命令非常冗长,因此我建议可以为它创建一个别名(这可能是所有技巧中最有用的,因为许多命令都比较难记)。git log 命令可以显示 HEAD、所有提交的 ID 以及分支信息。有了这些信息之后,我们可以使用

复制代码
git show COMMIT_ID/HEAD/BRANCH

命令来显示更详细的信息。

有的时候我们需要了解谁对一个文件做了哪些改动,这正是

复制代码
git blame path/to/file

命令所提供的功能。

之前提到过 git diff 命令,它也是一个查看历史的工具。例如,如果需要对比当前 HEAD 和前两个提交,可以使用

复制代码
git diff HEAD HEAD~2

为了能够展示每个提交中的更详细的更新信息,可以使用

复制代码
git log --patch

命令。如果只想要看包含关键字“apple”的提交,使用

复制代码
git log --grep apples --oneline

命令。

需要查看历史提交记录中两个点之间的提交历史,我们可以用

复制代码
git log HEAD~5..HEAD^ --oneline

命令,对于分支可以使用

复制代码
git log branch_name..master --oneline

修复错误提交

注意:以下一些命令会修改提交历史,使用前请确保了解后再执行。

当提交出错时,我们可能会希望能够修改提交历史。我不建议修改已经推送到远程仓库的提交历史(即使 git 允许这样做),但是对于本地仓库的提交历史,我个人认为还是可以修改的。通过

复制代码
git commit --amend

命令可以删除前一次提交,并创建一个新的提交记录以替代之前的提交。

另一个我最喜欢的 git 使用技巧是交互式变基 (rebase)。它可以用来编辑提交信息,或者将多个提交压缩成一个提交,这也是我最喜欢的一个功能。为了在远程仓库 origin 的 master 分支之后的所有提交上执行交互式变基,可以使用

复制代码
git rebase -i origin/master

该命令会显示提交列表和可执行操作的详细描述。例如以下操作将会把多个提交压缩成一个:

复制代码
1 pick 80f2a48 Add feature X
复制代码
2 squash 2c74ea2 Add junit tests for feature X
复制代码
3 squash 4k81nm5 Bugfix for feature X

最终的结果会是生成一个提交消息为“Add feature X”的提交。

如果需要恢复一个有问题的提交,我们可以使用

复制代码
git revert COMMIT_ID

该命令会创建一个新的提交,让当前项目状态恢复到指定提交之前。

如果我们在修复问题时出现了误操作,例如不小心删除了不应该删除的文件。我们还是可以从版本库中恢复回来,因为 git 保存了所有修改的版本,包括被移除的提交。git reflog 命令就是用来实现这个功能的。

挑拣提交(cherry-pick)

假设我们和同事在各自单独的分支上进行开发,同事有一个重要的提交我们也想应用到自己的分支上来,但是不需要对方分支的其他提交。这时我们可以使用

复制代码
git cherry-pick COMMIT_ID

后记

以上都是我最喜欢的 git 实用技巧。希望你也能从中学到一些新知识。这些都是我在日常使用中发现非常有用的命令,它们对我的日常工作非常有用。如果你也有类似常用的 git 实用技巧或者常用命令,可以分享出来大家一起交流。

查看英文原文: Useful Git Tips and Commands

2018-08-10 02:323036

评论

发布
暂无评论
发现更多内容

NFTScan x TiDB丨一栈式 HTAP 数据库为 Web3 数据服务提供毫秒级多维查询

NFT Research

数据库 NFT

如何有效的解决代码的圈复杂度

京东科技开发者

代码 计算 圈复杂度 点边计算

如何将Excel文档转换为PDF文档

Geek_249eec

Java Excel PDF

基于SpringBoot实现操作GaussDB(DWS)的项目实战

华为云开发者联盟

数据库 后端 华为云 企业号 2 月 PK 榜 华为云开发者联盟

有没有夫妻相?刷一下脸就知道!

华为云开发者联盟

人工智能 华为云 企业号 2 月 PK 榜 华为云开发者联盟

【监控运维】消息轨迹全景图详解-独门秘籍——实践类

阿里云AIoT

运维 监控 物联网 数据可视化 消息中间件

软件供应链受威胁下的应对方法——供应链安全管理平台的五大工具能力

墨菲安全

SCA 供应链安全

DevEco Studio端云协同开发之云数据库

白晓明

云数据库 HarmonyOS 端云协同

PDF电子书下载 和 企业物联网实例 视频讲解——实践类

阿里云AIoT

运维 监控 物联网

任务管理-轻松搞定 IoT 设备重启、资源包更新、固件升级等业务——实践类

阿里云AIoT

json 物联网 数据格式

宣布 Databricks 支持 Amazon Graviton2,性价比提高3倍

亚马逊云科技 (Amazon Web Services)

数据库 存储

CVE-2023-23752 Joomla未授权访问漏洞分析

墨菲安全

漏洞分析 软件供应链安全

接地电阻要小于4Ω,你知道是为什么吗?

元器件秋姐

科普 元器件 电阻 接地电阻

研发效能DevOps推荐书单

laofo

DevOps cicd 研发效能 持续交付

被骂惨了!复旦版「MOSS」服务器挤崩,一口吃不成ChatGPT

引迈信息

人工智能 AI ChatGPT MOSS

LoRaWAN设备接入阿里云IoT企业物联网平台实战——实践类

阿里云AIoT

物联网 传感器

墨菲安全参与信息通信软件供应链安全社区成员大会并获自主研发创新成果奖

墨菲安全

供应链安全 安全情报

CVE-2022-22947 SpringCloud GateWay SPEL RCE 漏洞分析

墨菲安全

漏洞分析 软件供应链安全

MQTT 5.0介绍

EMQ映云科技

性能 物联网 IoT mqtt 企业号 2 月 PK 榜

天翼云推出爬虫管理,助力企业安全高效发展

极客天地

Python基础练习题(一)

漫步桔田

TDengine 发布主流时序数据库对比分析报告,与 InfluxDB、TimescaleDB 展开全面对比测试

TDengine

tdengine 时序数据库 数据库·

电信NB-IoT设备对接阿里云IoT平台实战——实践类

阿里云AIoT

大数据 监控 物联网 存储 数据格式

数据治理如何做?火山引擎DataLeap帮助这款产品3个月降低计算成本20%

字节跳动数据平台

大数据 数据治理 数据研发 企业号 2 月 PK 榜

F5 分布式云服务为软银集团的私有基础设施带来云原生能力

F5 Inc

CodeArts Repo:6大特性助力企业代码稳定可靠安全无忧

华为云开发者联盟

云计算 后端 华为云 企业号 2 月 PK 榜 华为云开发者联盟

Python 基础练习题(二)

漫步桔田

Java单元测试浅析(JUnit+Mockito)

京东科技开发者

Java 单元测试 代码 JUnit Mockito

IoT 物联网平台如何实现 100万/秒 消息广播?——实践类

阿里云AIoT

小程序 监控 物联网 传感器 测试技术

脑洞|ChatGPT加持下,ChatOps将如何革新团队协作与运维管理?

极狐GitLab

团队管理 DevOps 团队协作 ChatOps ChatGPT

智多星RPA重塑业务流程,全面赋能企业商业创新

YonBuilder低代码开发平台

Git实用技巧和命令_Git_viktor_InfoQ精选文章