Git 系列文章
- Git 常用团队规范
- 常见 Git 操作(本文)
- Git 推荐配置与小技巧
处理 hotfix
有时候,我们在迭代中间,会发现 master 存在一些 bug,于是我们就需要修复这个 bug。但此时 dev 通常不能合并到 master,于是我们应该在 master 上修复这个 bug。
- 此时不需要对 master 与 dev 做合并操作
- 我们从 master 上开启新分支,并修复这个 bug
- 采用和之前一样的策略完成代码合并
- 将 master 上线
- 如果此 bug 同时影响 master 与 dev,我们应该在 dev 分支 cherry-pick 这个修复
- 迭代发版时,先将 dev rebase master,与 master 同步
- 然后切换到 master,快进
git merge dev --ff-only
- 如此就完成两个分支的合并,同时保留单线历史记录
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
,
因为这样一不小心代码就丢了。损失难以估量。
建议大家这样做:
git checkout -b xxx_backup
先备份到新分支。git reset --mixed COMMIT
,回退版本,但是不清除代码修改。git stash
将修改放入暂存区。- 如果后续操作无误,清理掉暂存区
git stash drop
,在删掉没用的备份分支即可
万一 git reset --hard
失误
实际上 git reset
只是重置分支头的位置,并不会真的去动 commit,所以那些 commit 其实都还在我们本地,只不过这些 commit 不太容易找到。
此时我们可以使用 git reflog
查看分支的变更记录,找到之前的 commit 信息,然后再次使用 git reset
把分支指向对的 commit。
注意:这个方法只适用于修复最近的失误。如果你的代码没有提交(生成 commit),或者 git reset
发生在很久之前,那也就回天乏力。所以日常操作还是要小心。
上面这些问题都是我日常工作中实际遇到并解决过的。如果你有其它问题不知道怎么解决,欢迎留言提问;如果你对上面的解决方案有不同意见,也欢迎指教。
下篇会分享一下小技巧和一些问题讨论,敬请期待。
欢迎吐槽,共同进步