高级Git:变基、合并、冲突解决与压缩提交 | AI生成和翻译

Home 2025.05

本指南涵盖 git rebasegit merge 的高级用法、冲突解决、使用 ours 和 theirs 策略以及压缩提交。我将为每个主题提供简明解释和实用示例,重点介绍需要熟悉基本 Git 命令的高级工作流。

1. Git Merge:高级用法

git merge 将多个开发序列合并为统一的历史记录。高级用法包括处理复杂合并、使用合并策略和管理合并提交。

主要合并策略

高级合并选项

示例:禁用快进的合并

git checkout main
git merge --no-ff feature-branch
# 创建合并提交,保留功能分支历史

2. Git Rebase:高级用法

git rebase 通过移动或修改提交来重写历史,创建线性历史记录。适用于清理分支历史,但会改变历史记录,因此在共享分支上需谨慎使用。

变基类型

交互式变基命令

运行 git rebase -i <基准>(例如 git rebase -i HEAD~3 表示最近3个提交)。这会打开包含以下命令的编辑器:

示例:交互式变基

压缩最近3个提交:

git rebase -i HEAD~3
# 在编辑器中将需要合并的提交的 "pick" 改为 "squash" 或 "fixup"
# 保存退出以完成操作

变基到不同基准

将分支移动到新基准(例如将 feature-branchold-base 移动到 main):

git rebase --onto main old-base feature-branch

保留合并提交的变基

默认情况下变基会扁平化合并提交。要保留它们:

git rebase -i --preserve-merges main

中止变基

如果出现问题:

git rebase --abort

3. 解决合并/变基冲突

当 Git 无法自动协调更改时会发生冲突。mergerebase 操作都可能产生冲突,解决方法类似。

解决冲突步骤

  1. 识别冲突:Git 暂停操作并列出冲突文件。
    • 合并时:git status 显示冲突文件
    • 变基时:在 git rebase -i 过程中逐提交解决冲突
  2. 编辑冲突文件:打开文件查找冲突标记:
    <<<<<<< HEAD
    您的更改
    =======
    传入的更改
    >>>>>>> 分支名称
    

    手动编辑保留所需更改后移除标记

  3. 标记为已解决
    • 合并时:git add <文件>
    • 变基时:git add <文件>,然后 git rebase --continue
  4. 完成流程
    • 合并:git commit(Git 可能自动生成提交信息)
    • 变基:git rebase --continue 直到所有提交应用完成

示例:解决合并冲突

git checkout main
git merge feature-branch
# 发生冲突
git status  # 列出冲突文件
# 编辑文件解决冲突
git add resolved-file.txt
git commit  # 完成合并

示例:解决变基冲突

git checkout feature-branch
git rebase main
# 发生冲突
# 编辑冲突文件
git add resolved-file.txt
git rebase --continue
# 重复直至变基完成

4. 在冲突解决中使用 Ours 和 Theirs

冲突解决过程中可能需要偏向某一方的更改(ourstheirs)。ourstheirs 的具体含义取决于操作类型。

合并场景:Ours 与 Theirs

变基场景:Ours 与 Theirs

示例:合并时使用 Theirs

feature-branch 合并到 main 并优先采用 feature-branch 的更改:

git checkout main
git merge -X theirs feature-branch

示例:变基时使用 Ours

feature-branch 变基到 main 时,通过保留 main 的版本来解决冲突:

git checkout feature-branch
git rebase main
# 发生冲突
git checkout --ours file.txt
git add file.txt
git rebase --continue

5. 压缩提交

压缩提交将多个提交合并为一个,创建更清晰的历史记录。通常通过交互式变基实现。

压缩提交步骤

  1. 对目标提交启动交互式变基:
    git rebase -i HEAD~n  # n = 要压缩的提交数量
    
  2. 在编辑器中将需要合并的提交的 pick 改为 squash(或 fixup
  3. 保存退出。Git 可能会提示编辑合并后的提交信息
  4. 推送更新后的历史记录(如果已共享则需强制推送):
    git push --force-with-lease
    

示例:压缩3个提交

git rebase -i HEAD~3
# 编辑器显示:
# pick abc123 提交1
# pick def456 提交2
# pick ghi789 提交3
# 改为:
# pick abc123 提交1
# squash def456 提交2
# squash ghi789 提交3
# 保存退出
# 按提示编辑合并后的提交信息
git push --force-with-lease

合并时压缩

在合并分支时压缩所有提交:

git checkout main
git merge --squash feature-branch
git commit  # 创建单个提交

最佳实践与技巧

常见陷阱

错误恢复

本指南为高级 Git 工作流提供了坚实基础。对于特定场景或错误,请随时告知,我可以深入探讨或搜索实时解决方案!


Back Donate