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 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 и попробуйте нажать :)


2

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

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


1

git pull --rebase origin master

git push origin master


git push -f origin master

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

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



1

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

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

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


0

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


0

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

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


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

0

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

git pull --rebase <your_reponame> <your_branch>

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.