2011-04-14 161 views
10

我有一个远程git存储库和本地工作。每当我在本地做任何更改时,我都会将它们推到遥控器上。然后,我有时会在远程文件上执行“git commit”以将更改存储在远程文件中。为什么我得到“错误:无法推送一些裁判”?

我根本不直接编辑远程存储库。我只是承诺修改。而且我是一名开发人员,没有其他人在回购。

为什么我得到一个错误,据我所知,这意味着我必须先拉?

我不想拉,因为远程回购文件已过时,它会失去我的本地更改。这真的很烦人,为什么会这样呢?我怎样才能解决而不必拉或重新创建存储库? (你可以看到,这有点像一个颠覆式的这里版本控制风格)

编辑 - 错误:

To ssh://... 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to 'ssh://...' 
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. 
+0

你是什么意思你在远程仓库上做一个“git commit”?远程存储库是否是裸回购?你通常应该只是推销一个裸回购,但你不能承诺一个裸回购,所以我有点困惑你想要做什么。你能展示一个你正在运行的实际命令的例子和你得到的实际输出吗? – 2011-04-14 20:34:47

+0

好吧,我对这部分有点怀疑,这就是为什么我提及它。回购是用'git init'创建的。我在远程存储库上做了一个提交,因为我没有看到那个存储库中的更改。我添加了代码来显示错误 – Spyros 2011-04-14 20:37:18

回答

11

什么,你应该做的是创建远程存储库作为纯仓库。一个裸仓库就是git repo,没有当前的结帐(就是说,它就像是普通Git仓库中.git目录的内容,所以它包含对象和裁判,但它没有索引或工作文件层次结构的副本)。如果尝试推送到非裸存储库,工作副本将与提交的内容不同步,并导致您在此处看到的各种问题。

您可以使用git init --bare repo.git创建裸存储库。或者,您可以使用git clone --bare original-repo new-repo.git将现有存储库复制为裸回购。

如果您想要在服务器上检出存储库的副本,则需要在服务器上创建一个新的非裸回购,然后从您推入的裸回购库中取回该回购。

+0

因此,如果我理解正确,这个想法就是裸仓库就像一个索引,它具有表示已保存数据的内部方式,然后您只需克隆工作(或备份)副本。 – Spyros 2011-04-14 20:50:54

+0

+1你应该推到裸git存储库。 – 2011-04-14 20:52:17

+1

@SpyrosP基本上。裸仓库仅存储历史记录,分支和标签,但没有任何一种特定版本的工作副本,这是正常回购的方式。你可以克隆一个裸回购来创建一个正常的回购有一个工作副本,你做你的工作。 – 2011-04-14 20:53:44

6

这总是意味着你没有同步与本地回购远程仓库,所以首先你应该用命令的git拉他们同步如下:

git checkout master  
git pull origin master 

这个过程后,你将它们同步,然后您可以通过以下方式将更改推送到远程回购:

git add [filename/directory] 
git commit -m"input your message" 
git remote add origin https://github.com//yourname.git  
git push origin master 
5

这是另一种选择。

git reset --mixed origin/master 
git add . 
git commit -m "Your message" 
git push origin master 
0

我面临类似的问题,并且下面的命令奏效。 git push --set-upstream origin master

相关问题