Git push відхилено "не вперед"


90

Я досить недавно gitвикористовую його для управління нашим кодом у командному середовищі. У мене були проблеми з перебазуванням, і я їх виправляв за допомогою

git checkout --ours filename.txt
git add filename.txt
git rebase --continue

Тепер я хочу натиснути на мої зміни і, таким чином, виконати наступну команду

$ git push origin feature/my_feature_branch

видає мені таку помилку:

To ssh://git@coderepo.com:7999/repo/myproject.git
 ! [rejected]        feature/my_feature_branch -> feature/my_feature_branch (non-fast-forward)
error: failed to push some refs to 'ssh://git@coderepo.com:7999/repo/myproject.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Що я можу зробити, щоб позбутися помилки?

PS: Я уникаю використовувати цю --forceопцію якомога більше.


Відповіді:


76

Схоже, хтось просунув нові коміти між вашими останніми git fetchта git push. У цьому випадку вам потрібно повторити кроки та my_feature_branchще раз перебазувати дані .

git fetch
git rebase feature/my_feature_branch
git push origin feature/my_feature_branch

Після git fetchрекомендую вивчити ситуацію з gitk --all.


Що робити, щоб увімкнути git pull origin master: master, який за замовчуванням повинен об’єднуватися. Це конфлікт злиття чи ні. Це єдине питання, яке задається.
mathtick

24

Можливо, ви не отримували віддалених змін перед перебазуванням або хтось проштовхував нові зміни (поки ви перебазували і намагалися натиснути). Спробуйте виконати такі дії:

#fetching remote 'feature/my_feature_branch' branch to the 'tmp' local branch 
git fetch origin feature/my_feature_branch:tmp

#rebasing on local 'tmp' branch
git rebase tmp

#pushing local changes to the remote
git push origin HEAD:feature/my_feature_branch

#removing temporary created 'tmp' branch
git branch -D tmp

Це вирішує мою проблему: коли я зафіксував свій код, я зробив перебазу (занадто пізно, вже були зміни, це слід зробити перед комітом). Тоді навіть конфлікту не було, я не міг наполягати. Після застосування вище магії, це спрацювало. Дякую.
Jing Li

19

У мене була ця проблема! Я спробував: git fetch + git merge, але не вирішено! Я спробував: git pull, і також не вирішив

Потім я спробував це і вирішив свою проблему (подібно до відповіді Інженера):

git fetch origin master:tmp
git rebase tmp
git push origin HEAD:master
git branch -D tmp

7
Це мене заплутало, я штовхнув речі безпосередньо до майстра і штовхнув розгортання цілий день ... і всі злі .... ДИВНІ ПОРАДИ!
Mike Q

6
Можливо, хочеться пояснити, що ви робите, узагальнено, перш ніж дати комусь небезпечний інструмент.
Мірв - Метт,

10

У мене була подібна проблема, і я вирішив її за допомогою: git pull origin


1
Допоміг мені, коли під час витягування віддаленої гілки я отримав відповідну помилку.
GChuf

7

Я запізнююсь на вечірку, але я знайшов корисні вказівки на сторінці довідки github, і я хотів поділитися ними тут.

Іноді Git не може внести зміни до віддаленого сховища, не втрачаючи комітів. Коли це трапляється, ваш поштовх відмовляється.

Якщо інша людина натиснула ту саму гілку, що і ви, Git не зможе просувати ваші зміни:

$ git push origin master
To https://github.com/USERNAME/REPOSITORY.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/USERNAME/REPOSITORY.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 fetch origin
# Fetches updates made to an online repository
$ git merge origin YOUR_BRANCH_NAME
# Merges updates made online with your local work

Або ви можете просто використовувати git pullдля виконання обох команд одночасно:

$ git pull origin YOUR_BRANCH_NAME
# Grabs online updates and merges them with your local work

4

спробуйте цю команду

$ git push -f -u origin <name of branch>

тобто $ git push -f -u origin master


Це спрацювало для моєї справи, коли інші ні. Іноді потрібно просто сказати git -f -u
gcr

1

Запишіть блокування у спільному локальному сховищі

У мене була ця проблема, і жодна з наведених вище порад мені не допомогла. Я зміг все правильно дістати. Але натиснути завжди не вдалося. Це було локальне сховище, розташоване в каталозі Windows, де кілька клієнтів працювали з ним через драйвер спільних папок VMWare. Виявилося, що одна із систем заблокувала сховище Git для запису. Після зупинки відповідної системи VMWare, яка спричинила блокування, все негайно відремонтували. Зрозуміти, яка система спричиняє помилку, було майже неможливо, тому мені довелося зупиняти їх по черзі, поки не вдалося.


1

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

 git branch --set-upstream-to=origin/feature/my-current-branch feature/my-current-branch

0

У Eclipse виконайте наступне:

GIT Repositories> Remotes> Origin> Клацніть правою кнопкою миші та скажіть отримати

Репозиторії GIT> Віддалене відстеження> Виберіть свою гілку та скажіть злиття

Перейдіть до проекту, клацніть правою кнопкою миші на вашому файлі та скажіть "Витягнути" з потоку.


0
  1. перемістити код у нову гілку - git branch -b tmp_branchyouwantmergedin
  2. перейдіть до гілки, до якої ви хочете об'єднатися - git checkout mycoolbranch
  3. скинути гілку, до якої ви хочете об'єднатися - скидання гілки git - жорстку ГОЛОВУ
  4. об'єднати гілку tmp у потрібну гілку - гітка git об'єднати tmp_branchyouwantmergedin
  5. підштовхнути до початку


-1
  1. Скасувати локальний коміт. Це просто скасує коміт і збереже зміни в робочій копії
git reset --soft HEAD~1
  1. Витягніть останні зміни
git pull
  1. Тепер ви можете зафіксувати свої зміни поверх останнього коду
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.