多种删除本地Git更改的方法


625

我只是克隆了一个git存储库并签出了一个分支。我进行了处理,然后决定删除所有本地更改,因为我想要原始副本。

简而言之,我必须执行以下两个命令来删除本地更改

git checkout .

git clean -f

我的问题是

(1)这是摆脱局部变化的正确方法,还是请让我知道正确的方法。

(2)什么时候git reset --hard即使没有此命令我也可以重置

谢谢

*解决方案:主要修改:03/26:* 用git专有术语替换了许多模糊的术语[已跟踪/未跟踪/已分阶段/未分阶段]

当我们进行本地更改时,文件可能只有三类:

类型1.暂存的跟踪文件

类型2。未暂存的跟踪文件

类型3。未暂存的未跟踪文件又称为未跟踪的文件

  • 暂存-已移至暂存区/已添加至索引的暂存区
  • 跟踪-修改后的文件
  • 未跟踪-新文件。始终未登台。如果上演,则意味着它们已被跟踪。

每个命令的作用:

  1. git checkout . -仅删除未暂存的跟踪文件[类型2]

  2. git clean -f -仅删除未暂存的未跟踪文件[类型3]

  3. git reset --hard -仅删除暂存的已跟踪和未暂存的跟踪文件[类型1,类型2]

  4. git stash -u -删除所有更改[类型1,类型2,类型3]

结论:

很明显,我们可以使用

(1) combination of `git clean -f` and `git reset --hard` 

要么

(2) `git stash -u`

以达到预期的结果。

注意:藏匿,这个词的意思是“安全(秘密)在指定位置存储(某物)”。始终可以使用进行检索git stash pop。因此,在上述两个选项之间进行选择是开发人员的选择。

谢谢Christoph和FrederikSchøning。

编辑:03/27

我认为值得把“ 当心 ”笔记git clean -f

git clean -f

没有回头路了。使用-n--dry-run预览将要造成的损害。

如果还要删除目录,请运行 git clean -f -d

如果只想删除忽略的文件,请运行 git clean -f -X

如果要删除忽略的文件和非忽略的文件,请运行 git clean -f -x

参考:更多信息git clean如何从当前Git工作树中删除本地(未跟踪)文件?

编辑:15/20/15

丢弃此分支上的所有本地提交 [删除本地提交]

为了丢弃该分支上的所有本地提交,使该本地分支与该分支的“上游”相同,只需运行 git reset --hard @{u}

参考:http : //sethrobertson.github.io/GitFixUm/fixup.html

git reset --hard origin/master[如果当地分支机构是master]

注意:2015年6月12日不是另一个标记为重复的SO问题的重复。这个问题解决了如何删除本地GIT更改[删除添加的文件,删除添加到现有文件的更改等,以及各种方法;在另一个SO线程中,仅解决如何删除本地提交的位置。如果添加了文件,并且想单独删除该文件,则另一个SO线程不会对此进行讨论。因此,这不是另一个的副本]

编辑:06/23/15

如何还原已经推送到远程存储库的提交?

$ git revert ab12cd15

编辑:2015年9月1日

从本地分支和远程分支删除先前的提交

案例:您刚刚对本地分支进行了更改,并立即将其推送到远程分支,突然意识到,哦,不!我不需要这个改变。现在做什么?

git reset --hard HEAD~1 [用于从本地分支删除该提交]

git push origin HEAD --force[这两个命令都必须执行。用于从远程分支删除]

什么是分公司?它是当前签出的分支。

编辑09/08/2015-删除本地git merge

我在master分支机构中,并且合并master了一个新工作的分支机构phase2

$ git status
# On branch master

$ git merge phase2

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 8 commits.

问:如何摆脱这种合并?试过了git reset --hardgit clean -d -f 两者都没有用。

唯一有效的是以下任何一项:

$ git reset --hard origin/master

要么

$ git reset --hard HEAD~8

要么

$ git reset --hard 9a88396f51e2a068bb7 [sha提交代码-这是所有合并提交发生之前的代码]


1
我想这线程可能会回答你的问题:stackoverflow.com/questions/1146973/...
索西耶

1
“ git stash”将删除您所做的任何更改。
John Ballinger 2014年

1
不错的总结!我要添加另一个文件类别:“类型4.忽略的文件”。git stash -a[或--all]也将存储被忽略和未跟踪的文件。git clean -x也会清除忽略的文件。git clean -X将仅清除被忽略的文件。
Jerry101

2
@JavaDev您的问题更像是一个答案..感谢您不断编辑和编译所有答案。
Bhavuk Mathur's

