git rebase修改历史提交内容
简述#
git提交历史中有一次提交的内容是有问题,因为每隔一段时间就要发一次版本,所以必须修改这次提交的内容,以便其不影响已经发布的版本。
大概是这样子的
A --- B ---- C ---- D ---- E ----- F ------ | \ \ 有问题 \-----发布 \---- 发布
所以这里需要修改C这次提交的内容。
解决过程#
相关的操作可以参考7.6 Git 工具 - 重写历史
这里我创建了一个新的仓库,用来描述解决这个问题的过程。
1、先看一下提交记录
$ git log commit aa3f6b723abf030b1692f9b573092ec782600d91 Author: solym <solym@sohu.com> Date: Sat Sep 29 14:34:36 2018 +0800 第三次提交 commit e186c75c5431a6eb683d4640ac30c4b8900ba0c1 Author: solym <solym@sohu.com> Date: Sat Sep 29 14:34:11 2018 +0800 第二次提交 commit ebcd3120d30c52125593601f296607c5dcc520a3 Author: solym <solym@sohu.com> Date: Sat Sep 29 14:33:48 2018 +0800 第一次提交
这里假设是第二次提交
的内容有问题,所以需要会到e186c75c5431a6eb683d4640ac30c4b8900ba0c1
这个提交记录之前一次提交的位置来解决这个问题。
2、先将当前的修改用stash存储一下,后面解决完之后再释放出来
$ git stash Saved working directory and index state WIP on master: aa3f6b7 第三次提交 HEAD is now at aa3f6b7 第三次提交
3、将 HEAD 通过rebase回退到有问题的位置前
git rebase e186c75c5431a6eb683d4640ac30c4b8900ba0c1^ --interactive warning: stopped at e186c75... 第二次提交 You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue
4、在出来的编辑界面,将有问题的提交前的pick
改为edit
,然后保存退出
# p, pick = use commit 使用提交(即保留它,不做修改) # r, reword = use commit, but edit the commit message 使用提交,但编辑提交的日志消息 # e, edit = use commit, but stop for amending 使用提交,但停下来修改(就是要修改提交的内容) # s, squash = use commit, but meld into previous commit 使用提交,但融入此前的提交(就是与在此之前一个提交合并) # f, fixup = like "squash", but discard this commit's log message 类似于squash,但是丢弃此提交的日志消息 # x, exec = run command (the rest of the line) using shell 运行shell命令 # d,drop = remove commit 删除提交
5、修改有问题的文件,解决后重新提交。注意提交使用的参数是--amend
$ vim A.cpp $ git add A.cpp $ git commit --amend [detached HEAD 8b4daa5] 第二次提交 Date: Sat Sep 29 14:34:11 2018 +0800 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 B.cpp
6、使用git rebase --continue
逐步前进到最新的提交位置。
$ git rebase --continue error: could not apply aa3f6b7... 第三次提交 When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort". Could not apply aa3f6b7... 第三次提交 Auto-merging A.cpp CONFLICT (content): Merge conflict in A.cpp
上面执行后因为有两处都有修改,需要解决冲突。
$ git status interactive rebase in progress; onto ebcd312 Last commands done (2 commands done): edit e186c75 第二次提交 pick aa3f6b7 第三次提交 No commands remaining. You are currently rebasing branch 'master' on 'ebcd312'. (fix conflicts and then run "git rebase --continue") (use "git rebase --skip" to skip this patch) (use "git rebase --abort" to check out the original branch) Unmerged paths: (use "git reset HEAD <file>..." to unstage) (use "git add <file>..." to mark resolution) both modified: A.cpp no changes added to commit (use "git add" and/or "git commit -a")
修改后再次提交即可
$ vim A.cpp $ git add A.cpp $ git commit -a [detached HEAD 8070ac2] 第三次提交 1 file changed, 6 insertions(+), 1 deletion(-)
然后重新执行
$ git rebase --continue Successfully rebased and updated refs/heads/master.
如果还有冲突,则重复执行上面两步骤。
7、最后将stash存储的内容释放出来,继续工作
$ git stash pop On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: B.cpp no changes added to commit (use "git add" and/or "git commit -a") Dropped refs/stash@{0} (fc32de3118386c30047df86670371c8ab049e0e0)
分类:
linux/unix编程
标签:
git
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理