【问题标题】:How to discard local commits in Git?如何丢弃 Git 中的本地提交?
【发布时间】:2011-04-22 09:46:21
【问题描述】:

我一直在做某事,但在做了一些事情之后,我决定它完全被搞砸了。所以我尝试了以下顺序:

git reset --hard
git rebase origin
git fetch
git pull
git checkout

此时我收到了消息

Your branch is ahead of 'origin/master' by 2 commits.

我想放弃我的本地提交,而不必清除我的本地目录并重新下载所有内容。我怎样才能做到这一点?

【问题讨论】:

  • git fetchgit pull 没有必要同时做 -- pull 是 fetch 和 merge 的组合。
  • 用户注意:本题的主要问题与“Your branch is ahead of 'origin/master' by N commits.”消息无关。由于该消息,请停止关闭其他问题作为此问题的重复项。

标签: git git-reset


【解决方案1】:
git reset --hard origin/master

将删除所有不在origin/master 中的提交,其中origin 是repo 名称,master 是分支名称。

【讨论】:

  • 我认为带有斜线的语法“origin/master”指的是本地仓库?
  • mipadi:更准确地说,它将重置当前分支以指向与 origin/master 相同的提交。
  • 指一个分支。 origin/master 是一个跟踪origin 远程仓库的master 分支的分支。
  • @DanielC.Sobral 不,origin/master 是对名为 origin 的远程的 master 分支的引用。
  • @littletiger git 不跟踪文件夹,只跟踪文件及其路径。因此,它将完全忽略空文件夹(没有文件的文件夹,或只有被忽略的文件)。它们不会出现在任何地方,因为它们里面什么都没有。
【解决方案2】:

顺便说一句,除了 mipadi 的回答(顺便说一句应该可以),你应该知道这样做:

git branch -D master
git checkout master

在没有having to redownload everything 的情况下也可以完全按照您的意愿行事(您的报价已被转述)。那是因为您的本地仓库包含远程仓库的副本(并且该副本与您的本地目录不同,甚至与您签出的分支也不相同)。

清除一个分支是非常安全的,重建该分支的速度非常快,并且不涉及网络流量。请记住,git 在设计上主要是一个本地存储库。即使是远程分支在本地也有一个副本。只有一点元数据告诉 git 一个特定的本地副本实际上是一个远程分支。在 git 中,所有文件一直都在你的硬盘上。

如果你没有master以外的任何分支,你应该:

git checkout -b 'temp'
git branch -D master
git checkout master
git branch -D temp

【讨论】:

  • 但这如何区分本地提交和原始提交?事实上,它告诉我Cannot delete the branch 'master' which you are currently on.
  • 1.基本上所有提交都是相同的,无论它们是在本地还是在原点进行的。重要的是历史记录正确同步。您的本地提交只会在您推送它们后存在于原点,并且默认情况下,如果原点的历史记录可能最终处于没有意义的状态,git 将拒绝推送。
  • 2.当然你不能删除当前签出的分支。要删除 master,请先签出另一个分支。如果没有其他分支,只需创建一个临时分支:git checkout -b temp;git branch -D master;git checkout master;git branch -D temp
  • 还要注意我所说的关于远程仓库的本地副本不同的内容:git 不允许您编辑甚至查看远程分支副本中的文件。它只允许您从远程分支创建另一个分支,然后您可以查看和编辑。按照约定,此本地分支与远程分支具有相同的名称。您部分正确,因为origin/master 在您的本地计算机上。那是远程分支的本地(完整)副本。真正的远程分支是origin master
  • 这对我有用。也许git branch -D master 不是必需的,因为正如所指出的那样它会产生错误。
【解决方案3】:

我所做的是尝试努力重置为 HEAD。这将清除所有本地提交:

git reset --hard HEAD^

【讨论】:

  • 这是最好的答案,确实有效。丢弃所有本地提交并重置为 HEAD。 ^ 字符有什么用?
  • @karim '^' 可能是正则表达式的东西,这可能是很深的东西,我很久以前在手册文件中不知道或读过.. 对不起人 :)
  • 晚了,但^ 代表父提交,因此重置为HEAD^ 丢弃未提交的更改并将分支移动到上一个提交,有效地“删除”最近的提交(尽管提交仍然存在,分支只是没有指向它)。答案将只有一个本地提交,其余的是未提交的更改。 @karim @giang
  • 根据learngitbranching.js.org^ 运算符引用提交的父级。因此,如果要运行git checkout HEAD^^^,它将检查时间点 3 在 git 图上提交“高于”HEAD,如果你愿意的话。
【解决方案4】:

你需要运行

git fetch

获取所有更改,然后您将不会收到“您的分支在前面”的消息。

【讨论】:

  • 获取与提问者的主要问题无关,即摆脱本地提交。
  • 如果我已经在本地提交了文件然后尝试触发提到的命令怎么办。它将显示相同的错误消息。我也试过 git fetch 和 git fetch -p 。但显示相同的错误
【解决方案5】:

我看到了遥控器不同步并需要更新的情况。如果 reset --hardbranch -D 无法正常工作,请尝试

git pull origin
git reset --hard 

【讨论】:

  • 这不能回答问题,reset --hard 在这种情况下有效
  • 嗨,查尔斯,你说得对,reset --hard 应该在这里工作。但是,我只是指出它偶尔无法正确重置分支,git pull origin 将重新同步遥控器并允许reset --hard 正常运行。
【解决方案6】:

我必须做一个:

git checkout -b master

正如 git 所说的那样,它不存在,因为它已经被擦除了

git -D master

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 2015-12-14
    • 2018-05-16
    • 1970-01-01
    • 2017-04-22
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多