各种方法删除本地Git更改

时间:2014-03-24 20:54:39

标签: git git-bash

我刚刚克隆了一个git存储库并检出了一个分支。我做了它,然后决定删除我所有的本地更改,因为我想要原始副本。

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

git checkout .

git clean -f

我的问题是,

(1)这是摆脱当地变化的正确方法吗,或者请让我知道正确的方法。

(2)我们什么时候使用git reset --hard,因为即使没有这个命令我也可以重置

由于

*解决方案:主要编辑:03/26:* 用git特定的术语替换了许多模糊的术语  [跟踪/未跟踪/分段/不分阶段]

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

  

类型1.分阶段跟踪文件

     

输入2.未分级跟踪文件

     

键入3. Unstaged UnTracked文件a.k.a UnTracked文件

  • 暂存 - 转移到暂存区/添加到索引
  • 的那些
  • 已跟踪 - 已修改的文件
  • UnTracked - 新文件。总是没有分期。如果上演,则意味着他们被跟踪。

每个命令的作用:

  1. git checkout . - 仅删除未分阶段的跟踪文件[类型2]

  2. git clean -f - 仅删除未分级的UnTracked文件[类型3]

  3. git reset --hard - 仅删除分阶段跟踪和未分阶段跟踪文件[类型1,类型2]

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

  5. 结论:

    很明显,我们可以使用

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

    OR

    (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 cleanHow to remove local (untracked) files from the current Git working tree?

    编辑:05/20/15

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

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

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

    或执行git reset --hard origin/master [如果本地分支是master]

    注意:06/12/2015 是标记为重复的其他SO问题的副本。此问题解决了如何删除本地GIT更改[删除添加的文件,删除添加到现有文件等的更改以及各种方法;其他SO线程中的位置仅解决了如何删除本地提交的问题。如果你添加了一个文件,并且想要单独删除它,那么另一个SO线程就不会讨论它。因此,这不是另一个的重复]

    编辑:2015年6月23日

    如何恢复已推送到远程存储库的提交?

    $ git revert ab12cd15
    

    编辑:09/01/2015

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

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

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

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

    分支机构是什么?它是目前签出的分支。

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

    我在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 commit code - 这是在所有合并提交发生之前存在的那个]

10 个答案:

答案 0 :(得分:483)

这完全取决于你想要撤消/恢复的内容。首先阅读the post in Ube's link。但要尝试答案:

硬重置

git reset --hard [HEAD]

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

我发现自己经常使用硬重置,当我想“只是撤消一切,就像我从遥控器完成了一次完全重新克隆”。在你的情况下,你只需要你的repo pristine,这将有效。

<强>清洁

git clean [-f]

删除未跟踪的文件。

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

-f(强制)选项也将删除未被跟踪的文件也被git忽略但忽略规则。在上面的例子中,使用ignore-rule永远不会跟踪bin / obj文件夹,即使git忽略了这些文件夹,使用force-option也会将它们从文件系统中删除。我偶尔会看到一个用途,例如脚本部署时,您希望在部署,压缩或其他任何内容之前清理代码。

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

结帐“dot”

git checkout .

在阅读你的帖子之前,我从未见过这种表示法。我很难找到这方面的文档(也许有人可以提供帮助),但是从玩了一下,它看起来就像是:

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

即。撤消跟踪文件中的未分级更改。它显然没有触及分阶段的变化,只留下未跟踪的文件。

<强>积攒

有些答案提到了藏匿。正如措辞所暗示的那样,你可能会在你处于中间状态时使用存储(没有准备好提交),你必须暂时切换分支或以某种方式处理代码的另一个状态,以后再回到你的“凌乱”台”。我不认为这适用于你的问题,但它绝对方便。

总结

通常情况下,如果您确信自己已经投入并可能会进行远程重要更改,如果您只是在玩游戏等,使用git reset --hard HEAD后跟git clean -f将最终清除您的代码如果只是克隆并从分支机构检查出来,它就会进入。强调重要的是,重置还将删除分阶段但未提交的更改。 它将擦除尚未提交的所有内容(未跟踪文件除外,在这种情况下,请使用 clean )。

所有其他命令都是为了促进更复杂的场景,其中需要“撤消内容”的粒度:)

我觉得,你的问题#1已被涵盖,但最后,在#2结束:你从未发现需要使用git reset --hard的原因是你从未上过任何东西。如果您进行了更改,git checkout .git clean -f都不会将其恢复。

希望这涵盖。

答案 1 :(得分:20)

与git中的所有内容一样,有多种方法可以实现。您使用的两个命令是一种方法。你可以做的另一件事就是用git stash -u隐藏它们。 -u确保包含新添加的文件(未跟踪)。

关于git stash -u的便利之处在于

  1. 它可能是实现目标的最简单(唯一?)单一命令
  2. 如果你之后改变了主意,你可以使用git stash pop 全部恢复你的工作(就像删除gmail中的电子邮件一样,如果你之后改变主意,你可以撤消)
  3. 从您的其他问题开始,git reset --hard将不会删除未跟踪的文件,因此您仍然需要git clean -f。但是git stash -u可能是最方便的。

答案 2 :(得分:19)

此时添加答案的原因:

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

我还添加了更多经常使用的git命令,帮助我使用git,帮助其他人。

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

在您提交任何提交之前,

第一个步骤是配置与您的提交一起显示的用户名和电子邮件。

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

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

#设置您想要提交到提交交易的电子邮件

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

#List全局配置

$ git config --list

#List远程网址

