I';我试图合并两个不同的分支,但git告诉我一切都是最新的

I';我试图合并两个不同的分支,但git告诉我一切都是最新的,git,version-control,Git,Version Control,我是个笨蛋,我知道我在这里遗漏了一些基本的东西。我有三个分支:master、feature1和feature2。没有两个分支是相同的,但是任何从一个分支合并到另一个分支的尝试都会产生“最新”消息。你可以想象,我已经完成了feature1和feature2的工作,现在我只想把这项工作合并到我的主人那里 以下是我当前的图表: * c719e79 master |\ | * 3f38259 feature2 | * 4e2af8c | * a6ee18c | * 2339052 | * 2e3

我是个笨蛋,我知道我在这里遗漏了一些基本的东西。我有三个分支:master、feature1和feature2。没有两个分支是相同的,但是任何从一个分支合并到另一个分支的尝试都会产生“最新”消息。你可以想象,我已经完成了feature1和feature2的工作,现在我只想把这项工作合并到我的主人那里

以下是我当前的图表:

*   c719e79 master
|\  
| * 3f38259 feature2
| * 4e2af8c
| * a6ee18c
| * 2339052
| * 2e31d49
| * 2586659
| * 8b4a194
| * 56200c1
| * 97598e3
| * c28bc8d
| * 68b2e2f
| * 1ad4ad8
| * 3d5f4ad
| * 83435ca
| * 4049428
| * 581134a
| * 6e5aa2d
* | 2c88093
|/  
* 3130ec9 feature1
* 54a5311 INITIAL COMMIT
有什么想法吗


更新 VonC-解释是有道理的,但我的git回购协议仍然没有。当我切换到主分支,然后运行“$git diff--stat feature2”时,我得到以下输出:

$git diff --stat feature2
File1      |    2 +-
File2      |    6 +++---
File3      |    4 ++--
File4      |    2 +-
File5      |    2 +-
5 files changed, 8 insertions(+), 8 deletions(-)
如果对feature1运行相同的命令,我会得到更长的文件列表。所以我仍然有它告诉我我是最新的,但是每个分支中的文件都是不同的


更新2 @斯科特-好吧,我想你的回答有助于澄清我的问题。我知道合并不会使所有分支完全相同,而只会更新我所在的分支

然而,我的提交似乎“出了问题”,或者什么的。换句话说,feature2分支上存在一些更改,我希望这些更改显示在我的主分支上。Git必须认为我的主分支上的文件版本是“正确”的(不管这意味着什么)。当Git认为当前master上的更改是最新和最伟大的时,如何让Git将feature2分支上的差异提交给我的master分支


更新3(最终版) 嗯,我非常感谢你们所有试图帮助我的人。我找到了一个解决问题的方法,但我从来没有真正想到如何去做我想做的事情

在仔细考虑了你的一些评论之后,我做了一个重新基调。提交历史的图表是一条直线,正如您所期望的那样。然而,问题并没有消失:我的feature2分支比master慢了一次提交,但它包含的代码实际上使它成为具有“最新和最好”代码的分支。尝试合并分支没有任何效果。最后,我决定在feature2分支的基础上创建一个新分支,并将其命名为“最新”。所以我想,最后,我很感激使用git进行分支是多么容易。但很明显我错过了一些东西


再次感谢大家。

执行合并命令时,您是否在“主”分支中

git checkout master
git merge feature1
git merge feature2

您可以签出branch
master
,确保提交了所有更改,然后重试

git pull . feature1 feature2
但我自己并不是一个git专家,所以我不能肯定地告诉你这将做什么。我的意思是,我知道它应该将
feature1
feature2
合并到
master
,但我不能保证它会以您想要的方式将它们完全合并

我建议先备份存储库,以防万一。尽管我认为如果出现问题,您总是可以
git reset--hard HEAD^

这个“已经更新”确实意味着一个分支在另一个分支的祖先中,来自一个分支的所有更改都在另一个分支中。
从:

如果所有命名的提交都已经是HEAD的祖先,
git merge
将提前退出,并显示消息“ready-update”

这里,
feature1
的负责人是
master
的祖先(
master
有一些新作品是由
feature1
负责人制作的)。
因此,
git merge feature1
将产生一条“已经是最新的”消息

至于
feature2
,您的图形日志显示它已在
master
中的某个点合并
尝试重新进行合并也会导致“已经是最新的”


在使用branch master时,我使用的是git merge功能1和git merge功能2

发生的是所谓的FF(快进)-合并

从手册页:

git合并定义:

git合并-将两个或多个开发历史记录连接在一起

发生了什么:

快进合并

通常,当前分支头是命名提交的祖先。这是最常见的情况,尤其是>从git pull调用时:您正在跟踪上游存储库,没有提交任何本地更改,>现在您希望更新到更新的上游版本。在这种情况下,不需要新的提交来存储>组合的历史;相反,头部(连同索引)被更新为指向指定的提交, 不创建额外的合并提交

使用--no ff选项可以抑制此行为

()

游览:关于分支机构的附加信息

由于分支只不过是指向提交的指针,
feature1
/
feature2
master
的祖先(如前所述),因此没有理由“复制”提交(以及提交的历史记录)。只需将
master
-分支(-pointer)重新指向上一次提交,性能更高

为什么主分支指针不在
3f38259
commit上?

我不太确定,但我认为:

git merge feature1
已根据默认设置启用自动提交选项(显式:
--commit
)。这样就创建了一个提交。另外,在
master
-分支中有
2c88093
提交,但在
feature2
-分支中没有提交,这避免了将
master
-分支指针仅指向
3f38259 feature2
提交以生成类似的内容

3f38259 feature2 master(*)

如果将
master
重新显式指向
3f38259
分支,您将在历史记录中“丢失”提交的
2c88093

问题在于,当您将feature1和feature2分支合并到中时,它们将与master一样发生更改。但是,仅合并ef
$ git checkout feature1
$ git merge master
$ git checkout feature2
$ git merge master