2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

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:323161

评论

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

工作日志:一文总结HBase从搭建到实操,大家一起进步

小Q

大数据 学习 编程 面试 HBase

即构SDK12月迭代:新增多项质量回调,互动白板、云录制SDK同步更新

ZEGO即构

快来!开源一份阿里微服务指导手册:springBoot+springCloud+MQ

小Q

学习 面试 微服务 MQ SpringCloud

Athena雅典娜交易所系统开发|Athena雅典娜交易所软件APP开发

系统开发

一个改变世界的“箱子”

阿里巴巴云原生

Docker 阿里云 容器 云原生 k8s

如何在软件发布计划中自动化语义化版本与变更日志

华为云开发者联盟

自动化 工具 发布

我叫你不要重试,你非得重试。这下玩坏了吧?

比伯

Java 编程 架构 面试 程序人生

海淀区政府携手百度,打造数字政务时代新门户

DT极客

聚焦LS-MIMO的四大层面,浅谈5G关键技术

华为云开发者联盟

华为 5G 华为云

XMEX交易所系统软件开发|XMEX交易所APP开发

系统开发

有了Git这个功能,再也不需要依赖IDE了!

编程 架构

手把手教你免费获取正版 Jetbrains 全家桶 License

郭旭东

ide JetBrains

网络入门模拟器:Cisco Packet Tracer 实验教程

LeetCode题解:429. N叉树的层序遍历,BFS,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

BAT等大厂面试复习资料文档整理:ActiveMQ+redis+Spring+高并发多线程+JVM

Java架构之路

Java 程序员 架构 面试 编程语言

探营苏州数字人民币试点

CECBC

数字人民币

《构建高性能WEB站点》.pdf

田维常

架构

基于LiteOS Studio零成本学习LiteOS物联网操作系统

华为云开发者联盟

操作系统 物联网 华为云

SpringBoot魔法堂:应用热部署实践与原理浅析

设计原则 框架 spring Boot Starter

破51项国际榜单纪录!解读华为云擎天架构调度求解引擎

华为云开发者联盟

华为 架构 华为云

BATJ面试常被问到的100+题:Spring+微服务+SpringMVC+MyBatis

Java架构之路

Java 程序员 架构 面试 编程语言

你只修改了2行代码,为什么需要两天时间?

Java架构师迁哥

终于学完了阿里云大数据架构师推荐的Flink入门与实战PDF

小Q

大数据 flink 学习 编程 面试

盘点 2020 | 坚持写技术博客一年能有多少收获!

小傅哥

Java 小傅哥 技术人 盘点2020

没弄懂这些Java基础,简历上千万别写熟悉:异常+反射+注解+泛型

小Q

Java 学习 编程 面试 基础

阿里三面惨遭被虐,spring,jvm,mybatis,并发编程等一窍不通

Java架构之路

Java 程序员 架构 面试 编程语言

Mybatis是如何解析配置文件的?

田维常

mybatis

社区团购大战升级:零售行业再次面临挑战

石头IT视角

终于有人通过笔记+脑图+视频的模式把Spring源码讲明白了

Java架构追梦

Java 学习 架构 面试 spring源码

赶紧看!阿里架构师必备“绝杀版”Tomact架构笔记堪称绝技

比伯

Java tomcat 编程 架构 程序人生

互联网新规鼓励保险与大数据、区块链等新技术融合!业内呼吁配套产品管理制度尽快出炉

CECBC

互联网金融

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