Git-修复已发布版本的 Bug

Git - 修复已发布版本的 Bug

有时候在项目进行了一段时间、发布了几个版本(Release)后,突然发现先前的某个年代久远的 Release 存在 Bug 需要修复。如何做到仅仅修改那个出 Bug 的 Release 的代码,而不影响其之后的所有的 Release 以及当前的进度?
 

解决步骤

假设项目目前最新的 Release 版本是 v0.4.2,正在进行 v0.5.0 的开发,而出 Bug 的版本是 v0.1.1。
回退到出 Bug 的版本
方法1:
首先,查看v0.1.1版本的详细信息:
git show v0.1.1
得到以下输出:
commit a83516d0fb5da5fd5ad749733a160219b5a5ceac (tag: v0.1.1)
Author: Alfred Liu <joemale@163.com>
其中a83516d0fb5da5fd5ad749733a160219b5a5ceac就是版本发布时的 Commit ID。回退到v0.1.1:
git reset --hard a83516d0fb5da5fd5ad749733a160219b5a5ceac
此时查看目录,会发现所有源代码都已经回退到了当时的版本。
新建 fixbug分支
git checkout -b fixbug
建好bugfix分枝后,需要将原来的分枝(我这里是master分枝)前进到最新版本(否则它就一直停留在v0.1.1了)。
# 切换到 master 分枝
git checkout master
# 查看最新版本对应的 Commit ID
git reflog
# 前进到最新版本
git reset --hard 1523898
此时你会发现,master分枝为当前最新进度,fixbug分枝为出 Bug 的版本。
方法2:
git checkout -b 新分支名称 版本号(v0.1.1)

修改 Bug

接下来就是切换到 fixbug 分支:
git checkout fixbug
修改完 Bug 后,正常git add&git commit即可,并将fixbug分枝推送到远程 GitHub:
git add <file>
git commit -m "Fix bugs"
git push origin fixbug
重打 Tag
将改好 Bug 的代码重新打上v0.1.1的 tag。这里需要注意的是,默认情况下 git 会给v0.1.1附上一个当前的时间戳,从而会出现v0.1.1的发布时间比v0.4.2晚的情况,GitHub 的 Release 页面则会认为v0.1.1是最新的版本。
因此我们需要自行“伪造”一个提交日期,即为原先v0.1.1的提交日期即可:
GIT_COMMITTER_DATE="2017-10-14 23:27" git tag -f v0.1.1 -m "The V0.1.1 Release"
将修改后的 tag 推送到远程 GitHub(强制更新):
git push -f origin --tags
Merge
最后需要将fixbug分枝归并到master分枝:
git checkout master
git merge bugfix --allow-unrelated-histories
此时肯定会有很多冲突出现,打开某个有冲突的文件,可以看到类似情况:
<<<<<<< HEAD
code in master branch
=======
code in fixbug branch
>>>>>>> fixbug
<<<<<<< HEAD 与 ======= 之间是当前分支的代码,======= 与 >>>>>>> fixbug 之间是待合并分枝的代码。按照实际需求修改即可,最后一定要删除这些标记。
修改完成后正常 git add & git commit 即可。
清理
后续的一些清理工作即删除临时的fixbug分支:
# 删除本地 fixbug 分支
git branch -d fixbug
# 删除远程 fixbug 分支
git push --delete origin fixbug
老版本的Bug被成功修复,当前版本的进度丝毫不受影响~
posted @ 2022-01-21 10:09  清枫林  阅读(246)  评论(0编辑  收藏  举报