我如何将修改的提交推送到远程Git存储库?

当我用我的源代码工作了一下,我做了平常的事情提交,然后我推送到远程存储库。 但后来我注意到我忘了在源代码中组织我的导入。 所以我执行修改命令来替换之前的提交:

> git commit --amend

不幸的是,提交不能被推回到存储库。 它被拒绝像这样:

> git push origin
To //my.remote.repo.com/stuff.git/
 ! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to '//my.remote.repo.com/stuff.git/'

我该怎么办? (我可以访问远程存储库。)


实际上我曾经用--force.git存储库推--force ,被Linus BIG TIME骂了一顿。 一般来说,这会给其他人造成很多问题。 一个简单的答案是“不要这样做”。

无论如何,我看到别人给出了这样做的秘诀,所以我在这里不再重复。 但是,在使用--force(或+ master)推出修订后的提交后,可以从这种情况中恢复。

  • 找到您修改的旧提交(称之为old ,并且我们将通过修改new调用您创建的新提交)。
  • 创建之间的合并oldnew ,记录的树new ,喜欢git checkout new && git merge -s ours old
  • git merge master到你的git merge master
  • git push . HEAD:master更新你的主结果git push . HEAD:master git push . HEAD:master
  • 推出结果。
  • 那么谁是不幸的人已经根据他们的工作承诺你通过修改和强制推送(这是你是一个非常非常坏小子 )将看到的合并结果会看到你青睐抹杀newold 。 他们后来合并将不会看到之间的矛盾oldnew起因于您的修正,所以他们没有受到影响。


    您正在看到Git安全功能。 Git拒绝用你的分支来更新远程分支,因为你的分支的头部提交并不是你正在推送的分支的当前头提交的直接后代。

    如果情况并非如此,那么两个同时推送到同一个存储库的人不会知道同时发布了一个新的提交,并且最后推送的任何人都将失去之前推送者的工作,而没有他们意识到这一点。

    如果你知道你是唯一的推送人员,并且你想推送一个修改的提交或推送一个提交分支的提交,你可以'强制'Git使用-f开关更新远程分支。

    git push -f origin master
    

    即使这可能不起作用,因为Git允许远程存储库通过使用配置变量receive.denynonfastforwards来拒绝远端的非快速推送。 如果是这种情况,拒绝原因将如下所示(请注意“远程拒绝”部分):

     ! [remote rejected] master -> master (non-fast forward)
    

    为了解决这个问题,你需要改变远程仓库的配置,或者作为一个肮脏的黑客,你可以删除并重新创建分支:

    git push origin :master
    git push origin master
    

    通常, git push的最后一个参数使用格式<local_ref>:<remote_ref> ,其中local_ref是本地资源库上分支的名称, remote_ref是远程资源库上分支的名称。 该命令对使用两个短手。 :master有一个null local_ref,这意味着将一个空分支推送到远程master端,即删除远端分支。 带no的分支名称:表示将具有给定名称的本地分支推送到具有相同名称的远程分支。 master在这种情况下是master:master


    快速咆哮:事实上,没有人在这里发布简单的答案,这表明了Git CLI所展示的令人绝望的用户敌意。

    无论如何,假设你还没有试图强行推行,那么“明显”做到这一点的方法就是先拉。 这会拉动您修改的变更(因此不再有变更),以便您再次拥有它。

    一旦你解决了任何冲突,你可以再次推送。

    所以:

    git pull
    

    如果你在拉取错误,也许你的本地存储库配置有问题(我在.git / config分支部分有一个错误的参考)。

    之后

    git push
    

    也许你会得到一个额外的承诺,告诉关于“Trivial merge”的主题。

    链接地址: http://www.djcxy.com/p/1345.html

    上一篇: How do I push amended commit to the remote Git repository?

    下一篇: How to use ant exec task to invoke curl and POST a message to rest api