我已经设置了一个远程非裸"主"仓库并将其克隆到我的电脑上.我做了一些本地更改,更新了我的本地存储库,并将更改推送回我的远程仓库.到目前为止,情况还不错.
现在,我不得不改变远程仓库中的东西.然后我在当地的回购中改变了一些东西.我意识到不需要改变远程仓库.所以我尝试git push
从我的本地仓库到我的远程仓库,但我收到的错误如下:
为防止您丢失历史记录,拒绝非快进更新在再次推送之前合并远程更改.有关
git push --help
详细信息,请参阅"关于快进的注意事项"部分.
我以为那可能是一个
git push --force
Run Code Online (Sandbox Code Playgroud)
将强制我的本地副本将更改推送到远程副本并使其相同.它确实强制更新,但当我回到远程仓库并进行提交时,我注意到文件包含过时的更改(主远程仓库以前有过).
[我]尝试强制,但当回到主服务器保存更改时,我得到过时的暂存.因此,当我提交存储库时不一样.当我再次尝试使用git push时,我得到了同样的错误.
我该如何解决这个问题?
如何将"普通"Git存储库转换为裸存储库?
主要区别似乎是:
在普通的git存储库中,您.git
在存储库中有一个包含所有相关数据的文件夹,而所有其他文件都构建了您的工作副本
在一个简单的Git存储库中,没有工作副本,文件夹(让我们称之为repo.git
)包含实际的存储库数据
git version-control git-clone git-bare git-non-bare-repository
我通常通过ssh(screen和vim)在远程服务器上工作,我有一个Git存储库.有时我不上网,所以我的笔记本电脑上有一个单独的存储库(从我的遥控器克隆).
但是,我无法从远程端的这个存储库中取出,因为我通常在防火墙后面,或者我没有公共IP.
我已经读过,我应该只是推到一个裸存储库.我应该如何将更改推送到远程存储库?
我有一个Git存储库.我克隆了存储库,可以提交我的本地更改.当我将更改推送到服务器时,它可以工作.
一旦我创建了一个分支,我就会检查分支,提交我的工作,然后检查主分支.然后我将我的本地更改合并到主分支中.当我尝试推送到服务器时,我得到以下异常:
Welcome to Git (version 1.7.11-preview20120620)
Run 'git help git' to display the help index.
Run 'git help <command>' to display help for specific commands.
$ git push origin master:master
Counting objects: 9, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (8/8), 13.68 KiB, done.
Total 8 (delta 2), reused 1 (delta 0)
Unpacking objects: 100% (8/8), done.
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, …
Run Code Online (Sandbox Code Playgroud) 我已经创建了一个存储库.我可以把它做成裸露的类型,还是我可以重新开始?
我需要使用复杂的存储库配置。我有五个:
因此,我的理解是这样的:
现在,我在机器3上进行了一些更改,并将这些更改推送到机器4。这是我需要遵循的说明:
我在第4步中遇到问题。出现以下错误:
fatal: 'machine3/test-branch' is not a commit and a branch 'test-branch' cannot be created from it
Run Code Online (Sandbox Code Playgroud)
添加
当我执行
git rev-parse machine3/test-branch
Run Code Online (Sandbox Code Playgroud)
在笔记本电脑(机器2)上,我得到:
machine3/test-branch
fatal: ambiguous argument 'machine3/test-branch': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, …
Run Code Online (Sandbox Code Playgroud) 我对我创建的场景很困惑.我在Github上创建了一个存储库(让我们称之为A)并将代码推送到它.之后,我将该存储库克隆到我的本地(让我们称之为B),这样我本地的来源就是远程回购A.
现在我从我的本地B克隆来创建另一个本地实例C.现在我有远程起源的C作为repo B而C的上游是A.
A ? B ? C
Run Code Online (Sandbox Code Playgroud)
这类似于分叉,但在这里我在客户端而不是服务器端创建了克隆.
现在,如果我尝试使用从C到其原点B的推送:
git push origin
Run Code Online (Sandbox Code Playgroud)
然后我收到一个错误,指出我无法推送到非裸存储库.我知道推送到非裸存储库可能会导致本地远程不存在的提交丢失.
但是,这种情况与我将代码从B推送到A的情况类似吗?
我很困惑,如果B到A是可能的,那么为什么C到B.
为了合并到A,我们可以推送到上游:
git push upstream
Run Code Online (Sandbox Code Playgroud) 我的设置如下:
我在Mac上运行git版本2.3.2(Apple Git-55)。这有一个非裸露的git仓库,位于~/xyz
。
然后,我在同一台Mac上使用VMWare Fusion运行Windows 7 64bit。VM具有git 1.9.5,这是Windows的最新git版本。从VM中,我可以克隆并从Mac的非裸仓库中拉出~/xyz
OK,但是我不能将其推入。我遵循了这里的建议并继续使用receive.denycurrentbranch=ignore
,~/xyz
但仍然给我相同的错误消息:
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 …
Run Code Online (Sandbox Code Playgroud) 我使用以下命令设置了一个新的Git存储库:
mkdir plans-for-world-domination
cd plans-for-world-domination
git init
echo "MWA HA HA HA HA!" > plans.txt
git add .
git commit -m "Beginning my plans..."
Run Code Online (Sandbox Code Playgroud)
然后我复制了这个存储库,进行了一些更改,提交了它们,然后尝试推送:
cd ..
git clone plans-for-world-domination clone
cd clone
echo "Step 1: set up super secret spy base in Cleveland, Ohio" >> plans.txt
git commit -am "Update plans"
git push origin master
Run Code Online (Sandbox Code Playgroud)
当我cd
回到plans-for-world-domination
存储库时,staging-area/index中有一些更改与我刚刚推送的更改相反:
$ cd ../plans-for-world-domination
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD …
Run Code Online (Sandbox Code Playgroud)