Почему Git отклоняет запрос только потому, что у меня есть фиксация в моей локальной ветке?

На сервере есть Git-репозиторий, который мы с коллегой отправляем и извлекаем. Он отлично работает, пока мы тянем перед фиксацией.

Однако, если он запушил в ветку master, а я тем временем сделал локальный коммит, то при попытке вытащить я получаю вот это:

! [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

Затем я сделал "удаленный" репозиторий.

% 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.

Затем я создал ссылку на удалённый из второго локального и нажал (здесь я создаю проблему, я думаю).

% 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)

Итак, вот в чем проблема. Как это исправить?

14
задан Peter Mortensen 15 January 2018 в 23:40
поделиться