使用git rebase合并多次commit

使用git rebase合并多次commit

1. 背景

一个repo通常是由一个team中的多个人共同维护,如果需要增加新feature,那么就是一个feature分支了。由于开发中各种修改,本feature分支多次commit。最后提交master后,会看到乱七八糟的所有增量修改历史。其实对别人来说,我们的改动应该就是增加或者删除,给别人看开发过程的增量反而太乱。于是我们可以将feature分支的提交合并后然后再merge到主干这样看起来就清爽多了。

记得知乎上有个帖子提问为啥vue的作者尤大大在开发vue的时候,提交历史能做到如此清爽。Git commits历史是如何做到如此清爽的? - 知乎

2. rebase简介

rebase的作用简要概括为:可以对某一段线性提交历史进行编辑、删除、复制、粘贴;因此,合理使用rebase命令可以使我们的提交历史干净、简洁!

但是需要注意的是:

不要通过rebase对任何已经提交到公共仓库中的commit进行修改(你自己一个人玩的分支除外)

3. 反面例子

新建一个repo rebase-test;新建开发分支dev;在开发分支是commit了三次然后mergemaster分支;然后git log或者git log --oneline;可以发现dev分支上的每次commit都体现到了master

fb28c8d (HEAD -> master, origin/master, origin/dev, origin/HEAD, dev) fix: 第三次提交
47971f6 fix: 第二次提交
d2cf1f9 fix: 第一次提交
26bac61 Initial commit

如果用git log可以按s向下翻log

git log --oneline 可以一行展现

4. 具体操作

当我们在本地仓库中提交了多次,在我们把本地提交push到公共仓库中之前,为了让提交记录更简洁明了,我们希望把如下分支B、C、D三个提交记录合并为一个完整的提交,然后再push到公共仓库。

这里我们使用命令:

git rebase -i  [startpoint]  [endpoint]

其中-i的意思是--interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。 在查看到了log日志后,我们运行以下命令:

git rebase -i 36224db

或者

git rebase -i HEAD~3 

然后我们会看到如下界面:

上面未被注释的部分列出的是我们本次rebase操作包含的所有提交,下面注释部分是git为我们提供的命令说明。每一个commit id 前面的pick表示指令类型,git 为我们提供了以下几个命令:

pick:保留该commit(缩写:p)

reword:保留该commit,但我需要修改该commit的注释(缩写:r)

edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)

squash:将该commit和前一个commit合并(缩写:s),两个注释分成两行。

fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f),只保留前一个commit信息。

exec:执行shell命令(缩写:x)

drop:我要丢弃该commit(缩写:d)

根据我们的需求,我们将commit内容编辑如下:

pick d2cf1f9 fix: 第一次提交

s 47971f6 fix: 第二次提交

s fb28c8d fix: 第三次提交

上面的意思就是把第二次、第三次提交都合并到第一次提交上

然后wq保存退出后是注释修改界面:

可以再浏览态 按下两个dd可以删除一行

最终的编辑效果如下: 

编辑完保存即可完成commit的合并了:

最后查看log可以发下提交合并了

原文地址:https://www.cnblogs.com/qiumingcheng/p/11980506.html

时间: 2024-11-10 17:24:03

使用git rebase合并多次commit的相关文章

分布式版本控制系统Git-----7.Git 使用git rebase合并多次commit

将多次commit合并,只保留一次提交历史. PS:在我练习的时候,将一个文件的代码做了多次修改,而且每次修改都给提交了,这几次改动的目的都一样,比如说修改RADEME.md,但是每次改动的只是一个小小的代码,但是提交历史上的显示看着会很乱,所以需要合并之前的多次提交历史. 1.首先使用git log查看一下提交历史[--oneline作用是将每个提交放在一行显示] 这样在git中看到的是4次提交(更改txt),有点冗余,需要做的是将4次commit合并为一次 2. git 压缩  git re

git rebase -i 合并commit

每次可能修改一个小的bug就会有一个提交,或者写了一小段代码就提交了一次. 这样经常会有多个commit,对此我们用git rebase -i HEAD~n来合并多个commit为一个commit. 如下图所示: 先用git status 查看下有多少个commit,下图中提示 Your branch is ahead of 'origin/master' by 2 commits. 很明显是2个commits待push. git log 里的内容请忽略掉. 现在用git rebase -i H

团队开发里频繁使用 git rebase 来保持树的整洁好吗?

用了以后, 树可以非常清晰, 某种程度上便于追踪, 但是 push --force 就多多了,不用呢, 合并没有远程仓库被修改的麻烦, 可是追踪又不清晰... git rebase是对commit history的改写.当你要改写的commit history还没有被提交到远程repo的时候,也就是说,还没有与他人共享之前,commit history是你私人所有的,那么想怎么改写都可以. 而一旦被提交到远程后,这时如果再改写history,那么势必和他人的history长的就不一样了.git

git rebase VS git merge

git rebase是对commit history的改写.当你要改写的commit history还没有被提交到远程repo的时候,也就是说,还没有与他人共享之前,commit history是你私人所有的,那么想怎么改写都可以. 而一旦被提交到远程后,这时如果再改写history,那么势必和他人的history长的就不一样了.git push的时候,git会比较commit history,如果不一致,commit动作会被拒绝,唯一的办法就是带上-f参数,强制要求commit,这时git会以

git rebase 翻译

1,英文文档: git-rebase(1) Manual Page NAME git-rebase - Reapply commits on top of another base tip SYNOPSIS git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>] [<upstream> [<branch>]] git rebase [-i | --

通过git rebase修改commit message

今天发现一个项目的git commit message中的单词拼错了,需要修改一下.但这样简单的修改,需要通过git rebase才能完成. 首先要git rebase到需要修改message的那个commit的前1个commit.假设commit id是32e0a87f,运行下面的git rebase命令: git rebase -i 32e0a87f 在git bash中运行上面的命令后,会弹出编辑框,在编辑框中会分行依次显示以pick开头的这个commit之后的所有commit messa

巧用 git rebase 合并多个 commit。

一.为什么需要合并多个 commit 呢? 有时候,我们开发一个功能. 修修补补 commit 了很多次,过多的 commit 会显得很复杂. 不够直观,不能比较清晰查看那些 commit 是对应的那个功能. 所以,在这种情况下.我们需要整理一下 commit 的记录,让我们更好的管理提交记录. 二.具体合并多个 commit 的流程. 1.development 分支有四次 commit ,然后我准备合并 "add a.php" 和 "add b.php" 的两次

[Git] Rebase - 使用 Interactive 模式来精简 commit 纪录

避免过多 commit 纪录造成线图繁杂 透过 Rebase Interactive Mode?来将 commit log 进行精简 前言 在开发的过程中,会随着各种原因将代码提交至 local repository 中,并且在完成最终功能的开发后,会将 local 的变动 push 到 remote repository 中:此时为了避免过多无特别意义的 commit 纪录造成线图的繁杂,因此会透过各种方式来将 commit log 进行精简,其中处理方式多为 git reset 或 git

Git 合并多次提交

在合并分支的时候,希望将多次提交合并成一个,然后再 cherry-pick 到主分支. 合并分支 develop 分支做开发,可能会进行多次提交,但是在发布或者进行 PR 的时候,我们只希望看到一次提交.这个时候,我们需要进行 git rebase 之后进行合并. # HEAD~3 表示将近三次提交都合并,如果是将 2 次合并则为 HEAD~2 git rebase -i HEAD~3 这个时候,看到的是一上对 COMMIT 信息的提示 pick 9ba5122 2017 年 8 月 2 日 p