在Git中合并是强制性的吗?

时间:2012-01-26 01:54:09

标签: git

我现在使用SVN一段时间了。但我只是使用checkout,update和commit,因为我只需要有历史记录的备份。

我现在在一个新项目中尝试Git。这是我做的:

  • 在Bitbucket中创建了一个存储库。
  • 将Git克隆到我的机器上。
  • 创建了几个文件。
  • Git commit -a。
  • Git push。

一切都很好。我查了Bitbucket,文件就在那里。那是昨天。今天我做了:

  • 添加了更多文件。
  • Git commit -a。
  • Git push。

我收到了一条错误消息。我没有保存它,但它说了一些关于快进的事情。出于某种原因,我无法将我的提交推送到存储库。我做了几次提取,提交和推送,并在推送时遇到了同样的错误。然后我做了一个拉,据我所知是一个fetch后跟一个合并,然后一个推,它工作(有点)。我的存储库日志现在看起来像这样:

commit ef6b0e51c8278ef15d1d84770a56929f7c30cc63
Merge: 15d482c ab3938a
Author: xxx
Date:   Wed Jan 25 04:25:39 2012 -0200

    Merge branch 'master' of bitbucket.org:xxx/xxx

commit 15d482c0bd2e9b894afd779520dbfdbad7f43616
Author: xxx
Date:   Tue Jan 24 03:50:43 2012 -0200

    xxx

commit ab3938aaacb089f1c4f3bdbb8d843a105991f776
Author: xxx
Date:   Tue Jan 24 03:50:43 2012 -0200

    xxx

这很奇怪。第一次提交是对的。这是昨天完成的。但第二个应该有今天的日期。但它与昨天完全相同,直到秒。还有第三次提交,只是合并,与今天的约会。

这是应该的样子吗?或者我做错了什么?我是否必须在提交和推送之间进行合并?

4 个答案:

答案 0 :(得分:1)

如果你不能推送,因为它不是快进更新,那么这意味着有人推送提交到bitbucket。快进更新是当前提交历史记录中先前提交的更新,即。你没有合并,你只是快速转发时间。

Pull将执行git fetch然后git merge,这可能会或可能不会导致实际合并,如果可能的话,git默认会执行快进。

从上面的日志中可以看到实际的合并,所以我们回到原点。不知何故,一些额外的提交进入了你的bitbucket存储库。您是否可以在线进行一些编辑?

关于要求合并的问题,不是需要进行合并。你需要解决这个问题。您可以通过以下两种方式之一完成此操作。你可以做一个合并,或者你可以做一个被称为rebase的东西。基本上,当您执行rebase时git会执行的操作是将提交的差异重新应用到备用历史记录的末尾。这就产生了一种错觉,即您直接在其他新作品上完成了新作品。 Git会保留作者和提交日期,因此如果您经常重新定位,历史记录会变得有点非线性,但有些人更喜欢单行历史记录。您可以使用git pull --rebase

轻松完成变基

答案 1 :(得分:1)

只有在推入的分支可以使用fast-forward合并在推入分支上合并时,才可以进行推送,这意味着远程分支的当前头部必须是本地分支历史记录的一部分。如果您没有将最新版本的远程分支合并到您的本地分支中,则推送将失败(这与svn相同,如果您的本地版本不是,则无法提交最近的)。

因此,看起来好像有一个提交被推到了那个分支(在远程仓库上),在你推动昨天和你今天试图推动之间,尽管有了给出的信息,我无法说出它来自哪里。

因此,如果你单独在一个分支上工作(并且只在一个地方工作),你通常可以简单地提交和推送,否则你可能需要使用git fetch后跟git merge(或只需git pull)即可将最新版本的远程分支转换为您自己的版本,然后才能推送它。

答案 2 :(得分:1)

听起来像其他一些用户在你的BitBucket存储库中添加了一个提交。你所描述的正是如果你的推送失败并且git无法快进的消息会发生什么。

显然必定会发生这种情况,因为git log报告在ef6b0e5中有某些要合并。

你找到了解决方案:你必须从Bitbucket回购中提取(将上游更改合并到你的分支中),然后git才会允许你推送你的更改。

答案 3 :(得分:1)

我弄清楚问题是什么。我在第二次提交时检查了“修改最后提交”。所以,基本上我做了:

  • 在Bitbucket上创建存储库。
  • 克隆。
  • 添加file1。
  • 提交。
  • 推。
  • 添加文件2.
  • 提交--amend
  • 推。

我得到的错误是:

git.exe push --progress  "origin" master:master

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

我尝试了抓取和合并。仍然无法推动。我不得不拉。我得到了:

git.exe pull -v --progress      "origin"

From bitbucket.org:xxx/test_repo
= [up to date]      master     -> origin/master
Merge made by the 'recursive' strategy.
Success

然后我可以推。

修改已经推送的提交是问题所在。这就是两个提交具有相同日期的原因。

感谢大家的帮助。