强制更新后的git pull

我只是用git rebase压缩了一些提交,并且做了一个git push --force (这是我知道的恶魔)。

现在其他编码人员有不同的历史,当他们做一个git pull ,git会合并。 有没有什么办法可以解决这个问题,除了做一个rm my-repo; git clone git@example.org:my-repo.git rm my-repo; git clone git@example.org:my-repo.git

我需要像git push --force的相反的东西,但是git pull --force没有给出预期的结果。

接收新的提交

 git fetch 

重启

您可以使用git reset本地分支的提交。

要更改本地分支的提交:

 git reset origin/master --hard 

不过要小心,正如文档所说:

重置索引和工作树。 丢弃工作树中跟踪文件的所有更改。

如果你想实际上保留你在本地所做的任何修改,那就去做一个--soft复位吧。 它将更新分支的提交历史logging,但不更改工作目录中的任何文件(然后可以提交它们)。

变基

您可以使用git rebase在任何其他提交/分支之上重播您的本地提交

 git rebase -i origin/master 

这将会在交互模式下调用rebase,在这个模式中你可以select如何应用每个单独的提交,而这些提交并不在你正在重新devise的历史logging中。

如果您提交的提交(使用git push -f )已经被拖入本地历史logging,它们将被列为将会被重新应用的提交 – 它们需要作为rebase的一部分被删除,包括在分支机构的历史中 – 并在下一个推动中重新出现在远程历史logging中。

使用help git command --help获取更多关于上述(或其他)命令的细节和示例。

这不会修复已经拥有你不想要的代码的分支(参见下面的代码),但是如果它们已经拉到了一些分支,现在希望它是干净的(而不是“提前”起源/一些分支),那么你只需:

 git checkout some-branch # where some-branch can be replaced by any other branch git branch base-branch -D # where base-branch is the one with the squashed commits git checkout -b base-branch origin/base-branch # recreating branch with correct commits 

注意:你可以把这些全部放在它们之间

注2:弗洛里安在评论中提到了这个,但是在寻找答案时谁读了评论?

注3:如果您的分支受到污染,您可以根据新的“哑分支”创build新的分支,然后挑选承诺。

例如:

 git checkout feature-old # some branch with the extra commits git log # gives commits (write down the id of the ones you want) git checkout base-branch # after you have already cleaned your local copy of it as above git checkout -b feature-new # make a new branch for your feature git cherry-pick asdfasd # where asdfasd is one of the commit ids you want # repeat previous step for each commit id git branch feature-old -D # delete the old branch 

现在function新的是你的分支没有额外的(可能是坏的)提交!