强制更新之后的Git拉

我只是用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

请注意,正如文档所述:

重置索引和工作树。 放弃自<commit>以来对工作树中跟踪文件所做的任何更改。

如果你想实际保留你在本地所做的任何修改,请改为使用--soft重置。 这将更新分支的提交历史记录,但不会更改工作目录中的任何文件(然后您可以提交它们)。

变基

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

git rebase -i origin/master

这将在交互模式下调用rebase,您可以选择如何应用每个单独提交,而这些提交并非位于您要重新设置的历史记录中。

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

使用help git command --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:如果您的分支受到污染,您可以根据新的“哑分支”创建新分支,然后挑选承诺。

例如:

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

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

链接地址: http://www.djcxy.com/p/4281.html

上一篇: Git pull after forced update

下一篇: How do I force git pull to overwrite everything on every pull?