如何在Git中丢弃本地提交?


262

我一直在研究某些东西,并在完成其中一部分后决定完全拧紧它。所以我尝试了以下顺序:

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

这时我收到消息

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

我想放弃本地提交,而不必清除本地目录并重新下载所有内容。我该怎么做?


6
无需同时执行这两个操作,git fetch并且git pull-pull是获取和合并的组合。
以太2010年

12
给用户的提示:该问题的主要问题与消息“您的分支在N提交之前位于'起源/主'之前”无关。。由于该消息,请停止关闭其他问题作为该问题的副本。

Answers:


579
git reset --hard origin/master

将删除所有未提交在origin/master这里origin是回购的名字和master是分支的名称。


1
我认为语法“ origin / master”(带有斜杠)是指本地存储库吗?
Daniel C. Sobral

9
mipadi:更正确地说,它将重置当前分支以指向与origin / master相同的提交。
ChristofferHammarström,2010年

它指的是一个分支。origin/master是跟踪远程仓库的master分支的分支origin
mipadi 2010年

@ DanielC.Sobral否,origin/master是对master名为的远程分支的引用origin
马修

1
@littletiger git不跟踪文件夹,仅跟踪文件及其路径。因此,它将完全忽略空文件夹(没有文件的文件夹,或仅忽略文件的文件夹)。它们没有出现在任何地方,因为里面什么也没有。
Mumbleskates

33

顺便说一句,除了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

4
但是,如何区分本地提交和原始提交呢?实际上,它告诉我Cannot delete the branch 'master' which you are currently on.
Daniel C. Sobral

1.基本上,所有提交都是相同的,无论它们是本地提交还是来自原始提交。重要的是,历史记录必须正确同步。您的本地提交仅在您推送它们之后才存在于源中,并且默认情况下,如果源中的历史记录可能以无意义的状态结束,则git将拒绝该推送。
slebetman 2010年

2
2.当然,您不能删除当前已签出的分支。要删除母版,请先签出另一个分支。如果没有其他分支,则只需创建一个临时分支即可:git checkout -b temp;git branch -D master;git checkout master;git branch -D temp
slebetman 2010年

还要注意我所说的关于远程仓库的本地副本的不同:​​git不允许您编辑甚至查看远程分支副本中的文件。它仅允许您从远程分支创建另一个分支,然后可以查看和编辑。按照惯例,此本地分支与远程分支具有相同的名称。您部分正确的origin/master是在本地计算机上。那是远程分支的本地(完整)副本。真正的远程分支是origin master
slebetman 2010年

这对我有用。但是也许git branch -D master没有必要,因为如前所述,它会产生错误。
Alexis Wilke 2014年

15

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

git reset --hard HEAD^

这是最好的答案,确实有效。丢弃所有本地提交并重置为HEAD。^ char有什么用?
karim

@karim'^'可能是正则表达式的东西,可能很深,我很久以前在手册文件中都不了解或阅读。.对不起,男人:)
giang nguyen

1
较晚,但是^代表父提交,因此重置为HEAD^丢弃未提交的更改并将分支移至上一个提交,从而有效地“删除”最近的提交(尽管该提交仍然存在,但分支并未指向它)。答案将只有一个本地提交,其余都是未提交的更改。@karim @giang
QuantumQuaver

3

你需要跑步

git fetch

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


5
提取与请求者的主要问题无关,后者摆脱了本地提交。

1
如果我已经在本地提交了文件,然后尝试触发上述命令,该怎么办。它将显示相同的错误消息。我也尝试过git fetch和git fetch -p。但显示相同的错误
Morez

1

我见过一些实例,其中遥控器变得不同步,需要更新。如果reset --hard还是branch -D失败,请尝试

git pull origin
git reset --hard 

这没有回答问题,reset --hard在这种情况下有效
CharlesB 2013年

1
嗨,查尔斯,您是对的,reset --hard应该在这里工作。但是,我只是指出,它有时无法正确重置分支,并且git pull origin将重新同步遥控器并允许reset --hard正常运行。
Jim Clouse

0

我必须做一个:

git checkout -b master

正如git所说的,它不存在,因为它已经被

git -D master
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.