强制更新后的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新的是你的分支没有额外的(可能是坏的)提交!