1
谢谢,我执行了所有4条命令以撤消本地更改
Vincent Tang

Answers:


505

这完全取决于您要撤消/还原的内容。首先阅读宇部链接中的帖子。但是要尝试一个答案:

硬重置

git reset --hard [HEAD]

完全删除对跟踪文件的所有暂存和非暂存更改。

我发现自己经常使用硬重置,就像“就像撤消对遥控器的完全重新克隆操作一样,撤消所有操作”。在您的情况下,如果您只想回购原始数据,这将起作用。

清洁

git clean [-f]

删除未跟踪的文件。

用于删除临时文件,但保留对已跟踪文件的暂存和非暂存更改。在大多数情况下,我可能最终会制定一个忽略规则,而不是反复进行清理-例如,对于C#项目中的bin / obj文件夹,您通常希望将其从存储库中排除以节省空间,或者类似的事情。

-f(强制)选项还将删除那些未被跟踪也被git通过ignore-rule忽略的文件。在上述情况下,即使使用git忽略了忽略规则,它们也永远不会跟踪bin / obj文件夹,但使用force-option会将它们从文件系统中删除。我偶尔会看到这种用法,例如在编写脚本部署时,并且您想要在部署,压缩等之前清理代码。

Git clean不会触摸已经被跟踪的文件。

结帐“点”

git checkout .

在阅读您的文章之前,我实际上从未见过这种表示法。我很难为此找到文档(也许有人可以提供帮助),但是经过一番尝试,它看起来像是:

“撤消我的工作树中的所有更改”。

即撤消跟踪文件中的未暂存更改。显然,它不会碰到分阶段的更改,只会留下未跟踪的文件。

藏匿

一些答案提到隐藏。就像措辞所暗示的那样,当您处于某种中间状态(未准备提交)时,可能会使用隐藏,并且您必须临时切换分支或以某种方式在代码的另一状态下工作,然后返回到“混乱”状态。台”。我认为这不适用于您的问题,但是绝对方便。

总结一下

一般来说,如果你有信心,你犯了,也许推到了一个偏僻的重要变化,如果你只是玩弄或类似的,使用git reset --hard HEAD之后git clean -f会明确你的代码洁净的状态,这将是,如果它只是被克隆并从分支机构签出。需要特别强调的是,重置还将删除暂存但未提交的更改。它将清除所有尚未提交的内容(未跟踪的文件除外,在这种情况下,请使用clean)。

所有其他命令都可以帮助实现更复杂的方案,在这种情况下,需要“撤销内容”的粒度:)

我认为,您的问题#1已经涵盖了,但最后要总结一下#2:您从未发现需要使用git reset --hard它的原因是您从未上演过任何事情。如果您进行了更改,则不会git checkout .git clean -f不会还原该更改。

希望这能涵盖。


感谢您使用的原因git reset --hard。我试了一下,是的..添加到index(staging)的那些文件仅在之后才被删除git reset --hard,我默认情况下git reset --hardgit reset --hard head。此链接也很有帮助gitready.com/beginner/2009/01/18/the-staging-area.html
蜘蛛侠

我改善了答案,为什么我认为git stash -u在这里最有意义。
Christoph

2
谢谢你们俩 我已经总结了答案并嵌入了我的问题。克里斯托夫让我知道什么git stash -u不和怎么流行,但弗雷德里克让我知道复位硬盘并使用的组合git reset --hardgit clean -f,为什么不stash优先在某些情况下。现在,请帮助我选择我应将哪个标记为答案:),这都是我的答案。
蜘蛛侠2014年

3
.是引用当前工作目录的pathspec,它可能是存储库的根。从git-scm.com:git checkout [<tree-ish>] [--] <pathspec>…从索引文件或命名的<tree-ish>更新工作树中的命名路径。
Jerry101

3
从来没有足够强调,git reset --hardgit clean -dfx等都具有破坏性。无论如何,请修正head答案中的小写字母,它应该是大写字母HEAD或根本不存在。
PavelŠimerda2015年

25

目前添加答案的原因:

到目前为止,我在最初的问题本身中添加了结论和“答案”,使问题非常冗长,因此转向单独的答案。

我还添加了更常用的git命令,这些命令对git有帮助,也可以帮助其他人。

基本上是清除所有本地提交 $ git reset --hard$ git clean -d -f


第一步骤中,您做任何承诺之前是配置您的用户名和电子邮件出现与你一起提交。

#设置要附加到提交事务的名称

$ git config --global user.name "[name]"

