为什么Git仅仅因为我在本地分支上有一个提交就拒绝我的拉?

为什么Git仅仅因为我在本地分支上有一个提交就拒绝我的拉?,git,Git,服务器上有一个Git存储库,我和我的同事都可以推送和从中取出。只要我们在提交之前拉,它就可以正常工作 但是,如果他已经推到主分支,同时我已经做出了本地承诺,当我尝试拉时,我得到以下结果: ! [rejected] master -> master (non-fast-forward) 但我知道不应该有冲突 我绕过它的方法是拉入一个新的临时分支,然后将其合并到我的主分支中,如下所示: % git pull origin master:temp From ssh://e

服务器上有一个Git存储库,我和我的同事都可以推送和从中取出。只要我们在提交之前拉,它就可以正常工作

但是,如果他已经推到主分支,同时我已经做出了本地承诺,当我尝试拉时,我得到以下结果:

! [rejected]        master    -> master  (non-fast-forward)
但我知道不应该有冲突

我绕过它的方法是拉入一个新的临时分支,然后将其合并到我的主分支中,如下所示:

% git pull origin master:temp
From ssh://example.com/home/my/remote/repo
 * [new branch]      master    -> temp
Already up-to-date.
% git merge temp
Already up-to-date.
% git push origin master:master
请注意,Git表现得好像我什么都没做,但实际上我已经摇动它,让它屈服了

最近我意识到,我没有试图“说服”Git我可以拉。我可以假装我还没有用
git reset--soft HEAD ^
git stash
提交,然后在上面做pull和commit

是什么导致了这种奇怪的挑剔行为

我能够在本地机器上重现这个问题。以下是我所做的:

首先,我创建了第一个“本地”存储库并添加了一个文件

% cd
% mkdir local-1
% cd local-1/
% mkdir website
% cd website/
% git init
Initialized empty Git repository in /Users/jason/local-1/website/.git/
% touch file
% git add .
% git commit -m 'added file'
[master (root-commit) 6d4b322] added file
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file
然后我创建了“远程”存储库

% cd
% mkdir remote
% cd remote
% mkdir website.git
% cd website.git/
% git init --bare
Initialized empty Git repository in /Users/jason/remote/website.git/
然后我回到本地,创建了一个ref并推送到远程

% cd ~/local-1/website/
% git remote add web ~/remote/website.git
% git push web +master:refs/heads/master
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /Users/jason/remote/website.git
 * [new branch]      master -> master
在那之后,我把遥控器克隆成了另一个本地设备

% cd
% mkdir local-2
% cd local-2
% git clone ~/remote/website.git
Cloning into website...
done.
然后,我从第二个本地创建了一个指向远程的ref并按下(我想这就是造成问题的地方)

然后我对local-2做了一个更改,提交并推送

% touch another
% git add .
% git commit -m 'added another'
[master be91180] added another
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 another
% git push web
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 238 bytes, done.
Total 2 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (2/2), done.
To /Users/jason/remote/website.git
   6d4b322..be91180  master -> master
最后,我对local-1做了一个不同的更改,承诺并尝试推动

% cd ~/local-1/website/
% touch something
% git add .
% git commit -m 'added something'
[master 3984529] added something
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 something
% git push web
To /Users/jason/remote/website.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '/Users/jason/remote/website.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 pull web master:master
From /Users/jason/remote/website
 ! [rejected]        master     -> master  (non-fast-forward)

好吧,问题来了。如何修复它?

您可能打算:

git pull web master
使用
master:master
试图在导致非快进错误的拉取阶段直接更新本地
master
分支


如果您所在的分支设置为跟踪
web/master
,那么您只需要
git pull web
,这也会更新远程跟踪分支。

您在开始时描述的行为肯定不正常。(不过,这与合并冲突无关。)在
.git/config
~/.gitconfig
中有什么不寻常的地方吗?如果你不确定,要么把它全部评论出来测试,要么把整个事情都贴出来。(我想为
pull.twohead
设置一些东西可能会导致这种情况……)您是否成功创建了任何奇怪的引用?运行
gitk--all
并检查,或者更严格地说,为每个ref运行
git
。如果有任何称为master的东西不是
refs/heads/master
refs/remotes/origin/master
,那可能是个问题。我看到了“最佳实践”建议,建议将
pull
别名为
pull--ff only
,这将导致您描述的情况。我会特别检查它。@cluness:啊,是的,我检查了一下是否有
pull.ff only
config选项,但我没有想到这一点。看来是个好猜测@Jefromi,我的配置没有什么奇怪的,但我确实在gitk的历史中发现了一些东西。我在本地机器上启动了第一次回购,并使用“web”作为远程服务器的名称。当我的同事从我安装的服务器克隆repo时,他添加了“web”的ref,而没有删除“origin”的默认ref。我在我的repo(它总是通过“web”调用remote)中发现的事实上有一个旧的commit,上面写着
remotes/origin/master
。这就是问题所在吗?我怎样才能清理它?我想你需要再看看你的配置。
master
从哪个遥控器中拉出?拉的别名是什么?(过时的远程分支不是问题,但您可以使用
git branch-r-d origin/master
删除它)。这么长的问题,这么简单!当我试图将Heroku端点的主分支引入本地开发时,我遇到了完全相同的问题。我也遇到了同样的问题。但是我使用
git-pull-origin-trunk:master
,因为我使用
git-svn
获取更改。所以这不能解决这个问题。
git pull web master