当出现“您的分支和'origin/master'已分叉”时,我该如何丢弃本地git提交?

133

我在 Git 中有以下信息:

# Your branch and 'origin/master' have diverged,
# and have 3 and 8 different commits each, respectively.
#   (use "git pull" to merge the remote branch into yours)

我想要丢弃本地的三个提交,然后拉取远程的八个提交到 origin/master。
(合并会太困难,我宁愿在主分支更新后再重新进行三个本地提交。)
我该如何做到这一点?
6个回答

368
git fetch origin
git reset --hard origin/master

请注意,任何未推送的提交或本地更改都将丢失。

34
迄今为止我看到的最佳答案。对于任何正在使用此方法的人,需要注意的是,任何未推送的提交或本地更改都将丢失。 - DemitryT
6
你能执行 git reset origin/master 而不加上 --hard 吗?这样工作目录的更改就不会丢失。 - wisbucky
1
当我将非主分支rebase到最新的主分支时,我看到了类似的消息。在这种情况下,pull会做什么?我应该pull吗?我希望我的提交能够基于最新的更改。 - Rajeev Ranjan
太好了。这正是我想要的东西。 - Rajesh Chaudhary
这两个命令立即生效。唯一需要做的额外事情是,我需要从之前备份中恢复所做的更改。干杯! - Suresh
显示剩余4条评论

43
为了在需要的情况下保留旧的提交记录,您可以将其保存在一个临时分支上:

为了在需要的情况下保留旧的提交记录,您可以将其保存在一个临时分支上:

git branch temp

然后切换到新的主分支

git fetch origin
git reset --hard origin/master

那么在这种情况下,他会分支他的分支吗?例如,如果他正在使用“mydevbranch”,那么分支temp是否只是创建mydevbranch的新副本分支?从你的说法来看,这似乎是一项预防措施,以防万一需要它们,它们就在这个副本中。 - landed
2
是的,这是一项预防措施。它只是确保如果您将来需要这些提交,则不会丢失它们。 - jdramer
直觉上我认为在进行此操作之前需要提交本地代码 - 这就是问题所在,因为您不希望刚刚完成的工作被上传。我猜您会提交本地代码但不会推送 - 但最终它需要上传...这是不必要的,我想。分支用于变化或不同的功能,但需要从已提交的状态开始?或者也许这就是您的意思。也许我不需要担心提交 - 我只是认为分支会从已提交的源起点复制(丢失本地更改)。 - landed
@landed:是的,在创建temp分支后,您可以提交本地更改。如果您想恢复其中一些提交,稍后可以使用cherry-pick命令(请参阅git help cherry-pick)。 - Cris Luengo
1
谢谢,执行了 git reset hard 之后,merge temp 解决了我的问题。 - weiliang

10

尝试执行以下操作以撤销本地提交:

git reset --hard HEAD~4

4
作为合并的替代方案,您可以使用以下命令将特性分支变基到主分支:
git checkout feature
git rebase master

4
要撤销最近的本地提交,请使用以下命令:
git reset HEAD^

这将使头部回到提交之前的状态,这样你就可以从主分支git pull。在从远程存储库拉取之前,请确保将所有更改保存在其他位置(本地)。
要避免冲突并进行拉取,请使用git stash,然后git pull

4
如果硬重置无法解决问题,而你又不想进行拉取合并操作,你可以通过删除本地分支并重新下载源分支来丢弃本地不需要的更改:
git branch -D <local branch>
git checkout -b <branch name> origin/<branch name>

main 为例:

git branch -D main
git checkout -b main origin/main

2
如果本地分支与'origin/<branch>'不同步,它将不允许删除本地分支。 - Anirban

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接