0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

维持整洁的Git提交记录

dyquk4xk2p3d 来源:良许Linux 2023-05-12 16:40 次阅读

	

	

	

	

背景

大家都有学习如何规范简洁的编写代码,但却很少学习如何规范简洁的提交代码。现在大家基本上都用 Git 作为源码管理的工具,Git 提供了极大的灵活性,我们按照各种 workflow 来提交/合并 code,这种灵活性把控不好,也会带来很多问题

最常见的问题就是乱成一团的 git log history,那真的是老太太的裹脚布, 又臭又长, 个人极其不喜欢这种 log

7c130554-f09b-11ed-90ce-dac502259ad0.png

造成这个问题的根本原因就是随意提交代码。

代码都提交了,那还有什么办法拯救吗?三个锦囊,就可以完美解决了

善用 git commit --amend

这个命令的帮助文档是这样描述的:

--amendamendpreviouscommit

也就是说,它可以帮助我们修改最后一次提交

既可以修改我们提交的 message,又可以修改我们提交的文件,最后还会替换最后一个 commit-id

我们可能会在某次提交的时候遗漏了某个文件,当我们再次提交就可能会多处一个无用的 commit-id,大家都这样做,git log 慢慢就会乱的无法追踪完整功能了

假设我们有这样一段 log 信息

*98a75af(HEAD->feature/JIRA123-amend-test)feat:[JIRA123]addfeature1.2
*119f86efeat:[JIRA123]addfeature1.1
*5dd0ad3feat:[JIRA123]addfeature1
*c69f53d(origin/main,origin/feature/JIRA123-amend-test,origin/HEAD,main)Initialcommit

假设我们要修改最后一个 log message,就可以使用下面命令:

gitcommit--amend-m"feat:[JIRA123]addfeature1.2and1.3"

我们再来看一下 log 信息, 可以发现,我们用新的 commit-id5e354d1替换了旧的 commit-id98a75af, 修改了 message,并没有增加节点

*5e354d1(HEAD->feature/JIRA123-amend-test)feat:[JIRA123]addfeature1.2and1.3
*119f86efeat:[JIRA123]addfeature1.1
*5dd0ad3feat:[JIRA123]addfeature1
*c69f53d(origin/main,origin/feature/JIRA123-amend-test,origin/HEAD,main)Initialcommit

现在我们的 repo 中文件是这样的:

.
├──README.md
└──feat1.txt

0directories,2files

假设我们提交feature 1.3的时候,忘记了一个配置文件config.yaml, 不想修改 log,不想添加新的 commit-id,那下面的这个命令就非常好用了

echo"feature1.3configinfo">config.yaml
gitadd.
gitcommit--amend--no-edit

git commit --amend --no-edit就是灵魂所在了,来看一下当前的 repo 文件:

.
├──README.md
├──config.yaml
└──feat1.txt

0directories,3files

再来看一下 git log

*247572e(HEAD->feature/JIRA123-amend-test)feat:[JIRA123]addfeature1.2and1.3
*119f86efeat:[JIRA123]addfeature1.1
*5dd0ad3feat:[JIRA123]addfeature1
*c69f53d(origin/main,origin/feature/JIRA123-amend-test,origin/HEAD,main)Initialcommit

知道这个技巧,就可以确保我们的每次提交都包含有效的信息了。一张图描述这个过程就是这个样子了:

7c275ff4-f09b-11ed-90ce-dac502259ad0.png

有了--no-edit的 buff 加成,威力更大一些

善用 git rebase -i

可以看着,上面的 log 都是在开发 feature1,我们在把 feature 分支 merge 到 main 分支之前,还是应该继续合并 log commit 节点的,这就用到了

gitrebase-iHEAD~n

其中 n 代表最后几个提交,上面我们针对 feature 1 有三个提交,所以就可以使用:

gitrebase-iHEAD~3

运行后,会显示一个 vim 编辑器,内容如下:

