我已经设置了一个远程非裸“主”仓库并将其克隆到我的电脑上 . 我做了一些本地更改,更新了我的本地存储库,并将更改推送回我的远程仓库 . 到目前为止,情况还不错 .
现在,我不得不改变远程仓库中的东西 . 然后我在当地的回购中改变了一些东西 . 我意识到不需要改变远程仓库 . 所以我尝试从我的本地仓库 git push
到我的远程仓库,但我得到一个错误,如:
为防止您丢失历史记录,拒绝非快进更新在再次推送之前合并远程更改 . 有关详细信息,请参阅git push --help的“关于快进的注意事项”部分 .
我以为那可能是一个
git push --force
将强制我的本地副本将更改推送到远程副本并使其相同 . It does force the update ,但是当我回到远程仓库并进行提交时,我注意到这些文件包含过时的更改(主远程仓库以前有过) .
正如我在_662591中提到的那样:
[我]尝试强制,但当回到主服务器保存更改时,我得到过时的暂存 . 因此,当我提交存储库时不一样 . 当我再次尝试使用git push时,我得到了同样的错误 .
我该如何解决这个问题?
7 回答
做就是了:
或者如果你有一个特定的回购:
这将删除您之前的提交并推送您当前的提交 .
它可能不合适,但如果有人偶然发现这个页面,他们认为他们可能想要一个简单的解决方案......
短旗
另请注意
-f
是--force
的缩写,所以也会工作 .
如果
push --force
不起作用,你可以做 push --delete . 看看这个实例的第二行:但要注意......
永远不要回到公共git历史!
换一种说法:
不要
force
推送公共存储库 .唐't do this or anything that can break someone' s
pull
.在某人可能已经撤回的回购中,不要
reset
或rewrite
历史记录 .当然,即使是这个规则,也有极少数例外情况,但在大多数情况下,它不需要这样做,它会给其他人带来问题 .
做一个还原 .
并且 always be careful with what you push to a public repo . 回复:
实际上, both 原始HEAD(来自 revert 和来自 evil reset )将包含相同的文件 .
编辑以添加更新信息和更多关于push -force的参数
考虑用租赁而不是推力推力,但仍然更喜欢还原
可能带来的另一个问题是,当有人在你做之前推动任何事情,但是在你已经 grab 之后 . 如果您现在推动您的重新定版版本,您将 replace work from others .
在git 1.8.5中引入
git push --force-with-lease
(thanks to @VonC对该问题的评论)试图解决这一具体问题 . 基本上,如果自最近一次获取后遥控器被修改,它将带来错误并且不会推送 .如果您确定需要
push --force
,但仍希望防止出现更多问题,这很好 . 我会说它应该是默认的push --force
行为 . 但它仍然远没有成为强迫push
的借口 . 在你的变形之前取得的人仍然会有很多麻烦,如果你还原了就可以轻易避免 .因为我们正在谈论
git --push
个实例......为什么有人想强迫推?
@linquize在评论中提出了一个很好的推力例子: sensitive data . 你_662621被推了 . 如果你足够快,你可以通过强制推顶而来.662622_
*
它 .*
data will still be on the remote除非你也做garbage collect或clean it somehow . 其他已经取得它的人也有明显的潜力传播,但你明白了 .首先,我不会直接在“主”回购中进行任何更改 . 如果你真的想要一个“主”回购,那么你应该只推动它,永远不要直接改变它 .
关于你得到的错误,你有没有尝试从当地的仓库
git pull
,然后git push
到主回购?你目前正在做的事情(如果我理解得很好)是强迫推动,然后在"main"回购中失去你的变化 . 您应该首先在本地合并更改 .如果我在我的本地分支A上,并且我想强制将本地分支B推送到原始分支C,我可以使用以下语法:
我真的建议:
只推送到主回购
确保主仓库是bare repo,以便主仓库工作树与其
.git
库不同步时永远不会有任何问题 . 见“How to push a local git repository to another computer?”如果你必须在main(裸)repo中进行修改,克隆它(在主服务器上),进行修改并推回到它
换句话说,保持从主服务器和本地计算机都可访问裸存储库,以便从/向上拉/拉一个上游存储库 .
这是我们在企业gitHub上替换master的解决方案仓库,同时保持历史 .
通常禁用
push -f
来掌握企业存储库以维护分支历史记录 . 这个解决方案对我们有用 .将您的分支推送到
desiredOrigin
并创建PR使用以下命令: