git:为什么会出现“Merge branch 'master' of ...”?在进行拉取和推送操作时

39

我还是一个 Git 新手。我修改了一些源文件并提交了。然后,我执行了 git push 命令。但是,我得到了以下错误提示。

To /foo/bar/  ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '/foo/bar/' To prevent you from
losing history, non-fast-forward updates were rejected Merge the
remote changes before pushing again.  See the 'Note about
fast-forwards' section of 'git push --help' for details.

这个错误似乎是因为在进行push操作之前我没有执行git pull。所以,我执行了git pull。好的,有两个文件已经被其他人修改过了。

接着,我成功地执行了git push

问题:在这种情况下,我看到我的原始提交信息后还有一个类似以下内容的日志:

commit 59e04ce13b8afa...
Merge: 64240ba 76008a5
Author: Jone Doe <jone@doe.com>
Date:   Fri Mar 15 11:08:55 2013 -0700

    Merge branch 'master' of /foo/bar/

这是我最初的提交消息。

commit 64240bafb07705c...
Author: Jone Doe <jone@doe.com>
Date:   Fri Mar 15 11:06:18 2013 -0700

    Fixed bugs and updated!

我想了解为什么要添加“合并位置的主分支”。


可能是Git拉取导致提交日志中出现多余的“合并分支”消息的重复问题,该问题有更详细的答案。 - steve cook
2个回答

30
当您执行git-pull命令时,来自远程分支的修改将被合并到本地分支中。自动生成的提交记录表示此操作。
合并可能导致冲突,需要手动解决。但在您这种情况下,没有发生冲突,Git 可以自动处理一切。

1
有没有办法避免这样的额外提交?例如,将合并修改包含在当前提交中(上面的“修复错误和更新!”)?因为它会污染日志历史记录。 - kalvn
8
如果远程分支领先于本地分支,即远程分支在本地分支的提交之上有一些提交,则Git将尝试进行快进式合并。在这种情况下,不需要额外的提交。仅当两个分支的历史记录分叉时,才会出现附加提交。在这种情况下,您可以使用 git rebasegit pull --rebase 重写本地分支的提交历史,执行快进式合并。然而,重新定义基础可能会有其自身的缺点,并且额外的合并提交并不总是坏事-它们只是记录了开发过程的轨迹。 - r.v
感谢您的解释 :) - kalvn

13
如果其他人进行了更改,那么执行git pull --rebase可能是个好主意(即在远程更改之后添加您的新更改; 这可能会发现您需要解决的冲突),然后将结果git push。注意,这将创建以前不存在的新提交(与任何历史重写一样),但它提供了一个干净的线性历史记录(没有合并交错)。

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