如何用远程覆盖本地历史记录?

How to overwrite local history with remote?

最近由于几次错误的提交,我不得不压缩提交。简单地做 git pull --rebase origin master 对我有用,但我的队友已经在旧历史之上合并了新历史。所以我想知道是否可以覆盖本地历史记录?

假设分支 remoteNewlocalOldlocalNew 中有三个时间线有一个小时前的提交。

以下有效并用新历史完全覆盖旧历史。不过这里需要注意的是,oldHistory 在创建 newHistory 之后没有新的提交。

git checkout localOld
git pull --rebase origin remoteNew

以下内容不符合我的要求。它不会覆盖本地历史记录,而是创建有冲突的合并。

git checkout localNew
git pull --rebase origin remoteNew

我相信这是因为本地有新的提交。虽然我真正想要的是 git push --force 之类的结果,但是为了拉动。另一种方法是用新分支替换 master 分支并重命名。还有其他覆盖本地历史记录的选项吗?

注意:我想澄清一下,这是旧存储库,但团队尚未对其进行处理,我们正处于采用 git 的初始阶段,并在整个团队开始处理之前完成工作流。

要用远程历史覆盖本地历史,将删除所有文件,其中只有在本地历史上。所以要小心!

git fetch --all
git reset --hard <remote>/<branch-name>

因此,使用 git fetch 您可以下载最新的远​​程历史记录。使用 git reset,您将分支重置为您刚刚获取的内容。

有关更多信息,请查看此类似问题:How do I force "git pull" to overwrite local files?

git pull --rebase ... 将 运行 对您在远程分支之上的工作进行变基;变基很可能会引发冲突,如果你想继续,你需要修复它们。

只要 rebase 没有完成,localBranch 仍会指向你未修改的分支,你可以检查 localBranchorigin/remoteBranch 的历史记录,看看有什么变化登陆远程,并可能与您的本地更改发生冲突:

git log --graph --oneline localBranch origin/remoteBranch

如果您想在远程分支之上完成对本地工作的变基:

  • 检查并修复冲突文件中的冲突,
  • 运行 git rebase --continue 继续

如果你想取消rebase:

  • 运行 git rebase --abort

无论如何,远程分支现已更新。

如果您取消了 rebase,您可以随时从您的 localBranch 重新运行 git rebase origin/remoteBranch