服务器上有一个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
投放,然后执行拉动并提交。
可能导致这种奇怪的挑剔行为的原因是什么?
我能够在本地计算机上重现此问题。这就是我的所作所为:
首先,我做了第一个"本地"存储库并添加了一个文件。
% 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
然后我制作了#34;遥控器"库中。
% cd
% mkdir remote
% cd remote
% mkdir website.git
% cd website.git/
% git init --bare
Initialized empty Git repository in /Users/jason/remote/website.git/
然后我回到了当地,创建了一个参考并推到了遥控器。
% 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并推送(这是我创建问题的地方)。
% cd website/
% git remote add web ~/remote/website.git
% git push web +master:refs/heads/master
Everything up-to-date
然后我对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)
好的,这就是问题所在。我该如何解决?
答案 0 :(得分:18)
你可能打算这样做:
git pull web master
使用master:master
尝试在拉取的获取阶段直接更新本地master
分支,这会导致非快进错误。
如果您位于设置为跟踪web/master
的分支上,那么您只需要git pull web
,这也将更新您的远程跟踪分支。