在Git中将两个分支合并

246

我刚开始使用 Git,发现它很棒,但是我有点困惑什么是“合并”命令。

假设我们在分支“A”中有一个正在进行的项目。

我回家后对这个分支进行更改,并将其保存为“B”。 另一个程序员对“A”进行更改,并将其保存为“C”。

是否有一种方法将两个分支“B”和“C”合并在一起,然后将更改作为新分支提交,例如“D”?

还是我误解了“合并”的意义?


先工作在 A 分支,然后将不同的 A 分支合并在一起。 - knittl
我不明白。A会在我的本地计算机上,dev1会在他的计算机上拥有A的副本,而dev2会在他的计算机上拥有A的副本。两个开发者都进行更改,我该如何将这些更改合并在一起? - dotty
请参见http://www.kernel.org/pub/software/scm/git/docs/git-pull.html。开发人员可能需要先将他们的存储库推送/上传到某个地方。 - knittl
4个回答

312

merge 用于将两个(或多个)分支合并在一起。

下面是一个小例子:

$ # on branch A:
$ # create new branch B
$ git checkout -b B
$ # hack hack
$ git commit -am "commit on branch B"

$ # create new branch C from A
$ git checkout -b C A
$ # hack hack
$ git commit -am "commit on branch C"

$ # go back to branch A
$ git checkout A
$ # hack hack
$ git commit -am "commit on branch A"

现在有三个分支(即A、B和C),每个分支都有不同的头部。

要将B和C中的更改合并回A,首先切换到A(本例已完成此操作),然后使用合并命令:

$ # create an octopus merge
$ git merge B C

你的历史记录将会看起来像这样:

…-o-o-x-------A
      |\     /|
      | B---/ |
       \     /
        C---/

如果您想跨存储库/计算机合并代码,请查看git pull命令,例如从具有A分支的PC开始(此示例将创建两个新的提交):

$ # pull branch B
$ git pull ssh://host/… B
$ # pull branch C
$ git pull ssh://host/… C

这意味着两个分支更改了相同的代码。解决冲突,git add conflicting_files 然后 git commit - knittl
如果文件A中包含单词“hello”,A将其修改为“HELLO”,B将其修改为“Hello world”,合并这些文件的结果会是什么? - dotty
45
虽然Git看起来常常像是魔法一样,但它实际上无法读取你的思维 - 如果两个分支对相同内容做出了不同的更改,只有人类才能想办法协调它们。这就是合并冲突。 - Cascabel
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Stryker
哇,那个历史记录看起来像 GitLab Tanuki - Dorad
显示剩余3条评论

176

如果你想要将 SubBranch 的更改合并到 MainBranch 中:

  1. 你需要切换到 MainBranch 分支:git checkout MainBranch
  2. 然后运行合并命令:git merge SubBranch

19
同意,有时候简单就是美。 - Marcelo Scofano Diniz
我能撤销这个操作吗? - Yohanelly
1
@Yohanelly 是的,你可以将 Git HEAD 重置到任何提交。 - Mohamed Shaban
(在主分支上)这意味着git合并“SubBranch”,其中“SubBranch”将是合并的基础分支。因此,对“SubBranch”的任何更改都将应用于“MainBranch”,对吗?谢谢!我已经尝试过了。 - Ice Bear

5

案例:如果您需要忽略默认创建的合并提交,则请按照以下步骤操作。

假设从主分支检出了一个新的功能分支,已经有两个提交:

  • "添加 A","添加 B"

检出一个新的 feature_branch

  • "添加 C","添加 D"

然后功能分支添加了两个提交-->

  • "添加 E","添加 F"

enter image description here

现在,如果您想要将feature_branch的更改合并到master中,请在master上执行git merge feature_branch

这将添加所有提交到主分支中(4个主分支+2个feature_branch =总共6个)+额外的合并提交,例如'Merge branch 'feature_branch''作为主分支已分离

如果您真的需要忽略此合并提交,并添加一个新提交,例如'Integrated feature branch changes into master',请运行git merge feature_merge --no-commit

使用--no-commit,它执行合并并在创建合并提交之前停止,现在我们将在主分支中获得feature分支中添加的所有更改,并有机会创建自己的新合并提交。

编辑2023:现在,在较新版本的git中,您可以选择交互式更改合并提交,而无需指定--no-commit选项。

在此处阅读更多:https://git-scm.com/docs/git-merge


-2

将您的子分支更改为主分支

git branch -m main <BRANCH>;

git fetch origin;

git branch -u origin/<BRANCH> <BRANCH>;

git remote set-head origin -a

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