0

几个提交已被推送到源分支。这些提交包含导致问题的代码。为了解决问题,我git reset --hard <sha>在问题开始之前对提交做了一个。

我已经解决了这个问题并在本地提交。现在我想推送到 Origin 但我不能,因为我的分支在 Origin 之后 5 次提交(导致问题)并且在 1 次提交(修复提交)之前。IE。分歧的分支。

我不想合并来自 Origin 的任何更改。如何将 Origin 的头部设置为我的本地提交的头部,并且不将中断提交合并到我的本地分支中?

谢谢!

4

2 回答 2

6

干净的方式(保留历史)

  1. 在您当前的提交中创建一个本地错误修复分支
  2. 结帐主机(或任何来源)并将其快进到损坏的远程 HEAD
  3. git revert错误的提交(在你分叉的最后一个好sha和远程 HEAD 之间的所有内容)......这会删除不需要的更改,同时保留所有历史记录
  4. 将您的错误修复分支合并到 master:现在所有 master 的更改都已恢复,这将是一个简单的合并

肮脏的方式(丢弃历史记录,扰乱在远程分支上工作的任何其他人)

  1. 只需使用git push -f(仔细检查您是否有正确的选项和 refspec)并希望没有其他人在他们下面更改了他们的远程分支历史记录
于 2012-10-25T16:43:36.707 回答
2

如果您不想丢弃其他人在这些错误提交中所做的事情,即保持历史记录仍然存在,而只是拒绝那里发生的更改,您可以使用ours合并策略:

git merge -s ours badbranch

这实质上创建了一个合并提交,它只从当前分支中获取所有更改。它将完全忽略发生的事情,badbranch但仍会将其纳入历史。因此,您可以查看那里发生的更改,但它们不会影响您当前的版本。

否则,如果您只想完全丢弃它们,并且您可以完全控制存储库并且不关心从存储库中提取的其他人,则可以覆盖分支,基本上从存储库中删除这些提交(除非您有另一个分支指向它)。您可以通过强制推送来做到这一点:

git push origin master -f

请注意,这将为在存储库上工作的其他可能已经获取这些更改的其他人造成冲突,所以不要这样做,除非您真的意识到这一点。通常首选将错误提交保留在历史记录中。

于 2012-10-25T16:46:05.983 回答