首页 文章

如何正确强制推送Git?

提问于
浏览
1009

我已经设置了一个远程非裸“主”仓库并将其克隆到我的电脑上 . 我做了一些本地更改,更新了我的本地存储库,并将更改推送回我的远程仓库 . 到目前为止,情况还不错 .

现在,我不得不改变远程仓库中的东西 . 然后我在当地的回购中改变了一些东西 . 我意识到不需要改变远程仓库 . 所以我尝试从我的本地仓库 git push 到我的远程仓库,但我得到一个错误,如:

为防止您丢失历史记录,拒绝非快进更新在再次推送之前合并远程更改 . 有关详细信息,请参阅git push --help的“关于快进的注意事项”部分 .

我以为那可能是一个

git push --force

将强制我的本地副本将更改推送到远程副本并使其相同 . It does force the update ,但是当我回到远程仓库并进行提交时,我注意到这些文件包含过时的更改(主远程仓库以前有过) .

正如我在_662591中提到的那样:

[我]尝试强制,但当回到主服务器保存更改时,我得到过时的暂存 . 因此,当我提交存储库时不一样 . 当我再次尝试使用git push时,我得到了同样的错误 .

我该如何解决这个问题?

7 回答

  • 10

    做就是了:

    git push origin <your_branch_name> --force
    

    或者如果你有一个特定的回购:

    git push https://git.... --force
    

    这将删除您之前的提交并推送您当前的提交 .

    它可能不合适,但如果有人偶然发现这个页面,他们认为他们可能想要一个简单的解决方案......

    短旗

    另请注意 -f--force 的缩写,所以

    git push origin <your_branch_name> -f
    

    也会工作 .

  • 13

    如果 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
    

    但要注意......

    永远不要回到公共git历史!

    换一种说法:

    • 不要 force 推送公共存储库 .

    • 唐't do this or anything that can break someone' s pull .

    • 在某人可能已经撤回的回购中,不要 resetrewrite 历史记录 .

    当然,即使是这个规则,也有极少数例外情况,但在大多数情况下,它不需要这样做,它会给其他人带来问题 .

    做一个还原 .

    并且 always be careful with what you push to a public repo . 回复:

    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
    

    实际上, both 原始HEAD(来自 revert 和来自 evil reset )将包含相同的文件 .


    编辑以添加更新信息和更多关于push -force的参数

    考虑用租赁而不是推力推力,但仍然更喜欢还原

    可能带来的另一个问题是,当有人在你做之前推动任何事情,但是在你已经 grab 之后 . 如果您现在推动您的重新定版版本,您将 replace work from others .

    git 1.8.5中引入 git push --force-with-leasethanks to @VonC对该问题的评论)试图解决这一具体问题 . 基本上,如果自最近一次获取后遥控器被修改,它将带来错误并且不会推送 .

    如果您确定需要 push --force ,但仍希望防止出现更多问题,这很好 . 我会说它应该是默认的 push --force 行为 . 但它仍然远没有成为强迫 push 的借口 . 在你的变形之前取得的人仍然会有很多麻烦,如果你还原了就可以轻易避免 .

    因为我们正在谈论 git --push 个实例......

    为什么有人想强迫推?

    @linquize在评论中提出了一个很好的推力例子: sensitive data . 你_662621被推了 . 如果你足够快,你可以通过强制推顶而来.662622_ * 它 .

    * data will still be on the remote除非你也做garbage collectclean it somehow . 其他已经取得它的人也有明显的潜力传播,但你明白了 .

  • 1887

    首先,我不会直接在“主”回购中进行任何更改 . 如果你真的想要一个“主”回购,那么你应该只推动它,永远不要直接改变它 .

    关于你得到的错误,你有没有尝试从当地的仓库 git pull ,然后 git push 到主回购?你目前正在做的事情(如果我理解得很好)是强迫推动,然后在"main"回购中失去你的变化 . 您应该首先在本地合并更改 .

  • 209

    如果我在我的本地分支A上,并且我想强制将本地分支B推送到原始分支C,我可以使用以下语法:

    git push --force origin B:C
    
  • 17

    我真的建议:

    换句话说,保持从主服务器和本地计算机都可访问裸存储库,以便从/向上拉/拉一个上游存储库 .

  • 4

    这是我们在企业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 并创建PR

  • 5

    使用以下命令:

    git push -f origin master
    

相关问题