我读过关于这个主题的类似帖子,但我不知道如何正确地做到这一点。

我签入了大约1000个我不想要的文件,我宁愿不需要逐个检查并将它们全部从回购中删除。

我有一个远程主分支。 我有本地主分支。

他们都在同一个修订。

我想回滚我的远程1提交。

我的历史是A- B- C- D- E。 我想回滚我的本地到D。 然后把它推到远程,所以我的当前哈希将是D远程和本地。

我做这个有问题。 我正在使用Git Tower,但对命令行很熟悉。任何帮助吗?

更新: 下面的评论很棒。使用重置似乎在一定程度上是不鼓励的,特别是当存储库与其他用户共享时。 在不使用硬重置的情况下撤销之前提交的更改的最佳方法是什么?有办法吗?


当前回答

如果你只想在不破坏本地存储库的情况下从远程存储库中删除最后一次提交,这里有一行代码:

git push origin +origin/master~:master

使用以下语法:

git push <remote> <refspec>

这里,<remote>是origin, <refspec>有以下结构:

+origin/master~:master

详见git-push(1)。前面的+表示“force push this ref”,另一部分表示“from origin/master~ to master (from remote origin)”。不难知道origin/master~是origin/master之前的最后一次提交,对吗?

其他回答

通过输入以下命令,你可以看到你的git提交历史-

$ git 日志

假设你在这个分支上的历史是- commit_A, commit_B, commit_C, commit_D。其中,commit_D是最后一次提交,这是HEAD保留的位置。现在,要从本地和远程删除上次提交,您需要执行以下操作:

步骤1:通过-删除上一次本地提交

$ git重置-硬头~

这将把您的提交HEAD更改为commit_C

步骤2:将新HEAD提交的更改推送到远程

$ git 推送原点 +头

该命令将从远程删除最后一次提交。

附注:此命令在Mac OSX上进行了测试,应该也可以在其他操作系统上运行(但不声明其他操作系统)

如果你想还原上次提交,请听:

步骤1:

检查带有消息的本地提交

$ git log

步骤2:

在不重置本地分支(或主分支)更改的情况下删除最后一次提交

$ git reset HEAD^

或者如果你不想最后提交文件和更新监听

$ git reset HEAD^ --hard

步骤3:

我们可以更新文件和代码,再次需要推动与力量,它将删除以前的提交。它将保持新的提交。

$ git push origin branch -f

就是这样!

这是更安全的更新版本。

git reset --hard HEAD^ 
git push --force-with-lease

Git push -f将不加区别地用您自己的更改替换远程存储库。如果是其他人推动了变革,他们就会迷失。Git push——force-with-lease只会在存储库符合你的预期时才会推送你的rebase。如果别人已经推动了你的努力,你的努力就会失败。

见-被认为有害的力量;理解git的-force-with-lease。

我建议将其别名为repush = push—force-with-lease。

如果已经有人收回了呢?那我该怎么办?

告诉他们git pull -rebase=merges。不是git fetch origin和git merge origin/master,而是git fetch origin和git rebase -r origin/master。这将在新的重基origin/master之上重写它们的任何本地更改为master。-r将保留它们所做的任何合并。

我建议将此设置为拖动的默认行为。它是安全的,将处理其他的重基,并导致较少不必要的合并。

[pull]
        rebase = merges

我只是想从远程和清除提交历史中删除最后一次提交。 下面的方法非常有效

git reset --hard HEAD^ 
git push -f 

在本地主机上

git reflog
-- this will list all last commit
  e.g Head@{0} -- wrong push
      Head@{1} -- correct push  
git checkout Head@{1} .
  -- this will reset your last modified files

git status 
git commit -m "reverted to last best"
git push origin/master

没必要担心别人拉不拉。

完成了!