$ git remote show origin

#check status

git status

#List所有本地和远程分支

git branch -a

#创建一个新的本地分支并开始处理此分支

git checkout -b "branchname" 

或者,它可以作为两步过程完成

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

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

git add <path to file>

git commit -m "commit message"

#checkout其他一些本地分支

git checkout "local branch name"

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

git stash -u也会删除所有更改

注意: 很明显,我们可以使用其中之一 (1)git clean –d –fgit reset --hard的组合 要么 (2)git stash -u 达到理想的效果。

注1:存储,因为这个词意味着在某个指定的地方安全地,秘密地存储(某物)。&#39;这总是可以使用git stash pop进行检索。因此,在上述两个选项之间进行选择是开发人员的调用。

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

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

git checkout master

git fetch [这可能是必要的(取决于你的git配置)来接收关于origin / master的更新]

git pull

#将功能分支合并到主分支中。

git merge feature_branch

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

git reset origin/master

#Accidentally从本地删除了一个文件,如何将其检索回来? 执行git status以获取已删除资源的完整文件路径

git checkout branchname <file path name>

那就是它!

#Merge master branch with someotherbranch

git checkout master
git merge someotherbranchname

#rename local branch

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

#delete local branch

git branch -D branch-name

#delete remote branch

git push origin --delete branchname

git push origin :branch-name

#revert已提交到远程存储库的提交

git revert hgytyz4567

使用GIT的先前提交的#branch

git branch branchname <sha1-of-commit>

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

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

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

为了丢弃该分支上的所有本地提交,使本地分支与&#34; upstream&#34;相同。这个分支,只需运行

git reset --hard @{u}

参考:http://sethrobertson.github.io/GitFixUm/fixup.htmlgit reset --hard origin/master [如果当地分支是主人]

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

$ git revert ab12cd15

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

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

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

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

#Delete来自本地和远程repo的一些最近提交并保留到您想要的提交。 (一种来自本地和远程的恢复提交)

我们假设您有3个提交已被推送到名为&#39; develop&#39;

的远程分支
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 //查看所有提交内容

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

git reset --hard commitid-1 //本地恢复此commitid

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

#删除本地git merge: 案件: 我在主分支和合并主分支与新工作分支phase2

$ git status

在分支主机上

$ git merge phase2     $ git status

在分支主机上

您的分支领先于原创/大师&#39;通过 8 提交。

问:如何摆脱这种本地git合并?尝试git reset --hardgit clean -d -f两者都没有效果。 唯一可以工作的是以下任何一种:

$ git reset --hard origin / master

$ git reset --hard HEAD~8

$ git reset --hard 9a88396f51e2a068bb7 [sha commit code - 这是在所有合并提交发生之前存在的那个]

#create gitignore file

touch .gitignore //在mac或unix用户中创建文件

示例.gitignore内容:

.project
*.py
.settings

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

答案 3 :(得分:7)

1。如果您不想保留本地更改。

git reset --hard

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

2。如果要保留本地更改

如果你想从远程拉出新的更改并想忽略它 然后,拉动期间的局部变化,

git stash

它将隐藏所有本地更改,现在您可以拉远程更改,

git pull

现在,您可以通过

恢复您的本地更改
git stash pop

答案 4 :(得分:4)

使用:

git checkout -- <file>

放弃工作目录中的更改。

答案 5 :(得分:4)

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

git checkout .

伙计,你救了我的一天。我总是想要尝试使用修改后的代码。但事情有时最终会弄乱修改后的代码,添加新的未跟踪文件等。所以我想要做的就是,按照我想要的方式,做一些杂乱的事情,然后快速清理并提交,如果我很高兴。

git clean -fd适用于未跟踪文件。

然后git reset只是删除了暂停,但git checkout有点太麻烦了。逐个指定文件或使用目录并不总是理想的。有时我想要删除的已更改文件位于我想要保留的目录中。我希望这个命令可以删除未分级的更改,而这里就是你。感谢。

但我认为他们应该只有git checkout没有任何选项,删除所有未分级的更改而不是触摸上演的。它有点模块化和直观。更像是git reset的作用。 git clean也应该这样做。

答案 6 :(得分: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'

答案 7 :(得分:2)

对于丢弃所有我喜欢藏匿并删除该藏品,这是丢弃所有内容的最快方式,尤其是如果您在多个回购之间工作。

这将隐藏{0}键中的所有更改,并立即将其从{0}

中删除

git stash && git stash drop

答案 8 :(得分:1)

首先检查是否保存了您的重要更改:

  

$ git status

比 试试

  

$ git reset --hard

     

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

但如果你只需要撤消:

  

$ edit(1)   $ git add frotz.c   filfre.c $ mailx(2)   $ git reset
  (3)$ git pull git://info.example.com/ nitfol

了解更多&gt;&gt; https://git-scm.com/docs/git-reset

答案 9 :(得分:0)

选项 1:放弃跟踪和未跟踪的文件更改

放弃对暂存和未暂存文件所做的更改。

$ git reset --hard [HEAD]

然后完全丢弃(或删除)未跟踪的文件。

$ git clean [-f]

选项 2:隐藏

您可以先隐藏您的更改

$ git stash

然后根据您要执行的操作删除或弹出它。见https://git-scm.com/docs/git-stash#_synopsis

选项 3:手动将文件恢复到原始状态

首先我们切换到目标分支

$ git checkout <branch-name>

列出所有有变化的文件

$ git status

手动将每个文件恢复到原始状态

$ git restore <file-path>