强制更新后Git拉

时间:2012-03-21 22:30:46

标签: git git-pull

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

现在其他软件工程师有不同的历史记录,当他们执行git pull时,Git会合并。有没有办法解决这个问题,除了做rm my-repo; git clone git@example.org:my-repo.git

我需要与git push --force相反的内容,但git pull --force没有给出预期的结果。

3 个答案:

答案 0 :(得分:413)

接收新提交

git fetch

重置

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

更改本地分支的提交:

git reset origin/master --hard

但请注意,正如文档所述:

  

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

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

<强>衍合

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

git rebase -i origin/master

这将在交互模式下调用rebase,您可以在其中选择如何应用不在您重新定位的历史记录中的每个单独提交。

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

使用帮助git command --help获取有关上述(或其他)任何命令的更多详细信息和示例。

答案 1 :(得分:15)

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

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

注意:您可以通过放入&amp;&amp;和他们之间

注2:Florian在评论中提到了这一点,但在寻找答案时谁会阅读评论?

注意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

现在,feature-new是你的分支,没有额外的(可能是糟糕的)提交!

答案 2 :(得分:14)

带变基拉动

常规提取是提取+合并,但您想要的是提取+变基。这是pull命令的一个选项:

git pull --rebase