#设置要提交到提交事务的电子邮件

$ git config --global user.email "[email address]"

#列出全局配置

$ git config --list

#列出远程URL

$ git remote show origin

#检查状态

git status

#列出所有本地和远程分支

git branch -a

#创建一个新的本地分支并开始在该分支上工作

git checkout -b "branchname" 

或者,可以分两个步骤完成

创建分支:git branch branchname 在此分支上工作:git checkout branchname

#提交本地更改 [两步过程:-将文件添加到索引,这意味着添加到暂存区。然后提交此暂存区域中存在的文件]

git add <path to file>

git commit -m "commit message"

#checkout其他本地分支

git checkout "local branch name"

#删除本地分支中的所有更改 [假设您在本地分支中进行了一些更改,例如添加新文件或修改现有文件,或进行本地提交,但不再需要], git clean -d -f然后git reset --hard [清除对本地分支所做的所有本地更改,除非本地提交]

git stash -u 也删除所有更改

注意: 很明显,我们可以使用(1)git clean –d –f和和git reset --hard (2)的组合git stash -u 来获得所需的结果。

注1:藏匿,因为这个词的意思是“安全(秘密地)将物品存放在指定的地方”。总是可以使用git stash pop检索。因此,在上述两个选项之间进行选择是开发人员的选择。

注意2:git reset --hard将删除工作目录更改。在运行此命令之前,请确保存储要保留的所有本地更改。

#切换到master分支,并确保您是最新的。

git checkout master

git fetch [这可能是必要的(取决于您的git config),以接收有关origin / master的更新]

git pull

#将功能分支合并到master分支。

git merge feature_branch

#将master分支重置为原始状态。

git reset origin/master

#意外从本地删除了文件,如何找回它? 执行git status以获取已删除资源的完整文件路径

git checkout branchname <file path name>

而已!

#将master分支与someotherbranch合并

git checkout master
git merge someotherbranchname

#重命名本地分支

git branch -m old-branch-name new-branch-name

#删除本地分支

git branch -D branch-name

#删除远程分支

git push origin --delete branchname

要么

git push origin :branch-name

#还原已推送到远程存储库的提交

git revert hgytyz4567

#使用GIT从先前的提交分支

git branch branchname <sha1-of-commit>

#Change已经被推送到远程的最近提交的提交消息

git commit --amend -m "new commit message"
git push --force origin <branch-name>

#丢弃此分支上的所有本地提交 [删除本地提交]

为了丢弃该分支上的所有本地提交,使该本地分支与该分支的“上游”相同,只需运行

git reset --hard @{u}

参考:http : //sethrobertson.github.io/GitFixUm/fixup.html 或执行git reset --hard origin/master[如果本地分支为master]

#恢复已经推送到远程存储库的提交?

$ git revert ab12cd15

#从本地分支和远程分支删除先前的提交

用例:您刚刚对本地分支进行了更改,并立即将其推送到远程分支,突然意识到,哦,不!我不需要这个改变。现在做什么?

git reset --hard HEAD~1[用于从本地分支删除该提交。1表示您所做的一次提交]

git push origin HEAD --force[这两个命令都必须执行。用于从远程分支删除]。当前签出的分支将称为您执行此操作的分支。

#从本地和远程存储库中删除一些最近的提交,并保留到所需的提交。(一种从本地和远程还原提交的提交)

假设您有3次提交已推送到名为“ develop”的远程分支

commitid-1 done at 9am
commitid-2 done at 10am
commitid-3 done at 11am. // latest commit. HEAD is current here.

恢复为旧提交(更改分支状态)

git log --oneline --decorate --graph //查看所有的commitid

git clean -d -f //清除所有本地更改

git reset --hard commitid-1 //在本地还原到此commitid

git push -u origin +develop//将此状态推送到远程。+做推力

#删除本地git merge: 案例:我在master分支上,并且合并了master分支并有一个新工作的phase2

$ git status

在分支机构主管

$ git merge phase2 $ git status

在分支机构主管

您的分支比“源/主”提前8次提交。

问:如何摆脱本地git合并?试过了git reset --hardgit clean -d -f两者都没有用。唯一有效的是以下任何一项:

$ git reset --hard origin / master

要么

$ git reset --hard HEAD〜8

要么

$ git reset --hard 9a88396f51e2a068bb7 [sha提交代码-这是所有合并提交发生之前的代码]

#create gitignore文件

touch .gitignore //在Mac或UNIX用户中创建文件

样本.gitignore内容:

.project
*.py
.settings

