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 其中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 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被成功修复,当前版本的进度丝毫不受影响~
Git