Git pull 显示为最新,但 Git push 拒绝了非快进式更新。

36
我刚刚拉了一个新分支,做了一些本地更改,提交并尝试推送。我得到了这个错误:![rejected] groups -> groups(非快进) 所以我尝试拉取,但被告知已经是最新的。 这是我在拉取后推送时得到的结果。
~/dev$ git pull origin groups
Already up-to-date.
~/dev$ git push origin groups
To /mnt/ebs/git/repo.git
 ! [rejected]        groups -> groups (non-fast forward)
error: failed to push some refs to '/mnt/ebs/git/repo.git'

有人能解释一下这是如何发生的,以及我该如何解决吗?


@dan:-v 除了再次显示仓库路径外,不会提供任何其他输出。Pushing to /mnt/ebs/git/repo.git - Jake
我会查看两个仓库中组的头部的哈希值,它们应该匹配。但如果不匹配,那么这就是正确的错误。如果它们不匹配,并且远程仓库不是本地仓库的前缀。 - Dan D.
解决这个问题的最佳方法是在gitk中查看本地和远程分支(gitk groups origin/groups),亲自观察它们的差异。你可以直接查看我们需要从你的问题中推断出来的历史记录。 - Cascabel
为了让事情变得更加棘手,这是通过SSH访问的服务器。我认为这意味着gitk不可行。 - Jake
不对!确保你已经获取了所有内容(git fetch origin),然后启动gitk。 origin/groups 是一个远程分支,它是指向远程分支所在位置的本地指针。 - Cascabel
2
在我的情况下,我试图将我的命名分支推送到另一个远程的 master 分支,正确的语法是 git push myremote namedbranch:master;如果您不指定 localbranch:remotebranch,或者只指定远程分支名称,它会尝试推送您的本地分支,该分支命名为我期望的远程分支名称。 - ThorSummoner
3个回答

29

当你拉取分支时,你是否使用了"--track"选项(以便使你的本地分支跟踪远程分支)。如果没有这样做,那么这可能解释了"merge"命令无法运行的原因。

你可以手动执行合并:

git fetch
git merge origin/groups

为了比较本地和远程仓库,我建议您使用以下命令(将其添加到别名中,非常有用):

git log --graph --oneline --all --decorate

它将打印项目历史树,显示分支标签。因此,您将看到您的分支和原始分支分歧的位置。

注意:如果您想保留线性历史,而不是“合并”,则可以在推送之前将本地分支“变基”到远程分支:

git rebase origin/groups
git push origin groups

我从来没有在--graph方面有过什么好运气,据我所知,我已经安装了最新版本的git,但它说这是一个无法识别的参数。 - Jake
2
原来我有一个名为origin/groups的本地分支和一个远程分支。 - Jake

6

我来这里是因为有一个不同的问题。

我的 git 已经设置为推送所有分支。我在 FOO 分支上,但它也试图推送 master 分支,而该分支并不是最新的。关键是注意到它正在尝试推送 master 分支:

To git@git.machine:repo
 ! [rejected]        master -> master (non-fast-forward)

我在我的.gitconfig文件中添加了以下内容,以便默认仅推送当前分支:
[push]
    default = current

2

这不是对所提问题的答案。我遇到了一个不同的问题,但错误信息相同。

我的本地分支没有正确配置以从远程分支中拉取更改 [git pull]。这可以从git remote show origin的输出中明显看出。因此,我必须使用git pull origin <branch_name>而不是git pull来拉取更改。


嗨 Garnet,这似乎是和我的问题一样。我想知道如何将我的当前分支与远程分支进行映射的解决方案是什么... - Mukesh Kumar
嗨,Mukesh,我还没有尝试添加映射。我只是指定了远程仓库别名“origin”,并按照答案中提到的方式执行了git pull: git pull origin <branch_name>而不是git pull来拉取更改。 - garnet
谢谢 Garnet 的回复。那个解决方案对我来说似乎有效。但是,我需要一个命令来配置它以进行不带 origin 的 git pull。它应该像以前一样工作。 - Mukesh Kumar

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