GIT备忘单的参考链接:https : //services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf


1
您用于删除远程分支的命令可能不是最好的。您正在使用,git push origin :branch-name但我建议您使用git push origin --delete branchname
vibs2006

同意,我同意你的建议更新,谢谢@ vibs2006
蜘蛛侠

21

与git中的所有内容一样,有多种实现方法。您使用的两个命令是执行此操作的一种方法。您可能要做的另一件事就是将它们隐藏起来git stash -u。在-u确保新增加的文件(未经跟踪)也包括在内。

方便的git stash -u

  1. 它可能是完成目标的最简单(唯一?)命令
  2. 如果事后改变主意,您将获得全部工作git stash pop(就像删除gmail中的电子邮件一样,如果事后改变主意,则可以撤消)

至于您的其他问题,git reset --hard将不会删除未跟踪的文件,因此您仍然需要git clean -f。但是a git stash -u可能是最方便的。


git reset --hard不会确实删除未跟踪的文件,但是删除索引中已经存在的未跟踪更改,即对文件的更改。我确定那是您的意思:)
FrederikStruck-Schøning2014年

当我使用时git stash -u,我看到了git bash的响应。“保存在{} BRANCHNAME工作目录和索引状态WIP可能是这样挽救了一个就是我们可以检索使用。git stash pop
蜘蛛侠

谢谢你们俩 我已经总结了答案并嵌入了我的问题。克里斯托夫让我知道什么git stash -u不和怎么流行,但弗雷德里克让我知道复位硬盘并使用的组合git reset --hardgit clean -f,为什么不stash优先在某些情况下。现在,请帮助我选择我应将哪个标记为答案:),这都是我的答案。
蜘蛛侠2014年

但是,如果有一个我不想跟踪的文件添加到了存储库中怎么办?仅在我的回购中。如果我将其添加到忽略列表,那么我将提交一个.ignore文件,这也会影响其他所有人。
2015年

7

1.当您根本不想保留本地更改时。

git reset --hard

此命令将从本地存储库中完全删除所有本地更改。仅当您根本不想保留本地更改时,这才是避免在pull命令期间发生冲突的最佳方法。

2.当您想保留本地更改时

如果您要从远程提取新更改,并在此提取过程中忽略本地更改,

git stash

它将存储所有本地更改,现在您可以拉出远程更改,

git pull

现在,您可以通过以下方式恢复本地更改:

git stash pop

1
git reset --hard不会删除所有本地更改。它仅删除修改。如果要删除添加项,那么您还必须git clean -fd
John Henckel


4

我认为git有一件事没有明确记录。我认为它实际上被忽略了。

git checkout .

伙计,你救了我的一天。我总是想尝试使用修改后的代码。但是事情有时最终会弄乱修改后的代码,添加新的未跟踪文件,等等。所以我要做的是,整理我想要的东西,做一些杂乱的事情,然后快速清理并在我满意的情况下提交。

git clean -fd很好的未跟踪文件的工作。

然后git reset简单地删除已上演的内容,但git checkout有点麻烦。一一指定文件或使用目录并不总是理想的。有时,我要删除的更改文件位于我想保留的目录中。我希望此命令仅删除未进行的更改,就在这里。谢谢。

但是我认为他们应该git checkout没有任何选择,删除所有未进行的更改,而不要触摸已进行的更改。这有点模块化和直观。更像是什么git resetgit clean也应该这样做。


2

最好的方法是检查更改。

在名为project-name的项目中更改文件pom.xml,您可以执行以下操作:

git status

# modified:   project-name/pom.xml

git checkout project-name/pom.xml
git checkout master

# Checking out files: 100% (491/491), done.
# Branch master set up to track remote branch master from origin.
# Switched to a new branch 'master'

2

对于丢弃所有我喜欢隐藏和丢弃的东西,这是丢弃所有东西的最快方法,尤其是当您在多个存储库之间工作时。

这将隐藏所有{0}密钥更改,并立即将其从{0}

git stash && git stash drop


1

首先检查您的重要更改是否通过以下方式保存:

$ git状态

比尝试

$ git reset --hard

它将您的分支重置为默认值

但是,如果您只需要撤消操作:

$编辑(1)$ git添加frotz.c filfre.c $ mailx(2)$ git重置
(3)$ git pull git://info.example.com/ nitfol


了解更多>> https://git-scm.com/docs/git-reset


旁注:reset --hard是危险的命令,它将删除所有更改,并且无法撤消。使用硬重置时,用户应注意。
danglingpointer
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.