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

Это решает мою проблему: когда я зафиксировал свой код, я выполнил перебазирование (слишком поздно, изменения уже были, следует сделать это до фиксации). Тогда даже конфликта не было, я не мог толкнуть. После применения вышеуказанной магии это сработало. Спасибо.
Цзин Ли

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

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

 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 branch reset --hard HEAD
  4. объединить ветку tmp с нужной веткой - git branch merge 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.