Git 提交代码常见问题及解决全流程指南
💡 摘要:本文档整理了 Git 开发中常见的四种场景及其标准处理流程,涵盖回滚修改、Gerrit 工作流、分支合并及同一 Change 多次提交的操作规范。重点修复了命令语法错误,优化了高风险操作步骤。
一、提交后发现代码问题(未 Review/未 Push)
场景描述:
代码已 commit 到本地,但尚未推送到远程(或尚未触发 Review),发现代码有误需要修改。
目标:合并修改到上一次提交,保持提交记录整洁(避免产生 "fix typo" 这类琐碎提交)。
✅ 操作流程
1. 回滚提交(保留代码)
使用 --soft 模式回滚,将最后一次提交撤销,但保留修改的代码在暂存区。
bash
编辑
1git reset --soft HEAD^
2# 或者回滚到具体的 commit-id: git reset --soft <commit-id>
2. 修改代码
在 IDE 或编辑器中修复错误的代码文件。
3. 重新提交(合并到上一次)
将修改后的代码追加到上一次提交中,并保留原有的提交信息。
bash
编辑
1# 先添加修改后的文件(如果 reset --soft 后文件已在暂存区,此步可省略,但建议执行以确保最新)
2git add .
3
4# 执行 amend,--no-edit 表示不打开编辑器修改提交信息
5git commit --amend --no-edit
💡 参数说明:
--amend:修改最后一次提交,将新的更改追加进去,而不是创建新提交。--no-edit:直接使用原有的提交信息,不启动编辑器。
4. 提交代码 Review
bash
编辑
1sh review.sh
2# 或者执行项目特定的推送命令
二、Gerrit 点击 Abandon 后的恢复操作
场景描述:
在 Gerrit 界面上将某个 Change 标记为 Abandon(放弃),但本地代码需要修复后重新提交为同一个 Change(保持相同的 Change-Id)。
✅ 操作流程
1. 修改代码
在本地修复导致被 Abandon 的问题。
2. 添加文件
如果有新增文件或修改的文件,将其加入暂存区。
bash
编辑
1git add .
3. 修正提交(关键步骤)
使用 --amend 更新最后一次提交。Git 会自动保留原提交信息中的 Change-Id,从而让 Gerrit 识别为同一份变更的新补丁集(Patch Set)。
bash
编辑
1git commit --amend --no-edit
⚠️ 注意:切勿直接
git commit -m "...",否则会生成新的Change-Id,导致 Gerrit 视为一个新的 Change,而不是更新旧的。
4. 推送代码
bash
编辑
1git push origin HEAD:refs/for/<branch-name>
2# 或者运行项目特定的脚本,如 sh review.sh
三、分支合并流程及冲突处理
场景描述:
将特性分支(如 feature/1.0.0)合并到主分支(master)。
🛑 风险提示:原文档中提到的
git branch -D master是高危操作,若本地有未推送的独有提交会永久丢失。以下流程采用更安全的重置(Reset)方式同步远程主分支。
✅ 操作流程
1. 同步并重置本地 Master 分支
确保本地 master 与远程完全一致(丢弃本地 master 上多余的提交,但保留其他分支代码)。
bash
编辑
1# 切换到 master
2git checkout master
3
4# 获取远程最新数据
5git fetch origin master
6
7# 硬重置本地 master 指向远程 master (安全地覆盖本地差异)
8git reset --hard origin/master
2. 执行合并
将特性分支合并到 master,--no-ff 表示禁止快进合并,强制生成一个 Merge Commit,保留分支历史结构。
bash
编辑
1git merge --no-ff feature/1.0.0
3. 解决冲突(如果有)
-
如果提示冲突,手动编辑冲突文件,解决
<<<<<<<,=======,>>>>>>>标记。 -
标记冲突已解决:
bash
编辑
1git add . -
完成合并提交:
bash
编辑
1# 如果还没 commit,可以直接 commit 2git commit -m "Merge feature/1.0.0 into master" 3 4# 如果刚合并完想修改刚才的合并提交信息(尚未 push) 5git commit --amend -m "新的合并提交信息"
4. 推送到远程
bash
编辑
1git push origin master
四、在同一 Change 中多次提交代码(迭代开发)
场景描述:
代码已上传 Gerrit,Review 过程中收到反馈,需要在同一个 Change ID下继续提交新的修改代码。
✅ 操作流程
1. 修改代码
根据 Review 意见修改代码。
2. 添加文件
bash
编辑
1git add .
3. 更新提交
根据是否需要修改提交信息,选择以下任一命令:
-
情况 A:仅追加代码,不修改提交信息(推荐)
bash
编辑
1git commit --amend --no-edit -
情况 B:需要同时修改提交信息(如增加 Bug ID 或说明)
bash
编辑
1git commit --amend 2# 此时会打开 Vim/编辑器,修改保存后退出即可
💡 原理:
--amend会复用上一次提交的Change-Id(通常在提交信息的底部),Gerrit 接收到推送后,会自动将其作为新的 Patch Set 更新到原有的 Change 中。
4. 推送代码
bash
编辑
1git push origin HEAD:refs/for/<branch-name>
📎 附录:常用命令速查表
表格
| 命令 | 作用 | 注意事项 |
|---|---|---|
git reset --soft HEAD^ | 撤销上一次 commit,代码保留在暂存区 | 适用于想合并提交时 |
git commit --amend | 修改最后一次提交 | 会改变 Commit Hash,已 Push 需谨慎 |
git commit --amend --no-edit | 修改最后一次提交,但不改文字 | 最常用于 Gerrit 更新 Patch Set |
git reset --hard origin/master | 强制本地分支与远程一致 | 危险:会丢失本地未提交的修改 |
git merge --no-ff | 合并且保留分支历史记录 | 适合正式版本合并 |
git push --force-with-lease | 安全地强制推送 | 比 --force 更安全,防止覆盖他人提交 |