
如何撤销还未推送的合并(merge)
撤销未推送的 merge:git reset --hard ORIG_HEAD(须先确认 ORIG_HEAD 尚指向本次合并前的位置);或 git log 找到合并前提交再 git reset --hard <哈希>。冲突进行中想退出用 git merge --abort。
聚焦概念、架构、排障、价格与选型,一篇解决一个明确问题。

撤销未推送的 merge:git reset --hard ORIG_HEAD(须先确认 ORIG_HEAD 尚指向本次合并前的位置);或 git log 找到合并前提交再 git reset --hard <哈希>。冲突进行中想退出用 git merge --abort。

同步 fork 仓库:git remote add upstream <原仓库地址> 一次配置,之后 git fetch upstream && git merge upstream/main(或 rebase)再 push 到自己 fork。GitHub 网页也有 Sync fork 按钮一键同步。

批量改提交作者/邮箱:推荐 git filter-repo --email-callback / --name-callback 重写全历史;老工具 git filter-branch --env-filter 可按旧邮箱条件替换。已发布历史重写后需协调更新远端,协作者可重新克隆或保全工作后迁移到新历史。

SVN 迁移 Git 用 git svn clone:准备作者映射文件(users.txt),git svn clone --stdlayout --authors-file 完整转换历史、分支、标签,再清理引用推到 Git 远程。大仓库建议通宵跑。

列出两提交间变化的文件名:git diff --name-only A B;带状态(增删改)用 --name-status;只要统计用 --stat。分支间同样适用:git diff --name-only main..feature。

设置跟踪关系:git branch --set-upstream-to=origin/<远程分支> <本地分支>;推送时顺便设置用 git push -u origin <分支>。设好后 git status 可显示相对上游的领先/落后,裸 push 是否可用仍取决于推送配置。

白名单式 gitignore:先 * 忽略全部,再用 ! 逐个取反要保留的文件。注意目录要先用 !dir/ 放行才能保留其中文件;每行规则顺序敏感,后写的覆盖先写的。

分叉说明两边都有对方没有的提交。查看分叉情况 git log --left-right --oneline main...origin/main;合并用 git pull(merge)或 git pull --rebase;确定远程为准则 git reset --hard origin/main。

hotfix 合入功能分支:git checkout 功能分支 && git merge hotfix 分支名(或 rebase)。功能分支拿到修复后继续开发,最终合并回 main 时 保留的同一 hotfix 历史可成为共同祖先,但后续重叠修改仍可能冲突。

该提示说明上一次合并未完成(冲突未解决完或没提交)。git status 查看冲突文件,解决后 git add + git commit 完成合并;不想合了用 git merge --abort 中止。

命令行画分支图:git log --graph --oneline --all --decorate 是最常用的组合,可配置 git lg 别名。GUI 工具:GitKraken、Sourcetree、VS Code GitLens/Git Graph 插件效果更好。

这个警告要求你明确 pull 的合并策略。消除方法三选一:git config --global pull.rebase false(merge)、true(rebase)或 pull.ff only(仅快进)。团队新手建议 ff only,个人项目随意。