软技能

4 阅读5分钟

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 更安全,防止覆盖他人提交