Git merge操作必须在目标分支上执行,即要把main合并到feature/login,需先checkout feature/login再运行git merge main;误在main上执行会导致方向错误,常见现象为“Already up to date”但子分支未更新。

git merge main 到 feature 分支前必须先切到目标分支
Git 合并不是“从 A 推到 B”,而是“在当前分支上把另一个分支的变更合进来”。所以想把 main 的修改合并进 feature/login,你得先 git checkout feature/login(或 git switch feature/login),再执行合并。直接在 main 上跑 git merge feature/login 是反向操作,结果完全不对。
常见错误现象:Already up to date 却发现子分支没拿到新代码——大概率是因为人还在 main 分支上误操作。
- 确认当前分支:运行
git branch --show-current,输出必须是你的子分支名 - 确保子分支已同步远程最新状态:先
git fetch origin,再git merge origin/feature/login(如有必要) - 如果子分支本地有未 push 的提交,
merge会生成一个合并提交;若只想“拿代码不改历史”,考虑git rebase main(见下节)
用 git rebase main 替代 merge 可避免多余合并提交
如果你的 feature/login 还没推送到远程,或团队允许重写本地分支历史,rebase 是更干净的选择:它把子分支的提交“挪”到 main 最新提交之后,线性历史、无合并节点。
执行步骤:
git checkout feature/login<br>git fetch origin<br>git rebase origin/main
注意冲突处理方式和 merge 不同:rebase 是逐个重放你的提交,每遇到一个冲突就得解决一次、然后 git add . && git rebase --continue。一旦中断,用 git rebase --abort 回退最安全。
-
rebase后需强制推送:git push --force-with-lease origin feature/login(仅限未被他人基于该分支开发时) - 不要对已公开的分支(如多人协作的
develop)做rebase,会破坏他人本地历史 - 如果子分支已有多个提交且含复杂逻辑,
rebase可能比merge更耗时,别为“干净”牺牲可追溯性
合并后出现冲突,重点看 .git/MERGE_HEAD 是否残留
手动解决完冲突、git add 标记后,必须执行 git commit(merge 场景)或 git rebase --continue(rebase 场景)。否则 .git/MERGE_HEAD 文件会一直存在,下次任何 Git 操作(包括 git status)都会提示“merge in progress”,甚至可能意外触发二次合并。
- 检查是否处于合并中:
ls .git/MERGE_HEAD(Linux/macOS)或dir .git\MERGE_HEAD(Windows) - 如果卡住又不想继续,
git merge --abort或git rebase --abort是唯一可靠退出方式 - 编辑器里看到 git add
远程子分支没更新?检查 push 是否漏了 -u 参数或用了错的远程名
本地合并或变基完成后,git push 默认只推当前分支到 origin 同名分支。但如果你的远程仓库叫 upstream 而不是 origin,或者子分支在远程是 feat/login 而本地是 feature/login,就会 push 失败或推到错误位置。
安全做法是显式指定:
git push -u origin feature/login
-u(即 --set-upstream)只用第一次,之后直接 git push 就行。漏掉它不会报错,但下次 git push 会提示 “The current branch has no upstream branch”。
- 查远程映射:
git branch -vv看对应行有没有[origin/feature/login] - 如果远程分支名不同,用
git push origin feature/login:feat/login显式映射 - CI/CD 流水线拉取的是远程分支,本地合并完不 push,别人根本看不到你的“已合并”状态
git fetch origin,导致你以为的 main 是一周前的版本;或者解决冲突后忘了 git add 就直接 git commit,结果提交里还带着冲突标记。这些细节不靠记忆,靠每次操作前扫一眼 git status 和 git log --oneline -n 5。


















