git: обновления были отклонены, потому что удаленный содержит работу, которой у вас нет локально

116

Я работаю в команде с несколькими разработчиками, использующими git на BitBucket. Мы все работаем над devветкой, не дожидаясь masterрелиза.

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

 ! [rejected]        master -> dev (fetch first)
error: failed to push some refs to 'https://myusername@bitbucket.org/repo_user/repo_name.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Я следую инструкциям и pull, но затем получаю конфликт слияния. После ввода сообщения о конфликте слияния мой локальный код теперь является неправильным кодом, который другой разработчик загрузил случайно (как и ожидалось из файла pull). Поэтому я заменяю неправильный код резервной копией, которую я скопировал перед фиксацией, и когда я снова пытаюсь нажать, я получаю ту же ошибку.

Это действительно расстраивает, я действительно хочу помочь своей команде и внести свой вклад, но я не могу из-за этой ошибки. Кто-нибудь знает, как решить эту проблему? Буду очень признателен за любую помощь.

Вот команды, которые я запускаю, чтобы зафиксировать, если это кому-то поможет:

git pull remotename master:dev
git add --all
git commit -m "some message"
git pull remotename master:dev
git push remotename master:dev

Я бы подумал, что если я сохраню этот порядок, у меня не будет конфликтов слияния. Думаю, я ошибался. еще раз спасибо

Обновление: я должен добавить, что несколько часов искал в Google и stackoverflow и выполнил разные инструкции, но все еще не могу pushперейти в devветку.

делос
источник

Ответы:

43

git pull <remote> master:devполучит remote/masterветку и объединит ее с вашей local/devветкой.

git pull <remote> devполучит remote/devветку и объединит ее с вашей текущей веткой.

Я думаю, вы сказали, что конфликтующий коммит включен remote/dev, так что вы, вероятно, намеревались получить и объединить эту ветку.

В этом случае вы фактически не объединяли конфликт в свою локальную ветвь, что довольно странно, поскольку вы сказали, что видели неправильный код в своей рабочей копии. Возможно, вы захотите проверить, что происходит внутри remote/master.

Джефф
источник
1
Вау ... Я этого не знала. Но теперь в этом есть большой смысл. Основная ветка также была неправильной, поэтому ваш ответ полностью очищает мой вопрос. Я все еще новичок в git. Большое спасибо, что рассказали мне разницу между этими двумя!
delos
6
Оптимальный вариант для меня был git pull --rebase.
derekmx271 02
160

Вы можете отменить любые проверки, которые выполняет git, используя "принудительное нажатие". Используйте эту команду в терминале

git push -f origin master

Однако вы потенциально можете проигнорировать существующую работу, которая находится в удаленном режиме - вы фактически переписываете историю удаленного доступа, чтобы она была точно такой же, как ваша локальная копия.

Донал
источник
51
Использование флага force push (-f) очень опасно, и он никогда не должен быть частью вашего обычного рабочего
процесса
6
Проголосовали против, так как в этом ответе отсутствует какое-то предупреждение.
Melebius
3
Ой! Это заставит репозиторий перезаписать себя.
Азарса
3
У меня была такая же ошибка с github, и я исправил ее с помощью этой команды: @theeastcoastwest, почему вы говорите, что это опасно? в чем ваша причина "
Саймон
4
@simon, это опасно, потому что он игнорирует удаленную работу и заставляет ваши изменения в репо. Так что, если вы не хотите испортить работу своей команды, НЕ ПРИСОЕДИНЯЙТЕСЬ.
Гастен
44

Это происходит, когда мы пытаемся нажать на удаленный репозиторий, но создали новый файл на удаленном компьютере, который, скажем, еще не был загружен Readme. В этом случае, как говорится в ошибке

git отклоняет обновление

поскольку мы не использовали обновленный удаленный доступ в нашей локальной среде. Так что сначала потяните с пульта

git pull

Он обновит ваш локальный репозиторий и добавит новый Readmeфайл. Затем отправьте обновленные изменения на удаленный

git push origin master
Химаншу
источник
Я делал это git pull origin developв своей локальной ветке разработки, но теперь я просто делаю git pullэто нормально, я не знаю почему.
Alex
потому что по умолчанию, если ваша локальная ветка синхронизирована с удаленной веткой, и вы зарегистрированы в этой ветке, вам не нужно указывать ветку, git pullдостаточно
Химаншу
11

Сила толкать

git push -f origin master

Самир Пудель
источник
2
Вероятно, это должно сопровождаться предупреждением.
Крис
11

Обычно это происходит, когда репо содержит некоторые элементы, которых нет локально. Итак, чтобы протолкнуть наши изменения, в этом случае нам нужно интегрировать удаленные изменения, а затем нажать.

