我已经设置了一个远程非裸“主”仓库并将其克隆到我的电脑上。我做了一些本地更改,更新了我的本地存储库,并将更改推送回我的远程仓库。到目前为止,情况还不错。
现在,我不得不改变远程仓库中的东西。然后我在当地的回购中改变了一些东西。我意识到不需要改变远程仓库。所以我尝试从我当地的仓库git push
到我的远程仓库,但我得到一个错误,如:
为防止您丢失历史记录,拒绝非快进更新在再次推送之前合并远程更改。有关详细信息,请参阅
git push --help
的“关于快进的注释”部分。
我以为那可能是一个
git push --force
将强制我的本地副本将更改推送到远程副本并使其相同。它确实强制更新,但当我回到远程仓库并进行提交时,我注意到文件包含过时的更改(主远程仓库以前有过)。
正如我在comments to one of the answers中提到的那样:
[我]尝试强制,但当回到主服务器保存更改时,我得到过时的暂存。因此,当我提交存储库时不一样。当我再次尝试使用git push时,我得到了同样的错误。
我该如何解决这个问题?
做就是了:
git push origin <your_branch_name> --force
或者如果您有特定的回购:
git push https://git.... --force
这将删除您之前的提交并推送您当前的提交。
它可能不合适,但如果有人偶然发现这个页面,他们认为他们可能想要一个简单的解决方案......
另请注意,-f
是--force
的缩写,所以
git push origin <your_branch_name> -f
也会工作。
如果push --force
不起作用,你可以做push --delete
。看看这个实例的第二行:
git reset --hard HEAD~3 # reset current branch to 3 commits ago
git push origin master --delete # do a very very bad bad thing
git push origin master # regular push
但要注意......
换一种说法:
force
推动公共存储库。pull
。reset
或rewrite
的历史。当然,即使是这个规则也有极少数例外情况,但在大多数情况下,它不需要这样做,它会给其他人带来问题。
并且要小心你推动公共回购。回复:
git revert -n HEAD~3..HEAD # prepare a new commit reverting last 3 commits
git commit -m "sorry - revert last 3 commits because I was not careful"
git push origin master # regular push
实际上,两个原始HEAD(来自还原和邪恶重置)都将包含相同的文件。
push --force
push --force
可能带来的另一个问题是,在你做之前有人推动任何事情,但是在你已经取得了进展之后。如果您现在推动您的重新定版版本,您将替换其他人的工作。
git push --force-with-lease
在git 1.8.5中引入(thanks to @VonC对该问题的评论)试图解决这一具体问题。基本上,如果自最近一次获取后远程被修改,它将带来错误并且不会推送。
如果您确定需要push --force
,但仍希望防止出现更多问题,这是很好的。我会说它应该是默认的push --force
行为。但它仍然远没有成为迫使push
的借口。在你的变形之前取得的人仍然会有很多麻烦,如果你回来的话可以很容易地避免。
因为我们正在谈论git --push
实例......
@linquize在评论中提出了一个很好的推力例子:敏感数据。你错误地泄露了不应该推送的数据。如果你足够快,你可以通过强制推顶来“修复”*
。
*
data will still be on the remote,除非你也做garbage collect,或clean it somehow。其他已经取得它的人也有明显的潜力传播,但你明白了。
首先,我不会直接在“主”回购中进行任何更改。如果你真的想要一个“主要”回购,那么你应该只推动它,永远不要直接改变它。
关于你得到的错误,你有没有从当地的回购尝试git pull
,然后git push
到主要的回购?你目前正在做什么(如果我理解得好)是强迫推动然后在“主”回购中失去你的变化。您应该首先在本地合并更改。
如果我在我的本地分支A上,并且我想强制将本地分支B推送到原始分支C,我可以使用以下语法:
git push --force origin B:C
我真的建议:
.git
基地同步的问题。见“How to push a local git repository to another computer?”换句话说,保持可以从主服务器和本地计算机访问裸存储库,以便从/向其提取/拉出单个上游存储库。
使用以下命令:
git push -f origin master
这是我们在维护历史记录时替换公司gitHub存储库上的master的解决方案。
push -f
掌握企业存储库经常被禁用以维护分支历史。这个解决方案对我们有用。
git fetch desiredOrigin
git checkout -b master desiredOrigin/master // get origin master
git checkout currentBranch // move to target branch
git merge -s ours master // merge using ours over master
// vim will open for the commit message
git checkout master // move to master
git merge currentBranch // merge resolved changes into master
推动你的分支到desiredOrigin
并创建一个公关
我有同样的问题,但终于弄明白了。您最可能需要做的是运行以下两个git命令(用git commit修订号替换hash):
git checkout <hash>
git push -f HEAD:master