我在远程存储库中有一个项目,与本地存储库(开发)和服务器存储库(prod)同步。我一直在做一些已经推送到远程和从服务器上拉出来的承诺更改。现在,我想撤销这些更改。因此,我可以在更改之前签出到提交,并提交新更改,但我猜再次将它们推到远程会有问题。我该怎么做,有什么建议吗?


当前回答

一种不保留“撤销”痕迹的解决方案。

注意:如果有人已经抽取了您的更改,则不要这样做 (我只会在个人回购时使用这个方法。)

run:

git reset <previous label or sha1>

这将在本地重新签出所有更新(因此git状态将列出所有更新的文件)

然后你“做你的工作”并重新提交你的更改(注意:这一步是可选的)

git commit -am "blabla"

此时,您的本地树与远程树不同

git push -f <remote-name> <branch-name>

将强制远程分支接受此推送并删除前一个推送(指定remote-name和branch-name不是强制的,但建议避免更新带有update标志的所有分支)。

!! 注意一些标签可能仍然指向删除提交!!how-to-delete-a-remote-tag

其他回答

你可以这样做

git push origin +<short_commit_sha>^:<branch_name>

简单方法:

git reset <commit_hash>

(您希望保留的最后一个提交的哈希值)。

您将在本地保留当前未提交的更改。

如果你想再推一次,你必须做到:

git push -f

干净利落地做:

git rebase -i <hash of last good commit, 9 chars is enough>

现在,您将得到一个从上一次提交到HEAD的提交列表,以及对每个提交做什么的选项。DROP将丢弃该提交。保存文件。

现在修复上游做:

git push --force-with-lease

(使用租赁,这样你就不会意外地给其他人带来问题)

通过删除错误的提交,而不是引入新的提交来修复先前的错误提交,从而保持日志干净。

假设61234是您希望保持的最后一个良好提交的sha-number。

git reset --hard 61234
git push -f

将完全删除所有错误的提交,没有任何痕迹。

注意:如果你想推送(你重置的提交)到一个特定的分支,你可以使用git push -f origin branch-name来代替。

如果你按照下面给出的步骤通过Git命令行,你可以将Git本地和远程提交还原(或者你也可以称之为DELETE)。

运行以下命令查看要还原的提交id

git log --oneline --decorate --graph

你会得到如下截图

如果你也检查远程(通过Web接口),那么你可以看到这将是相同的如下所示

根据截图,目前你的提交id是e110322,但你想在本地和远程都恢复到030bbf6。

执行以下步骤删除/恢复本地+远程提交


首先本地恢复提交id 030bbf6

git reset --hard 030bbf6

紧随其后的是

git clean -f -d

这两个命令强制重置以提交阶段030bbf6,如下图所示

现在如果你跑了 git状态,然后你会看到你在远程分支中是TWO Commits BEHIND,如下所示

运行以下命令更新索引(如果有更新的话)。建议您要求所有开发人员不要接受主远程分支上的任何拉请求。

git fetch --all

一旦你完成了它,然后你需要在分支前面使用+符号强制推送这个提交,如下所示。我这里用的是主分支,你可以替换成任何分支

代码

git push -u origin +master

现在如果你看到远程的web界面,那么提交也应该被还原。