git push合并错误,但git pull已经是最新的。尝试重新克隆,仍然存在同样的问题。

5

我会:

$ git commit .
$ git push
error: Entry 'file.php' not uptodate. Cannot merge.

那么我就这样做

$ git pull
Already up-to-date.

我该怎么做?我只想从远程副本获取最新版本,并覆盖本地副本中的任何内容。

编辑:我尝试了一切。我删除了本地仓库,然后

$ git clone ssh://root@something.com/directory
...
Checking out files: 100%, done.

$ git status
On branch master
nothing to commit (working directory clean)

一切看起来都很好,对吧?但为了保险起见,还是要拉一下。

$ git pull
Already up-to-date.

我在一个文件中进行了一行更改,以查看是否可以推送它。

$ git commit .
[master 1e18af1] Rando change
1 files changed, 2 insertions(+), 0 deletions(-)

$ git push
Counting objects: 13, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (7/7), 646 bytes, done.
Total 7 (delta 3), reused 0 (delta 0)
From /directory
d6d61aa..1e18af1  master     -> origin/master
error: Entry 'someotherfile.php' not uptodate. Cannot merge.
Updating b8f9a54..1e18af1
To  ssh://root@something.com/directory
d6d61aa..1e18af1  master -> master

我完全不知道发生了什么!我该怎样正常地提交/拉取?非常感谢!


你确定要提交你的更改吗?尝试使用 git commit -a -m "my commit" 命令来进行提交。请注意,你必须添加一条注释,否则你提交的内容可能不会被保存(只是为了确保这种情况不会发生)。 - Khelben
我执行了以下操作:
git commit -a -m "我的提交"

在主分支上

没有要提交的内容(工作目录干净)
- atp
删除任何内容并重新克隆后应该可以解决,这是一个非常奇怪的问题... - Khelben
@Jasie,你使用了git rebase或其他可能会破坏索引的操作吗?这是我最好的猜测,否则,Git就会以某种神奇的方式迷失自己。 - jweyrich
我从来没有使用任何“花哨”的命令——只用了 clone、status、pull、commit、add 和 push。很奇怪,对吧? - atp
显示剩余3条评论
5个回答

4
尝试执行git checkout file.php,然后再次执行git push
更新:
  • git pull显示分支是最新的吗?
  • git status没有显示任何未合并的文件吗?
  • git commit正常工作吗?
如果您对上述所有问题的答案都是“是”,并且即使在获取远程代码库的干净副本(使用git clone)后,git push仍然失败,则很可能远程代码库存在索引问题。

尝试过了,但是在我推送后只显示“一切都已经更新至最新版本”。 - atp
git diff 会显示什么?冲突应该已经被 git commit 指出了,我猜测。此外,git status 会将它们显示为未合并的状态。 - jweyrich
git diff 没有显示任何输出。我想这意味着没有差异? - atp
在1.9版本的Git中,git checkout file 帮我解决了“not uptodate”错误消息。 我在执行 git merge --abort 时遇到了此错误消息。git status 表示有一个文件被修改,所以我将它保存在别处。然后执行了 git checkout file,并将该文件与保存的版本进行了比较,但没有发现任何可见的更改。不过我没有检查文件权限等等。无论如何,在执行了这个命令之后,git merge --abort 就正常工作了 :) - nealmcb

2
这只是一种猜测,你的远程仓库是一个裸仓库还是工作目录?如果是工作目录而不是裸仓库,那么远程的file.php文件有未提交的更改。你的git push命令试图推进远程的HEAD,这会导致由于未提交的更改而发生冲突。
这就是为什么通常使用git pull更新工作目录,并在裸仓库上使用git push。顺便说一下,要将裸仓库设置为类似于中央CVS / SVN /等仓库,请在远程执行以下操作: $ mkdir my-git-repo $ cd my-git-repo $ git init --bare 然后在本地仓库中: $ cd my-git-repo.git $ git remote add origin user@host:/path/to/my-git-repo/ $ git config branch.master.remote origin $ git config branch.master.merge refs/heads/master $ git push origin master 现在您拥有了一个裸仓库,可以将主分支推送/拉取到其中。您可以重复使用最后三个本地步骤,将任何其他本地分支放置在远程上。克隆与以前相同,您无需使用git config,因为远程会自动设置,并且当您使用跟踪分支时,远程合并引用会设置。
希望这有所帮助。

1

尝试执行 git status 命令,检查是否有未提交的更改在 'file.php' 文件中。您需要提交所有相同文件上的更改,否则 git 可能会更改您未提交的文件。

在拉取后尝试进行另一次提交,然后再次尝试拉取,检查任何可能的合并并推送数据。

如果您只想覆盖本地副本,请将文件 file.php 恢复到以前的版本(使用 git checkout HEAD^ file.php 命令检出上一个版本),然后从存储库中拉取。


我按照你的建议进行了修改(请参考上面的编辑),但是仍然没有效果。有什么其他的想法吗?另外,git checkout HEAD^ -- file.php 似乎不是一个有效的命令,-- 后面应该跟着什么呢(无法接受文件参数)。 - atp

1

我会将我的file.php从工作文件夹中剪切并粘贴到本地。比如说,放到你的桌面上。

然后执行pull操作,git应该会从服务器获取最新的file.php文件。然后只需将你的文件副本粘贴过去覆盖已拉取的文件,或者打开两个版本,然后将你的更改粘贴进去。

希望这样做能解决问题。


我希望拉取操作能够正常工作,但实际上它显示“已经是最新的了”。 - atp

0

你确定你没有已经有一个大小写不同的file.php文件吗?(例如File.phpfile.PHP...),就像这个答案中所述的那样?

  • 一个已经提交了
  • 一个在你的工作目录中,但大小写不同。

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