1pick5dd0ad3feat:[JIRA123]addfeature1
2pick119f86efeat:[JIRA123]addfeature1.1
3pick247572efeat:[JIRA123]addfeature1.2and1.3
4
5#Rebasec69f53d..247572eontoc69f53d(3commands)
6#
7#Commands:
8#p,pick=usecommit
9#r,reword=usecommit,buteditthecommitmessage
10#e,edit=usecommit,butstopforamending
11#s,squash=usecommit,butmeldintopreviouscommit
12#f,fixup=like"squash",butdiscardthiscommit'slogmessage
13#x,exec=runcommand(therestoftheline)usingshell
14#d,drop=removecommit
15#l,label

合并 commit-id 最常用的是squashfixup, 前者包含 commit message,后者不包含,这里使用 fixup, 然后:wq退出

1pick5dd0ad3feat:[JIRA123]addfeature1
2fixup119f86efeat:[JIRA123]addfeature1.1
3fixup247572efeat:[JIRA123]addfeature1.2and1.3

我们再来看一下 log, 这就非常清晰了

*41cd711(HEAD->feature/JIRA123-amend-test)feat:[JIRA123]addfeature1
*c69f53d(origin/main,origin/feature/JIRA123-amend-test,origin/HEAD,main)Initialcommit

善用 rebase

上面的 feature1 已经完整的开发完了,main 分支也有了其他人的更新,在将 feature merge 回 main 分支之前,以防代码有冲突,需要先将 main 分支的内容合并到 feature 中,如果用 merge 命令,就会多处一个 merge 节点,log history 中也会出现拐点,并不是线性的,所以这里我们可以在 feature 分支上使用 rebase 命令

gitpulloriginmain--rebase
7c442a08-f09b-11ed-90ce-dac502259ad0.png

pull 命令的背后是自动帮我们做 merge 的,但是这里以 rebase 的形式,再来看一下 log

*d40daa6(HEAD->feature/JIRA123-amend-test)feat:[JIRA123]addfeature1
*446f463(origin/main,origin/HEAD)Createmain.properties
*c69f53d(origin/feature/JIRA123-amend-test,main)Initialcommit

我们的 feature1 功能on top ofmain 的提交节点,还是保持线性,接下来就可以 push 代码,然后提 PR,将你的 feature merge 到 main 分支了

简单描述 merge 和 rebase 的区别就是这样的:

7c5c6898-f09b-11ed-90ce-dac502259ad0.gif7cad170c-f09b-11ed-90ce-dac502259ad0.gif

我这里使用git pull origin main --rebase省略了切换 main 并拉取最新内容再切回来的过程,一步到位,背后的原理都是上图展示的这样

使用 rebase 是要遵守一个黄金法则的,这个之前有说过,就不再是赘述了

总结

有了这三个锦囊,相信大家的 git log 都无比的清晰,如果你还不知道,完全可以用起来,如果你的组内成员不知道,你完全可以推广起来,这样的 repo 看起来才更健康。


	

	

	

	


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 源码
    +关注

    关注

    8

    文章

    641

    浏览量

    29208
  • 编辑器
    +关注

    关注

    1

    文章

    806

    浏览量

    31171
  • Git
    Git
    +关注

    关注

    0

    文章

    199

    浏览量

    15760

