git: оновлення було відхилено, оскільки пульт містить роботу, яку ви не маєте локально


113

Я працюю над командою з кількома розробниками, які використовують 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відділення.

Відповіді:


42

git pull <remote> master:devотримає remote/masterгілку і злиє її у вашу local/devгілку.

git pull <remote> devотримає remote/devгілку та об'єднає її у вашу поточну гілку.

Думаю, ви сказали, що конфліктне завдання відбувається remote/dev, так що це галузь, яку ви, ймовірно, мали намір отримати та об'єднати.

У такому випадку ви насправді не злили конфлікт у вашому місцевому відділенні, що начебто дивно, оскільки ви сказали, що бачили неправильний код у своїй робочій копії. Ви можете перевірити, що відбувається remote/master.


1
Нічого ... Я цього ніколи не знав. Але це має багато сенсу зараз. Власна гілка також була неправильною, тому ваша відповідь очищає моє ціле запитання. Я все ще трохи нова. Дуже дякую, що розповіли мені про різницю між цими двома!
delos

6
Найкращий варіант для мене був git pull --rebase.
derekmx271

152

Використовуйте цю команду в терміналі

git push -f походження майстер


49
Використовувати прапор силового натискання (-f) дуже небезпечно, і він ніколи не повинен бути частиною вашого регулярного робочого потоку
Spaideri

5
Зрозуміло, оскільки мені не вистачає попередження у цій відповіді.
Мелебій

2
О-о! Це змушує сховище переписати себе.
Азарса

3
У мене була така ж помилка з github, і я виправив її за допомогою цієї команди, @theeastcoastwest, чому ти кажеш, що це небезпечно? яка ваша причина »,
симон

3
@simon це небезпечно, оскільки він ігнорує роботу, яка знаходиться у віддаленому режимі, і змушує ваші зміни перейти на репо. Тож якщо ви не хочете плутати роботу своєї команди, НЕ змушуйте натискати.
Гастен

42

Це трапляється, коли ми намагаємось перейти до віддаленого сховища, але створили новий файл на віддаленому, який ще не витягнуто, скажімо Readme. У такому випадку, як говорить помилка

git відхиляє оновлення

тому що ми не брали оновлений віддалений у нашому локальному середовищі. Тож візьміть спочатку з дистанційного

git pull

Він оновить ваше локальне сховище та додасть новий Readmeфайл. Потім натисніть оновлені зміни на віддалене

git push origin master

Я працював git pull origin developу своїй місцевій галузі розвитку, але зараз, просто git pullце мені добре працює, я не знаю чому.
Алекс

тому що за замовчуванням, якщо ваша локальна філія синхронізована з віддаленою гілкою, і ви зареєстровані в цій гілці, вам не потрібно вказувати гілку просто git pullдостатньо
Himanshu

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
Мелебій


4

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

: git pull

і потім..

: git push

Примітка: якщо ви випадково застрягли в редакторі vim після витягування сховища, не хвилюйтеся, просто закрийте редактор vim і спробуйте натиснути :)


4

Я зробив нижче кроки. нарешті це добре працює.

Кроки

1) git init

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

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

4) git počin -m "<pass your comment>"

5) git remote add origin "<pass your project clone url>"

6) git pull - "<pass your project clone url>"майстер -неспоріднений майстер історії

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


2

У мене була ця помилка, і це було тому, що на сервері було оновлення, але SourceTree не показував жодних оновлень (можливо, тому, що я був в автономному режимі, коли він востаннє перевірявся). Тож я зробив оновлення у вихідному дереві, і тепер воно показує 2 елементи для натискання замість 1 елемента.

Тому не забудьте натиснути оновити або потягнути, якщо ви отримаєте цю помилку, а потім спробуйте ще раз.


1

git pull - майстер походження бази

git push master master


git push -f походження майстер

Попереджувальний майстер походження push -f

  • насильно натискає на наявний сховище, а також видаляє попередні сховища, тому якщо вам не потрібні попередні версії, це може бути корисним



1

Ось як я вирішив це питання:

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

Зазвичай це відбувається, коли ваш віддалений відділення не оновлюється. І після цього, якщо ви отримаєте помилку типу "Будь ласка, введіть повідомлення про фіксацію", зверніться до цього (для мене відповідь xiaohu Wang працювала :))


0

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


0

У мене була така ж проблема. Сталося, що я створив файл .Readme у сховищі, не витягуючи його спочатку.

Ви можете видалити файл .Readme або витягнути його перед натисканням.


Я не впевнений, що ця відповідь на 5-річне запитання надає будь-яку додаткову цінність, плюс це не дає вирішення конкретної проблеми ОП. Оскільки ви новий вкладник, будь ласка , зверніть увагу на керівництво про те , як відповідати на питання: stackoverflow.com/help/how-to-answer
Sotiris Koukios-Panopoulos

0

ви можете використовувати

git pull --rebase <your_reponame> <your_branch>

це допоможе у випадку, якщо у вас місцеві репортажі ще не зареєстровані. особливоREADME.md

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.