跳到主要内容

合并分支

可使用

一、使用 merge 合并

使用 merge 进行两个分支的合并。

# {合并到分支}
git merge origin

# 使用 ours 策略合并到当前分支
git merge -s ours origin/{合并到分支}

# 不自动提交合并
git merge --no-commit origin/{合并到分支}

# 将多天记录合并为一条
git merge --squash origin/{合并到分支}

1. 强制合并两个不相干的分子

 git merge {branch name} --allow-unrelated-histories

通过 git merge master 命令来合并这些修改,然后再用 rebase 命令理顺其历史纪录。该命令需要一个参数,以说明要将活动分支上的最新修改纳入哪一个分支。

git rebase master

但如果 rebase 命令在执行过程中遇到冲突情况,该命令进程就会被打断,相关文件中也会出现冲突标志。需要先手动或通过合并工具对文件进行清理,并重新将它们添加到暂存区中。然后再执行 rebase 命令加 --continue 选项,从该点继续之前的进程。

git rebase --continue

也可以用--abort 选项取消这次的 rebase 命令,或者用--skip 选项跳过引起冲突的提交。这样该次提交就被直接忽略,其中的修改将不会出现在新分支上。

2. 解决冲突

git mergetool 命令用于合并冲突解决工具并解决冲突,通常在合并后使用:

git mergetool

查看冲突版本

git diff

3. 手动解决

在编辑器内进行解决是最好的办法。

4. 取消合并

git reset --merge

或:

git reset --hard HEAD

上述命令将还原到 git merge 之前。

如果想在中止或在它已经结束后放弃:

git reset --hard ORIG_HEAD

二、使用 git cherry-pick 精细合并

git cherry-pick 提交命令用于 选择性地将制定提交( commit )应用到当前分支 。它允许经其他分支的特定修改复制到当前的分支,而无需合并整个分支。

  • 精确复制提交 : 将其他分支的某个(或多个)提交的修改内容应用到当前分支
  • 避免全分支合并 : 只引用需要的改动,而非整个分支

常用于维护分支和的提交移植到开发版本:

# 应用单个提交
git cherry-pick <commit-hash>

# 应用多个(按提交顺序)
git cherry-pick <commit-hash1> <commit-hash2>

# 应用一个连续的提交范围( A 到 B 的所有提交,不包括 A )
git cherry-pick A..B

# 应用连续的提交(包括起点 A)
git cherry-pick A^..B

1. 常用选项

选项说明
-n--no-commit应用修改但不自动提交(可手动调整后再提交)
-x在提交信息末尾添加 ( cherry picked form commit ... ) 公开分支慎用
-e--edit允许修改提交信息
--abort终止操作并恢复到 cherry-pick 前的状态(解决冲突失败时)
--continue解决冲突后继续操作
--skip跳过当前提交

若误合科不需要的提交,可通过 cherry-pick 重新应用正确的提交。

注意
  • 提交哈希变化cherry-pick 会生成 新的提交 (哈希值改变),因为提交时间/作者可能不同
  • 依赖关系 : 若提交依赖其他未选择的提交,可能导致代码错误(需确保上下文一致)
  • 重复提交风险 : 避免在公共分支多次 cherry-pick 同一提交(可用 -x 标记来源)
  • 冲突处理 : 复杂改动可能引发冲入,需手动解决(类似合并冲突)

2. 冲突处理

cherry-pick 的提交与当前分支代码有冲突时,Git 会暂停操作并提示冲突文件。

    1. 打开冲突文件,找到 <<<<<<<=======>>>>>>> 标记的冲突区域,手动修改代码
    1. 添加解决后的文件到暂存区
    git add <冲突文件名>
    1. 继续完成 cherry-pick
    git cherry-pick --continue
    1. (可选)放弃本次 cherry-pick (回到操作前状态)
    git cherry-pick --abort
    1. (可选)退出但保留当前修改(不回滚)
    git cherry-pick --quit

3. 用途

git cherry-pick 是精细化代码管理的利器,适用于:

  • ✅ 夸分支移植特定修复/功能
  • ✅ 避免不必要的合并
  • ❌ 不适合大范围历史重写(优先用 rebase
  • ❌ 频繁 cherry-pick 可能导致历史混乱,特别是在多人协作的项目中

三、git revert

git revert 提交命令跟 git cherry-pick 提交命令大致是相同的,但有一个重要区别:它应用给定提交的逆过程。因此,此命令用于引入一个新提交来抵消给定提交的影响。

git cherry-pick 命令一样, revert 命令不修改版本库的现存历史记录。相反它往历史记录中添加新提交。

git revert {}~{}

四、本地丢失提交记录后

不小心丢失历史记录(执行了 rm -rf .git),可通过下面的操作

1. 初始化仓库

初始化本地仓库并建立与远程仓库的链接

git init
git remote add origin [git@xxx]

2. 拉取远程仓库的最新记录

使用 fetch 拉取远程仓库的最新记录而不是使用 pull 直接合并

git fetch origin main

3. 创建临时分支并保存本地修改

先将本地的修改保存到一个临时的分支上,避免新的修改丢失

git add -A
git commit -m "暂存误删 .git 后的本地修改的"
git branch temp

4. 本地与远程历史对齐

切换到主分支,并将重置为主分支的历史

git checkout main # 切换到 main 分支,如果没有 main 分支,先创建: git checkout -b main
git reset --hard origin/main # 将本地 main 分支与远程分支一致

5. 合并临时分支

使用 merge 将临时分支上的修改合并到当前的分支上:

git merge temp --allow-unrelated-histories