Git Ошибка нажатия: отказ обновить отмеченную ветку

Я решил некоторые конфликты слияния, затем попытался нажать Мои изменения и получил следующую ошибку:

c:\Program Files (x86)\Git\bin\git.exe push --recurse-submodules=check "origin" master:master
Done
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To C:/Development/GIT_Repo/Project
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'C:/Development/GIT_Repo/Project'

Кто-нибудь знает, что может вызвать эту ошибку?

Ответ 1

Существует два типа репозиториев: голый и не голый

У Bare-хранилищ нет рабочей копии, и вы можете нажать на них. Таковы типы репозиториев, которые вы получаете в Github! Если вы хотите создать голый репозиторий, вы можете использовать

git init --bare

Итак, короче говоря, вы не можете нажать на не-голый репозиторий (Edit: ну, вы не можете нажать на текущую отмеченную ветку репозиторий. С открытым репозиторием вы можете нажать на любую ветку, поскольку ни один из них не был извлечен. Хотя возможно, переключение на не-голые репозитории не является обычным явлением). Что вы можете сделать, это извлечь и слить из другого репозитория. Вот как работает pull request, который вы можете видеть в работе Github. Вы просите их отталкиваться от вас, и вы не нажимаете на них.


Обновление. Благодаря VonC, указав это, в последних версиях git (в настоящее время 2.3.0), нажатие на отмеченную ветку из не-голых репозиториев возможно. Тем не менее, вы все равно не можете нажать на грязное рабочее дерево, что в любом случае не является безопасной.

Ответ 2

Я решил эту проблему, сначала проверив, что этот пульт не получил ничего (он действительно не должен был), а затем сделал его голым с помощью

$ git config --bool core.bare true

После этого git push работал нормально.

Ответ 3

Резюме

Вы не можете нажать на одну отмеченную ветку репозитория, потому что она будет конфликтовать с пользователем этого репозитория таким образом, который, скорее всего, закончится потерей данных и истории. Но вы можете нажать на любую другую ветку одного и того же репозитория.

Поскольку в открытых хранилищах ни один филиал не проверен, вы всегда можете нажать на любую ветвь открытого репозитория.

Вскрытие проблемы

Когда ветвь вычеркнута, фиксация добавит новую фиксацию с текущей ветвью ветки в качестве ее родителя и переместит ветвь ветки в новую фиксацию.

Итак,

A ← B
    ↑
[HEAD,branch1]

становится

A ← B ← C
        ↑
    [HEAD,branch1]

Но если кто-то может нажать на эту ветку между ними, пользователь получит себя в том, что git вызывает отключенный головной режим:

A ← B ← X
    ↑   ↑
[HEAD] [branch1]

Теперь пользователь больше не находится в ветке1, не запросив явно другую ветку. Хуже того, пользователь теперь вне любой ветки, и любая новая фиксация будет просто болтаться:

      [HEAD]
        ↓
        C
      ↙
A ← B ← X
        ↑
       [branch1]

Гипотетически, если на данный момент пользователь проверяет другую ветвь, то это оборванное коммитирование становится честной игрой для git сборщика мусора.

Ответ 4

cd в каталог repo/, который вы нажимаете на удаленную машину, и введите

$ git config core.bare true

Ответ 5

Как уже существует существующий репозиторий, запуск

git config --bool core.bare true

в удаленном репозитории должно быть достаточно

Из документации core.bare

Если true (bare = true), предполагается, что репозиторий будет голым без привязки рабочего каталога. Если это так, будет отключено несколько команд, требующих рабочий каталог, например git -add или git -merge (но вы сможете нажать на него).

Этот параметр автоматически угадывается git -clone или git -init, когда создается репозиторий. По умолчанию репозиторий, который заканчивается на "/.git", считается не голым (bare = false), а все остальные репозитории считаются голыми (bare = true).

Ответ 6

TL;DR

  • Потяните и нажмите еще раз: git pull &&& git push.
  • Еще проблема? Нажимайте в другую ветку: git push origin master:foo и объедините ее на удаленном репо.
  • В качестве альтернативы принудительно нажмите push, добавив -f (denyCurrentBranch необходимо игнорировать).

В основном ошибка означает, что ваш репозиторий не обновляется с удаленным кодом (его индекс и дерево работы несовместимы с тем, что вы нажали).

Обычно вам нужно pull сначала получить последние изменения и push снова.

Если это не поможет, попробуйте нажать в другую ветку, например:

git push origin master:foo

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

Если вы изменили некоторые прошлые намерения с помощью git rebase, и вы хотите переопределить репо с вашими изменениями, вы, вероятно, захотите принудительно нажать, добавив параметр -f/--force (не рекомендуется, если вы этого не сделали rebase). Если вы все еще не сработаете, вам нужно установить receive.denyCurrentBranch на ignore на пульте, как было предложено сообщением git с помощью:

git config receive.denyCurrentBranch ignore

Ответ 7

Для меня следующее трюк:

git config --global receive.denyCurrentBranch updateInstead

Я установил диск F:, почти полностью, чтобы синхронизировать между моим настольным компьютером Windows 10 и моим ноутбуком Windows 10, используя Git. Я закончил работу над указанной командой на обеих машинах.

Сначала я поделился файловым компьютером F в сети. Затем я смог клонировать его на своем ноутбуке, запустив:

F: git clone 'file://///DESKTOP-PC/f'

К сожалению, все файлы оказались под "F:\f \" на моем ноутбуке, а не под F:\напрямую. Но я смог вырезать и вставить их вручную. После этого Git по-прежнему работал с новым местоположением.

Затем я попытался внести некоторые изменения в файлы на ноутбуке, совершив их и вернув их на рабочий стол. Это не сработало, пока я не запустил команду Git config, упомянутую выше.

Обратите внимание, что я запускал все эти команды из Windows PowerShell на обеих машинах.

ОБНОВЛЕНИЕ: В некоторых случаях у меня все еще были проблемы с нажатием изменений. Я, наконец, только начал набирать изменения, выполнив на компьютере следующее: я хочу вытащить последние фиксации:

git pull --all --prune

Ответ 8

Возможно, ваше удаленное репо находится в ветке, которую вы хотите нажать. Вы можете попробовать проверить другую ветку на удаленном компьютере. Я сделал это, но эти ошибки исчезли, и я добился успеха в своем удаленном репо. Обратите внимание, что я использую ssh для подключения моего собственного сервера вместо github.com.

Ответ 9

У меня есть эта ошибка, потому что репо git было (случайно) инициализировано дважды в одном и том же месте: сначала в качестве не-голого репо и вскоре после него в качестве голого репо. Поскольку папка .git остается, git предполагает, что репозиторий не голый. Удаление папки .git и данных рабочего каталога решило проблему.