当我使用了一点源代码后,我做了我通常的事情提交,然后推送到远程存储库。但后来我注意到我忘记在源代码中组织导入。因此,我执行modify命令以替换先前的commit:

> 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/'

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


当前回答

您可以通过以下操作以简单、安全的方式进行操作:

使用gitcommit修改您的上一次提交--修改和需要添加的任何选项git pull将本地回购与远程回购同步。拉动后,您将在本地和远程之间发生冲突。您只需接受当前更改并再次提交即可解决这些问题。数字推送

现在,本地和远程回购已更新,无需更改回购历史记录。

其他回答

我一直在做Git让我做的事。所以:

无法推送,因为修改了提交。我按照建议拉了一下。合并失败。所以我手动修复。创建新提交(标记为“merge”)并将其推送。它似乎起作用了!

注:修改后的承诺是最新的承诺。

在这种情况下,你应该——用力。

基于:

如果是单个项目,我会这样做:git推送原点<分支名称>-f

如果您正在与您的团队合作,或其他同行正在审查和使用您的代码,则不建议使用强制标志。主要是因为你总是想要一个干净的git历史。

我会怎么做?

如果有更多的人在同一个分支机构工作,或者其他人在审查你的代码,我会gitcommit--modify,然后gitpush-f。。。并让人们知道他们需要获取pull-rebase,以便能够看到您的更改。如果在审查PR或MR时发生类似的情况,请添加新的干净提交,并在结尾处清除历史。

下面是一个非常简单和干净的方法,在您已经进行了git添加“您的文件”和git提交后推送您的更改--修改:

git push origin master -f

or:

git push origin master --force

如果您知道没有人撤回您未修改的承诺,请使用gitpush的--forcewithlease选项。

在TortoiseGit中,您可以在“推送…”选项“强制:可能丢弃”和检查“已知更改”下执行相同的操作。

强制(可能放弃已知的更改)允许远程存储库接受更安全的非快进推送。这可能会导致远程存储库丢失提交;小心使用。这可以防止丢失来自远程用户的未知更改。它检查服务器分支是否指向与远程跟踪分支相同的提交(已知更改)。如果是,将执行强制推压。否则将被拒绝。由于git没有远程跟踪标记,因此无法使用此选项覆盖标记。

我通过放弃本地修改的提交并在顶部添加新的更改来解决这个问题:

# Rewind to commit before conflicting
git reset --soft HEAD~1

# Pull the remote version
git pull

# Add the new commit on top
git add ...
git commit
git push