2023 Git 必备知识(二):常见问题解决

Git 系列文章

处理 hotfix

有时候,我们在迭代中间,会发现 master 存在一些 bug,于是我们就需要修复这个 bug。但此时 dev 通常不能合并到 master,于是我们应该在 master 上修复这个 bug。

  1. 此时不需要对 master 与 dev 做合并操作
  2. 我们从 master 上开启新分支,并修复这个 bug
  3. 采用和之前一样的策略完成代码合并
  4. 将 master 上线
  5. 如果此 bug 同时影响 master 与 dev,我们应该在 dev 分支 cherry-pick 这个修复
  6. 迭代发版时,先将 dev rebase master,与 master 同步
  7. 然后切换到 master,快进 git merge dev --ff-only
  8. 如此就完成两个分支的合并,同时保留单线历史记录

git rebase dev -i

有时候,我们开发过程中会产生一些冗余 commit。比如,我原先要用 A 方案,
后来又改成 B 方案。于是,开发 A 方案时产生的 commit 就没有必要存在代码仓库中。

此时,我们可以使用 git rebase dev -i,启动交互式 rebase,大概会看到这样的输出:

pick 2662533e feature: plan A
pick 7af8e1ef feature: plan B

现在两个 commit 前面都是 pick,表示这两个 commit 我都要。但其实我们只想要第二个,
就可以把第一个的 pick 改成 squash,或者简写成 s,这样就只会保留第二个 commit。

s 2662533e feature: plan A
pick 7af8e1ef feature: plan B

保存退出,再 git log,就会只剩下第二个 commit 了。

Note: 强烈建议大家在每次 merge PR 之前,都这样操作一次。删掉所有不必要的 commit,比如自己的尝试、测试同学发现的 bug,等。

git reset --hard COMMIT

使用 git reset 的时候,我建议大家轻易不要 git reset --hard COMMIT
因为这样一不小心代码就丢了。损失难以估量。

建议大家这样做:

  1. git checkout -b xxx_backup 先备份到新分支。
  2. git reset --mixed COMMIT,回退版本,但是不清除代码修改。
  3. git stash 将修改放入暂存区。
  4. 如果后续操作无误,清理掉暂存区 git stash drop,在删掉没用的备份分支即可

万一 git reset --hard 失误

实际上 git reset 只是重置分支头的位置,并不会真的去动 commit,所以那些 commit 其实都还在我们本地,只不过这些 commit 不太容易找到。

此时我们可以使用 git reflog 查看分支的变更记录,找到之前的 commit 信息,然后再次使用 git reset 把分支指向对的 commit。

注意:这个方法只适用于修复最近的失误。如果你的代码没有提交(生成 commit),或者 git reset 发生在很久之前,那也就回天乏力。所以日常操作还是要小心。


上面这些问题都是我日常工作中实际遇到并解决过的。如果你有其它问题不知道怎么解决,欢迎留言提问;如果你对上面的解决方案有不同意见,也欢迎指教。

下篇会分享一下小技巧和一些问题讨论,敬请期待。

如果您觉得文章内容对您有用,不妨支持我创作更多有价值的分享:


已发布

分类

来自

评论

《“2023 Git 必备知识(二):常见问题解决”》 有 3 条评论

  1. […] 2023 Git 必备知识(二):常见问题解决 […]

  2. 晴天 的头像
    晴天

    使用jetbrains系列软件有个本地历史可以保存一段时间代码没有提交(生成 commit)可以这样找回,前提是记得文件名

欢迎吐槽,共同进步

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据