如何用Git实现Mercurial的特定本地工作流?
作为从Hg转Git踩过坑的人,太懂你要把熟悉的工作流映射过来的需求了!下面就一步步对应你要的操作,再补充点Git里更顺手的做法。
1. 切换到指定提交并在当前分支继续提交(无需新分支名)
在Hg里你用hg update 1f6b4回到旧提交,后续提交直接成为当前分支的新进度——在Git里,对应的核心命令是git reset --hard:
- 先确认你当前在目标分支(比如
master),执行git branch就能看到,带*标记的就是当前分支。 - 执行以下命令,把当前分支直接拉回到指定提交:
git reset --hard 1f6b4172c41e
这个命令会一次性完成三件事:
- 把当前分支的HEAD指针直接移动到
1f6b4172c41e这个提交 - 重置暂存区到该提交的状态
- 同步工作目录的文件到该版本的状态
执行完之后,你就可以直接开发提交,新的提交会自动成为当前分支的新HEAD,完全不需要创建新分支名,和你Hg里的操作效果完全一致。
2. 彻底删除未推送的提交链(e32af及其子提交)
当你用git reset把分支指针移回旧提交后,原来的e32af、9a4c73c、e48cc97这些提交就变成了游离提交——它们没有被任何分支、标签或者HEAD引用。Git默认会在一段时间后自动清理这些“无主”提交,但如果你想立刻彻底删掉它们,不让git log --all再看到,可以执行以下两步:
# 先清空所有reflog记录(避免Git保留这些提交的引用) git reflog expire --expire=now --all # 立刻执行垃圾回收,清除所有无主对象 git gc --prune=now
执行完这两个命令后,那些未推送的提交链就会被彻底删除,再也不会出现在任何日志里。
Git里的更优处理建议
虽然你优先需要对应Hg的操作,但Git有更灵活的方式处理这种场景,推荐你试试:
- 临时保存提交链:如果你不确定以后要不要用到那些有问题的提交,可以先创建一个临时分支保存它们:
git branch temp-save,然后再reset回旧提交。后续如果需要恢复,直接切到temp-save分支就行。 - 交互式变基修改:如果只是想修改有问题的提交(而不是彻底丢弃),可以用
git rebase -i 1f6b4172c41e进入交互式变基界面,把有问题的提交标记为drop删除,或者edit修改,这种方式更优雅,也能保持分支历史的整洁。
内容的提问来源于stack exchange,提问作者WhiskerBiscuit
相关产品推荐
相关产品推荐

