描述有点简洁。我只是在我的本地主分支上添加了一个文件并将其推回到远程仓库。知道为什么会这样吗?
warning: updating the current branch warning: Updating the currently checked out branch may cause confusion, warning: as the index and work tree do not reflect changes that are in HEAD. warning: As a result, you may see the changes you just pushed into it warning: reverted when you run 'git diff' over there, and you may want warning: to run 'git reset --hard' before starting to work to recover. warning: warning: You can set 'receive.denyCurrentBranch' configuration variable to warning: 'refuse' in the remote repository to forbid pushing into its warning: current branch. warning: To allow pushing into the current branch, you can set it to 'ignore'; warning: but this is not recommended unless you arranged to update its work warning: tree to match what you pushed in some other way. warning: warning: To squelch this message, you can set it to 'warn'. warning: warning: Note that the default will change in a future version of git warning: to refuse updating the current branch unless you have the warning: configuration variable set to either 'ignore' or 'warn'.
答案 0 :(得分:74)
如果没有人在那个远程非裸仓库中工作,那么应该可以推送到已检出的分支。
但是为了在这个操作中更加安全,你现在可以(使用Git 2.3.0,2015年2月)在那个远程仓库中做:
git config receive.denyCurrentBranch updateInstead
它比config receive.denyCurrentBranch=ignore
更安全:只有在你没有覆盖正在进行的修改时才会允许推送。
commit 1404bcb见Johannes Schindelin (dscho
):
添加其他选项
receive-pack
:为receive.denyCurrentBranch
在工作目录之间进行同步时,通过'
push
'更新当前分支可以很方便。而不是'pull
',例如从VM内部推送修复程序时,或推送用户计算机上的修复程序时(开发人员无权安装ssh守护程序,更不用说知道用户的密码)。此修补程序不再需要常见的解决方法 - 推入临时分支然后在另一台计算机上合并。
新选项是:
updateInstead
相应地更新工作树,但如果有任何未提交的更改,则拒绝这样做。
commit 4d7a5ce增加了更多测试,并提及:
<2>与Git&lt; 2.3.0,2015年2月前一个测试只测试push-to-deploy更新的路径在已经添加到索引中的目标工作树中发生了不兼容的更改但该功能本身需要的情况要求工作树比测试的更清洁。
添加一些更多测试以保护该功能免受未来的更改(错误地从该功能的发明者的角度来看)放松清洁度要求,即:
- 仅对工作树进行更改而不对索引进行更改仍然是要保护的更改;
- 需要保护工作树中未被跟踪的文件,该文件将被推送部署覆盖;
- 使文件与正在推送的文件相同的更改仍然是需要保护的更改(即,功能的清洁度要求比结帐更严格)。
另外,测试对工作树的仅限统计更改不是拒绝推送部署的理由。
最常见的方法是从非裸存储库创建一个裸存储库,并在新创建的裸存储库中同时具有远程/本地非裸git存储库点。
答案 1 :(得分:55)
实际上,它的含义与其说的完全相同:有人在您正在推送的存储库中工作,并且有人当前检查了您要推送的完全相同的分支。
这非常令人困惑,因为现在他认为他已经检查了最新版本的分支,事实上,你刚刚将分支更新为更新的版本。因此,当他现在运行git commit
时,他的提交将基本上恢复您刚刚推送的所有提交。当他跑git diff
时,即使他甚至没有改变任何东西,他也会看到与你所推动的一切相反的东西。
出于这个原因,推送到非裸存储库通常被认为是不好的做法;你应该只推送到裸存储库,即没有附加工作副本的存储库。至少你应该确保你没有推送到当前签出的分支,但通常你不应该只是把你的代码推送到别人的存储库,你应该让他们从你这里取消。
在某些特殊情况下,例如当您从Git存储库提供网站并希望通过推送更新网站时,实际上有必要推送到当前已检出的分支,但在这种情况下,必须确保您安装了实际更新已签出的工作副本的挂钩,否则您的网站将永远不会更新。
答案 2 :(得分:13)
这与This question的问题相同,解决方法是使用git init --bare
或git clone --bare
。