我现在使用SVN一段时间了。但我只是使用checkout,update和commit,因为我只需要有历史记录的备份。
我现在在一个新项目中尝试Git。这是我做的:
一切都很好。我查了Bitbucket,文件就在那里。那是昨天。今天我做了:
我收到了一条错误消息。我没有保存它,但它说了一些关于快进的事情。出于某种原因,我无法将我的提交推送到存储库。我做了几次提取,提交和推送,并在推送时遇到了同样的错误。然后我做了一个拉,据我所知是一个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
这很奇怪。第一次提交是对的。这是昨天完成的。但第二个应该有今天的日期。但它与昨天完全相同,直到秒。还有第三次提交,只是合并,与今天的约会。
这是应该的样子吗?或者我做错了什么?我是否必须在提交和推送之间进行合并?
答案 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)
我弄清楚问题是什么。我在第二次提交时检查了“修改最后提交”。所以,基本上我做了:
我得到的错误是:
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
然后我可以推。
修改已经推送的提交是问题所在。这就是两个提交具有相同日期的原因。
感谢大家的帮助。