我已经解决了一些合并冲突,提交,然后尝试推送我的更改,并收到以下错误:
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'
有人知道是什么导致了这个错误吗?
总结
您不能推送到存储库的一个签出分支,因为这会扰乱该存储库的用户,很可能以丢失数据和历史记录而告终。但是您可以推送到同一存储库的任何其他分支。
由于裸存储库从来没有检出过任何分支,所以您总是可以推入裸存储库的任何分支。
问题的解剖
当一个分支签出时,提交将添加一个新的提交,当前分支的头作为其父,并移动该分支的头作为新提交。
So
A ← B
↑
[HEAD,branch1]
就变成了
A ← B ← C
↑
[HEAD,branch1]
但如果有人可以推送到中间的那个分支,用户就会进入git所说的分离头部模式:
A ← B ← X
↑ ↑
[HEAD] [branch1]
现在用户不再在branch1中,没有显式地要求签出另一个分支。更糟糕的是,用户现在在任何分支之外,任何新的提交都会悬空:
[HEAD]
↓
C
↙
A ← B ← X
↑
[branch1]
假设,如果此时用户签出了另一个分支,那么这个悬空提交将成为Git垃圾收集器的公平游戏。
TLDR
又拉又推:少不要脸的拉,少不要脸的推。
还是个问题吗?Push到不同的分支:git Push origin master:foo并在远程repo上合并它。
或者通过添加-f强制推送(denyCurrentBranch需要被忽略)。
基本上,这个错误意味着您的存储库与远程代码没有更新(它的索引和工作树与您推送的内容不一致)。
通常情况下,您应该首先拉取最近的更改,然后再推它。
如果没有帮助,尝试推到不同的分支,例如:
git push origin master:foo
然后将远程存储库上的这个分支合并回master。
如果你故意通过git rebase改变了一些过去的提交,并且你想用你的更改覆盖repo,你可能想通过添加-f/——force参数来强制推送(如果你没有做rebase,不建议使用)。如果仍然不起作用,你需要设置receive.denyCurrentBranch来忽略远程的git消息:
git config receive.denyCurrentBranch ignore
对我来说,以下几点很管用:
git config --global receive.denyCurrentBranch updateInstead
我设置了F:驱动器,几乎是整个驱动器,用Git在我的Windows 10台式机和Windows 10笔记本电脑之间同步。最后我在两台机器上都运行了上面的命令。
首先,我在网络上共享了桌面的F驱动器。然后我可以在我的笔记本电脑上运行:
F:
git clone 'file://///DESKTOP-PC/f'
不幸的是,所有的文件最终都在我笔记本电脑的“F:\ F”下,而不是直接在F:\下。但我可以手动剪切粘贴。之后Git仍然在新位置工作。
然后我尝试对笔记本电脑上的文件做一些更改,提交它们,并将它们推回到桌面上。直到我运行上面提到的git config命令,这才起作用。
注意,我在两台机器上的Windows PowerShell中运行了所有这些命令。
更新:在某些情况下,我仍然在推动更改方面遇到问题。我终于开始拉更改,通过在计算机上运行以下命令,我想拉最近的提交:
git pull --all --prune
正如在其他回答中提到的,您不能推到签出的分支。让我们从这里开始。
从远程服务器,让我们将远程存储库签入到一个临时分支。
git checkout -b temp
现在,我们可以从本地存储库推送到主分支。
git push
但这不是长久之计。未来的推动将带来同样的问题。为了一劳永逸地解决这个问题,您需要将远程存储库转换为裸存储库。从远程服务器输入:
git config core.bare true
现在你可以毫无问题地推到遥控器了。
以后,使用——bare选项创建远程存储库,如下所示:
git init --bare