将一个本地分支合并到另一个本地分支

415

我有多个分支,它们都从主分支分叉而来(每个分支在单独的子目录中)。

  • Branch1:新开发,尚未完成
  • Branch2:针对问题的热修复,但仍在测试中
  • Branch3:用于试验的分支,我将不会恢复它

在热修复测试完成之前,我想让代码已经可用于 Branch1,这样我就可以在修复的基础上继续开发。
(但由于我对 git 的使用经验不太丰富,所以我首先创建了一个专门用于试验合并的第三个分支,在弄乱 Branch1 或 Branch2 之前进行测试。)

在我的第三个分支中,我首先尝试了以下操作:

git merge feature/Branch1

但是这导致了以下错误:

fatal: 'feature/Branch1' does not point to a commit

我接着在我的Branch1中执行了commit -a并再次尝试,但是它仍然给出同样的错误。

我做错了什么?我该如何将代码从-在这种情况下- Branch1与Branch3合并?


9
这个问题过于复杂。应该更清楚地指明哪个分支有这段代码,以及我们希望将这段代码合并到哪个分支中。 - sbhatla
7个回答

513

首先,将代码库切换到您的Branch3分支:

git checkout Branch3

然后合并Branch1:

git merge Branch1

如果你想在Branch2上更新Branch1的提交记录,你可能需要使用git rebase命令。

git checkout Branch2
git rebase Branch1

此操作将使用Branch1的最新更新来更新您的Branch2。


1
当我在两个分支中执行git branch -a时,Branch2可以看到Branch1,但反过来不行。 因此,我无法在Branch1中对Branch2进行rebase操作: git rebase Branch2 --> 致命错误:需要单个修订版本 - Nemelis
1
那么上述操作是将Branch1的所有提交合并到Branch3中,还是将Branch3的所有提交合并到Branch1中?Master -> git branch Dev(在Dev分支上-> git branch Dev1)。我对Dev1进行了更改,并希望将其与Dev合并。 - Si8
2
@Si8 这将仅将 Branch1 中的提交添加到 Branch3 中。Branch1 将保持不变。 - gabra
1
谢谢,所以如果我现在在Dev分支上,并且将Dev1合并到Dev分支,那么它会将Dev1合并到Dev分支,是吗? - Si8
2
是的,我建议尝试一下。如果出现问题,您可以回退。这就是版本控制系统的目的。 - gabra
显示剩余2条评论

157
 git checkout [branchYouWantToReceiveBranch] //checkout branch to receive branch
 git merge [branchYouWantToMergeIntoBranch]

6
对我来说,这是一个简单且应该被接受的答案! - Nam G VU
1
同意,这对我来说也是最好的答案,易于理解。 - kapaakinos

102

您可以使用以下命令:

git checkout <the branch you want to merge into>

git merge <the branch you want contents from>

3
这是第四个给出完全相同答案的回复。我是否漏掉了什么,或者为什么它会有43个赞? - phil294
12
@phil294这个人说的话,这个人表达得更好。 - Leonardo Wildt
8
这个很易读。 - wintermute
1
我更喜欢的答案。它更易读。 - Jayhymn

60

要将一个分支合并到另一个分支中,例如将“feature_x”分支合并到“master”分支中:

git checkout master

git merge feature_x

* 注意,原始分支名称现在通常为main而不是master。根据您的情况选择正确的名称。

当搜索“git将一个分支合并到另一个分支”时,此页面是几个搜索引擎的首选结果。但是,原始问题比标题暗示的更具体和特殊。
它也比主题和搜索表达式更复杂。 因此,这是一个简明但解释性的答案,以使大多数访问者受益。


19

如果您是从Github复制了一个分支名称而来到这里,请注意远程分支不会自动成为本地分支,因此合并操作将无法工作并显示“我们无法合并”的错误。

在这种情况下,您有两个选择:

git checkout [branchYouWantToMergeInto]
git merge origin/[branchYouWantToMerge]
或者
# this creates a local branch
git checkout [branchYouWantToMerge]

git checkout [branchYouWantToMergeInto]
git merge [branchYouWantToMerge]

3
一个略微冗长但同样有效的方法是:
在分支3中:
git fetch origin Branch1
git merge --no-ff origin/Branch1

此时可能会出现合并冲突,请保存包含合并冲突的文件上所做的所有更改。

git add -A
git commit -m "Merge"
git push

已完成


0
更安全的方式,从git 2.23.0开始
git switch Branch3
- 切换到当前分支的Branch3
git merge Branch1
- 将Branch1分支合并到当前分支
(可选)将一个分支的提交更新到另一个分支上
git switch Branch2
git rebase Branch1

为什么要使用`switch`分支而不是`checkout`:
- 使用专用命令切换分支而不是多功能的`checkout`,是一种更安全的切换和合并分支的方式。 - `checkout`命令被拆分(替换)为`switch`和`restore`命令,因为它容易引起混淆和错误。 - 这是项目git commit,介绍了拆分为`switch`和`restore`命令的说明。 - 这是git团队的解释: > "git checkout" 做太多事情会让很多用户感到困惑(甚至有时候会让老手也犯错)。为了解决这个问题,该命令将被拆分为两个新命令:switch和restore。好用的"git checkout"命令仍然存在,直到所有用户(或大多数用户)都对它感到厌倦为止。
额外的信息:
- 当你不想将两个分支合并成一个分支时,可能会派上用场。 - 例如,`mess-around-branch` 和 `feature` 必须有各自的历史记录。 或者你的 `dev` 分支必须包含每一个"步骤",但 `master` 只应包含对 `dev` 分支的所有提交的累积提交。
Git 默认使用“快进合并”(fast-forwarding)的方式,人类可理解的意思是,如果可能的话(移动指针到最新的提交,而不是合并提交),它会将分支合并成单一的历史记录。
它将合并这个。
| * changed targetSdk 32 to 33
| * code cleaning
|/
* First commit 

转换成这个
* changed targetSdk 32 to 33
* code cleaning
* First commit

如果你需要分支历史记录,请告诉Git不要使用--no-ff。
使用git merge --no-ff Branch1命令,可以让你手动提交合并所创建的更改。
合并后保留两个分支的日志。
*   code cleaning, sdk 33
|\
| * changed targetSdk 32 to 33
| * code cleaning
|/
* First commit


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接