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.