强制更新之后的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?