原文标题:维持整洁的 Git 提交记录,三个锦囊送给你

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何使用SSH签名Git提交记录

    Git 支持使用 GPG 来签名提交记录。但 GPG 用起来很复杂,一直赖得搞。
    发表于 06-16 16:21 576次阅读

    git命令的基本使用

    git config 第一次使用git或者刚安装的git时,使用此命令设置身份Name 和 Eamail 地址。并且每次提交时会使用此信息。
    的头像 发表于 12-11 13:53 913次阅读

    git之推送提交

    这两天试着使用了git的推送,把本地的文件上传到仓库,中间遇到点问题,就是本地的仓库文件和远端的仓库相比,多出来一些文件,是我自己新产生的,于是push不是很顺利,特此记录下来,主要参考了如
    发表于 12-17 09:20

    git简单使用(一)

    本帖最后由 iysheng 于 2017-2-19 23:09 编辑 编程,经常会修改代码,不管是将代码托管到本地还是网上,使用git进行版本控制无疑是比较流行的方法。今天我就记录下如何创建
    发表于 02-17 16:18

    第一本Git命令教程(六) - 日志

    今天是 Git 系列课程第六课,上一课我们学会了 Git 本地提交,今天痞子衡要讲的是如何查看 Git 本地历史提交。 当我们在仓库里做了很
    的头像 发表于 12-05 17:22 797次阅读

    如何快速批量修改Git提交记录中的用户信息

    使用该脚本,替换其中 [Your Old Email] [Your New Author Name] [Your New Email] 之后在 git 目录中执行即可。
    的头像 发表于 02-06 16:09 2027次阅读

    Git是怎样的一个系统 Git的工作原理

    执行完成了 git commit 命令,究竟做了什么呢? Git 仓库中的提交记录保存的是你的目录下所有文件的快照,就像是把整个目录复制,然后再粘贴一样,但比复制粘贴优雅许多!
    发表于 02-22 10:41 322次阅读

    git rebase与相关git merge命令比较

    。 #概念     首先要理解的是git rebase和git merge解决了同样的问题。这两个命令都旨在将更改从一个分支集成到另一个分支 - 它们只是以不同的方式进行。试想一下当你开始在专用分支中开发新功能时另一个团队成员以新提交
    的头像 发表于 05-26 16:22 883次阅读
    <b class='flag-5'>git</b> rebase与相关<b class='flag-5'>git</b> merge命令比较

    git rebase和git merge的区别

    "origin"已经有了 2 个提交,如图。 现在我们在这个分支做一些修改,然后生成两个提交(commit)。   $ vi file.txt$ git commit$ vi otherfile.txt$ 
    的头像 发表于 07-05 09:54 643次阅读
    <b class='flag-5'>git</b> rebase和<b class='flag-5'>git</b> merge的区别

    Git是什么 Git介绍

    git 是什么? Git 诞生于 2005 年,是一款免费、开源、分布式版本控制系统。 直接记录快照,而非差异比较 Git 和其它版本控制系统的主要差别在于
    的头像 发表于 07-22 10:50 1793次阅读
    <b class='flag-5'>Git</b>是什么 <b class='flag-5'>Git</b>介绍

    git如何记录每次更新到仓库

    记录每次更新到仓库 工作目录下的每一个文件都不外乎这两种状态:已跟踪 或 未跟踪。 已跟踪包括:已提交(committed)、已修改(modified) 和 已暂存(staged) 检查当前文件状态
    的头像 发表于 07-22 11:11 540次阅读
    <b class='flag-5'>git</b>如何<b class='flag-5'>记录</b>每次更新到仓库

    git中如何查看提交历史

    查看提交历史 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。完成这个任务最简单而又有效的工具是 git log 命令。 我们使用一个非常简单的 “simplegi
    的头像 发表于 07-22 11:21 953次阅读
    <b class='flag-5'>git</b>中如何查看<b class='flag-5'>提交</b>历史

    git基本操作命令用法

    基本用法 上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。 git add files把当前文件放入暂存区域。 git commit给暂存区域生成快照并提交git
    的头像 发表于 09-13 16:29 786次阅读
    <b class='flag-5'>git</b>基本操作命令用法

    如何在 Git 中恢复隐藏的修改记录

    git stash 和 git stash pop 这样的命令是用来搁置(藏匿)和恢复我们工作目录中的变化的。在本教程中,我们将学习如何在 Git 中恢复隐藏的修改记录。 在工作目
    的头像 发表于 10-09 14:09 1012次阅读

    Git命令解决常见场景记录

    本文主要归纳一下git的学习记录,在开发期间发现了git在sourcetree的处理不是很好,对于多选文件的丢弃这点不是很方便,所以做一个记录,由于项目中有新建的文件,所以被识别为未跟
    的头像 发表于 12-20 09:44 497次阅读
    用<b class='flag-5'>Git</b>命令解决常见场景<b class='flag-5'>记录</b>