Так что создайте тягу с удаленного

git pull origin master

Затем нажмите изменения на этот пульт

git push origin master
Сравья
источник
7

Починил, не совсем уверен, что сделал. Я пробовал просто толкать и тянуть, используя:

git pull <remote> dev вместо того git pull <remote> master:dev

Надеюсь, это поможет кому-то, если у них такая же проблема.

делос
источник
6

Вам необходимо ввести:

$ git pull
$ git fetch 
$ git merge

Если вы воспользуетесь a git push origin master --force, у вас возникнут большие проблемы.

Гаойеуа
источник
5
Почему вам нужно использовать git fetchи git mergeснова вручную после запуска, git pullкоторый их содержит ?
Melebius
6

Вы можете попробовать это: git pull origin master --rebase

Эдуардо Рамос
источник
2
Привет, Эдуардо! Это сработало для меня. Но можете ли вы объяснить, почему это работает? Что именно делает эта команда?
Акшая Натараджан,
5

Я сделал следующие шаги. наконец он работает нормально.

Шаги

1) git init

2) git status (для проверки статуса)

3) git add. (добавить все файлы изменений (.))

4) git commit -m "<pass your comment>"

5) git удаленное добавление источника "<pass your project clone url>"

6) GIT PULL --allow-несвязанные-истории "<pass your project clone url>"мастер

7) git push -u "<pass your project clone url>"master

Прабхат
источник
4

На самом деле github намного проще, чем мы думаем, и это происходит всякий раз, когда мы пытаемся нажать, даже после того, как мы явно вставили некоторые файлы в наш репозиторий git, поэтому, чтобы решить проблему, просто попробуйте ..

: git pull

а потом..

: git push

Примечание: если вы случайно застряли в редакторе vim после извлечения репозитория, не волнуйтесь, просто закройте редактор vim и попробуйте нажать :)

d337
источник
2

У меня была эта ошибка, потому что на сервере было обновление, но SourceTree не показывал никаких доступных обновлений (возможно, потому, что я был в автономном режиме, когда он последний раз проверял). Итак, я обновил дерево исходных текстов, и теперь оно показывает 2 элемента для отправки вместо 1 элемента.

Поэтому обязательно нажмите « Обновить» или « Вытяните», если вы получите эту ошибку, а затем повторите попытку.

1,21 гигаватт
источник
1

git pull --rebase origin master

git push origin master


git push -f origin master

Предупреждение git push -f origin master

  • принудительно нажимает на существующий репозиторий, а также удаляет предыдущие репозитории, поэтому, если вам не нужны предыдущие версии, это может быть полезно
Бхавеш Чанд
источник
1

Ошибка, возможно, возникает из-за разной структуры кода, который вы фиксируете и который представлен на GitHub. Вы можете обратиться к: Как бороться с ошибкой « отказ от объединения несвязанных историй »:

$ git pull --allow-unrelated-histories
$ git push -f origin master
Курош Неестани
источник
1

Самый лучший вариант для меня и работает и просто

git pull --rebase

затем

git push

удачи

Омар Абусабха
источник
1

Вот как я решил эту проблему:

  1. git pull origin master
  2. git push origin master

Обычно это происходит, когда ваша удаленная ветка не обновляется. И после этого, если вы получите сообщение об ошибке типа «Пожалуйста, введите сообщение о фиксации», обратитесь к этому (Для меня ответ xiaohu Wang сработал :))

СаломиЭдвард
источник
0

Сначала у меня был проект SSDT VS. Я хотел продвинуть проект, как я, на Github. Я хотел, чтобы этот толчок стал начальной версией моего репо, запускающей основную ветку. Предложение Донала о git push -f origin master было самым простым способом (который я видел) для этого. Поскольку мне не приходилось беспокоиться о том, чтобы что-то переписывать, это казалось логичным.

Cromastro
источник
0

У меня такая же проблема. Так получилось, что я создал файл .Readme в репозитории, не вытаскивая его предварительно.

Вы можете удалить файл .Readme или вытащить его, прежде чем нажимать.

Мартин Опута
источник
Я не уверен, что этот ответ на вопрос 5-летней давности дает дополнительную ценность, плюс он не дает решения конкретной проблемы OP. Поскольку вы новый участник, ознакомьтесь с руководством по ответам на вопросы: stackoverflow.com/help/how-to-answer
Сотирис Кукиос-Панопулос,
0

ты можешь использовать

git pull --rebase <your_reponame> <your_branch>

это поможет в случае, если некоторые изменения еще не зарегистрированы в вашем локальном репо. особенноREADME.md

дерзкий
источник
0

У меня была такая же проблема, и я исправил ее, запустив: git push -f origin master

АБДЕССАМАД ФЕЛУАХ
источник