GitHub-错误:在我修改了一个推送的提交后,未能将一些refs推送到dev-reo



我是git的新手,我想我犯了一个错误,我想知道我是否还能修复它。我有三个分支,分别是main(远程回购(、development(远程回购。我正在处理branchA,我在其中添加了两个提交,并使用以下代码将其推送到远程repo:git push origin branchA

但我注意到我使用了一个错误的github帐户进行了这两次提交。我使用以下代码更改了最近提交的作者:git commit --amend --author="username <email@email.com>"

然后我做了git rebase -i commithash,以便能够在最近提交之前在提交时编辑作者。设置为"编辑"后,我再次运行此命令:git commit --amend --author="username <email@email.com>"

之后,我更改了代码上的一些内容,并在branchA中再次提交。然后我用git push origin branchA把它推到我的远程回购中,现在我得到了这个错误:

To github.com:somename/githubrepo.git
! [rejected]        branchA -> branchA (non-fast-forward)        
error: failed to push some refs to 'github.com:somename/githubrepo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

我知道,如果你修改提交的哈希,它会改变。但我不明白为什么错误消息说我的本地分支A在远程分支A之后,而根据我的理解,我的本地分枝A在远程分枝A之前。我能修一下吗?不确定使用git推力是否安全。请帮忙。非常感谢。

我知道,如果你修改了提交的哈希,它就会改变。

这是关闭,但不够精确。

但我不明白为什么错误消息说我的本地分支A在远程分支A之后,而根据我的理解,我的本地分枝A在远程分枝A之前。

git commit --amend所做的是将最终提交从分支的末尾踢出,并在其位置添加新的提交。也就是说,如果分支过去看起来像这样:

...--F--G--H   <-- branchA (HEAD), origin/branchA

(其中每个字母代表某个散列ID;这里最近的提交是散列H(,然后在git commit --amend之后有:

          H   <-- origin/branchA
         /
...--F--G
         
          I   <-- branchA (HEAD)

现在,您比origin/branchA领先一个提交(在另一个Git存储库中称为branchA,存储在您称为CCD11的机器上(,比origin/branchA落后一个提交。你的承诺;在"后面";是您故意从branchA的末尾丢弃的,以便添加替代提交来代替的提交H

提交H没有消失或更改。它仍然在那里,和以前一模一样。您有一个新的改进的提交I,希望使用而不是提交H

我能解决这个问题吗?

也许吧。

不确定进行git强制是否安全。

如果你想让另一个Git存储库丢弃他们的副本(共享(提交H,则需要某种强制。无论是";"安全";取决于谁可能也有CCD_ 19的副本。

完全安全的方法是避免使用git commit --amend。也就是说,我们没有添加替换提交I,而是添加新的交付I——或者现在是J——将其添加到历史中,而不是作为替代:

             I   ??? [abandoned]
            /
...--F--G--H   <-- origin/branchA
            
             J   <-- branchA (HEAD)

您现在可以git pushJ提交到origin,因为添加了CCD_25,即使它撤消并替换了提交H的错误。H继续存在的历史也继续存在于origin上。由于Giteverywhere是为了添加新的提交而构建的,所以每个人都知道如何处理这一问题。

Git可以(勉强地(说服放弃提交,这就是强制推送的一般意义:他们有一些提交,我们认为是糟糕的,我们希望他们完全放弃这些提交,也许没有替换,也许用我们新的和改进的提交作为替换。但是,由于提交在Git之间病毒传播,到目前为止,您可能不得不强制从两个、三个或一千个存储库中删除错误的提交。

如果你非常确定只有一个,或者其他两个或999或任何存储库的所有者都知道如何处理";提交H是坏的,让我们放弃它",强制推送是可以的。考虑使用--force-with-lease,它可以让你验证你只删除提交H,而不是其他人添加的一些额外提交,依赖并使用提交H(换句话说,他们可能已经创建了提交JK(。

相关内容

最新更新