首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Git拒绝我的pull,仅仅因为我在本地分支上有一个提交?

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

Stack Overflow用户
提问于 2012-04-09 09:14:26
回答 1查看 17.8K关注 0票数 14

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

但是,如果他已经推送到主分支,同时我进行了本地提交,那么当我尝试拉取时,我会得到这样的结果:

代码语言:javascript
复制
! [rejected]        master    -> master  (non-fast-forward)

但我知道不应该有任何冲突。

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

代码语言:javascript
复制
% 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,然后在上面拉并提交。

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

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

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

代码语言:javascript
复制
% 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

然后我创建了“远程”存储库。

代码语言:javascript
复制
% cd
% mkdir remote
% cd remote
% mkdir website.git
% cd website.git/
% git init --bare
Initialized empty Git repository in /Users/jason/remote/website.git/

然后我回到了本地,创建了一个裁判,并推向遥控器。

代码语言:javascript
复制
% 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

在那之后,我将远程复制到另一个本地。

代码语言:javascript
复制
% cd
% mkdir local-2
% cd local-2
% git clone ~/remote/website.git
Cloning into website...
done.

然后,我从第二个本地创建了一个远程引用并推送(我认为这就是我制造问题的地方)。

代码语言:javascript
复制
% cd website/
% git remote add web ~/remote/website.git
% git push web +master:refs/heads/master
Everything up-to-date

然后我更改为local-2,提交并推送。

代码语言:javascript
复制
% 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进行了不同的更改,提交并尝试推送。

代码语言:javascript
复制
% 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.

太棒了!来一把怎么样?

代码语言:javascript
复制
% git pull web master:master
From /Users/jason/remote/website
 ! [rejected]        master     -> master  (non-fast-forward)

好,这就是问题所在。我该如何修复它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-18 14:05:50

你可能打算这样做:

代码语言:javascript
复制
git pull web master

使用master:master试图在拉入的获取阶段直接更新本地master分支,这会导致非快进错误。

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

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10067930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档