代码之家  ›  专栏  ›  技术社区  ›  Joe Holloway

如何丢弃Git中的未分页更改?

git
  •  4158
  • Joe Holloway  · 技术社区  · 16 年前

    如何放弃不在索引中的工作副本更改?

    32 回复  |  直到 6 年前
        1
  •  2339
  •   Brandon Minnick    6 年前

    另一个更快的方法是:

    git stash save --keep-index --include-untracked
    

    你不需要包括 --include-untracked 如果你不想透彻的话。

    在那之后,你可以用 git stash drop 命令,如果你喜欢的话。

        2
  •  4542
  •   mja    6 年前

    对于当前工作目录中的所有未分页文件,请使用:

    git checkout -- .
    

    对于特定文件,请使用:

    git checkout -- path/to/file/to/revert
    

    -- 此处移除 argument ambiguation .

        3
  •  1707
  •   Honest Abe Cody Piersall    7 年前

    似乎完整的解决方案是:

    git clean -df
    git checkout -- .
    

    git clean 删除所有未跟踪的文件( 警告 :虽然它不会删除直接在.gitignore中提到的被忽略的文件, 它可能会删除文件夹中被忽略的文件 ) git checkout 清除所有未分页的更改。

        4
  •  299
  •   CB Bailey    15 年前

    这将检查当前目录的当前索引,并向下丢弃当前目录中文件的所有更改。

    git checkout .
    

    或者检查索引中的所有文件,覆盖工作树文件。

    git checkout-index -a -f
    
        5
  •  224
  •   falsarella Pixelomo    9 年前
    git clean -df
    

    通过从当前目录开始递归删除不受版本控制的文件来清理工作树。

    -d :删除未跟踪的目录以及未跟踪的文件

    -f :力(根据 clean.requireForce 设置)

    git help clean 查看手册

        6
  •  91
  •   Ben    9 年前

    我最喜欢的是

    git checkout -p
    

    这样可以有选择地还原块。

    参见:

    git add -p
    
        7
  •  77
  •   2540625    6 年前

    由于没有答案表明我使用的是确切的选项组合,这里是:

    git clean -dfx
    git checkout .
    

    这是用于 git clean 选项:

    -d

    删除未跟踪的目录以及未跟踪的文件。如果未跟踪的目录由其他Git存储库管理,则默认情况下不会删除该目录。使用 -f 如果您真的想删除这样的目录,可以选择两次。

    -F

    如果git配置变量 clean.requireForce 未设置为 false ,git clean将拒绝删除文件或目录,除非给出 -F , -n -i . Git将拒绝删除 .git 子目录或文件,除非 -F 给出。

    -x

    不要使用忽略规则 .gitignore (每个目录)和 $GIT_DIR/info/exclude ,但仍要使用 -e 选项。这允许删除所有未跟踪的文件,包括生成产品。这可用于(可能与 git reset )创建原始工作目录以测试干净的生成。

    也, git checkout . 需要在回购的根目录中完成。

        8
  •  56
  •   fontno    11 年前

    我真的发现这篇文章有助于解释何时使用什么命令: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/

    有几个不同的情况:

    1. 如果您还没有准备好文件,则使用 git checkout . 签出“更新工作树中的文件以匹配索引中的版本”。如果文件没有被转移(也就是添加到索引中)。这个命令基本上会将文件还原为上次提交的内容。

      git checkout -- foo.txt

    2. 如果您已经转移了文件,那么使用git reset。重置将更改索引以匹配提交。

      git reset -- foo.txt

    我怀疑使用 git stash 这是一个很受欢迎的选择,因为它不那么危险。如果在使用git reset时不小心吹走了太多,您可以返回到它。默认情况下,重置是递归的。

    请看上面的文章以获取进一步的建议。

        9
  •  49
  •   Forhadul Islam    7 年前

    最简单的方法是使用以下命令:

    此命令用于放弃工作目录中的更改-

    git checkout -- .
    

    https://git-scm.com/docs/git-checkout

    在git命令中,通过使用以下方法来存储未跟踪的文件:

    git stash -u
    

    http://git-scm.com/docs/git-stash

        10
  •  43
  •   Joshua Kunzmann    13 年前

    如果您对保留未分页的更改不感兴趣(特别是如果分阶段的更改是新文件),我发现这很方便:

    git diff | git apply --reverse
    
        11
  •  41
  •   Dorian    7 年前

    当你输入git状态时, (使用“git checkout--…”放弃工作目录中的更改) 如图所示。

    例如 git checkout -- .

        12
  •  40
  •   Bijan    10 年前

    git checkout -f


    man git-checkout :

    -f, --force

    切换分支时,即使索引或工作树与头不同,也要继续。这用于丢弃本地更改。

    从索引中签出路径时,不要在未合并的条目上失败;而是忽略未合并的条目。

        13
  •  37
  •   2540625    6 年前

    如果你只是希望 删除对现有文件的更改 使用 checkout ( documented here )

    git checkout -- .
    
    • 未指定分支,因此它将签出当前分支。
    • 双连字符( -- )告诉Git下面的内容应该作为它的第二个参数(路径),您跳过了分支的规范。
    • 期间( . )指示所有路径。

    如果你想要 删除添加的文件 自上次提交以来,请使用 clean ( documented here ):

    git clean -i 
    
    • 这个 -i 选项启动交互式 清洁的 ,以防止错误删除。
    • 其他一些选项可用于更快的执行;请参阅文档。

    如果你愿意 将更改移动到保留空间以供以后访问 使用 stash ( documented here ):

    git stash
    
    • 所有更改将移动到Git的存储库中,以便以后访问。
    • 一些选项可用于更细微的存储;请参阅文档。
        14
  •  34
  •   Asped    9 年前

    你可以使用git stash-如果出了问题,你仍然可以从stash恢复过来。 与此处的其他答案类似,但此选项还删除所有未分页的文件和所有未分页的删除:

    git add .
    git stash
    

    如果你检查一切正常,把藏品扔掉:

    git stash drop
    

    来自Bilal Maqsood的答案 git clean 也为我工作,但有了藏匿处,我有了更多的控制权——如果我不小心做了什么,我仍然可以取回我的零钱。

    更新

    我想还有一个变化(不知道为什么以前这样对我有效):

    git add . -A 而不是 git add .

    没有 -A 删除的文件将不进行暂存

        15
  •  32
  •   Nick    8 年前

    我没有放弃更改,而是将遥控器重置为原点。注意-此方法是将文件夹完全还原为repo文件夹。

    所以我这样做是为了确保当我git重置时它们不在那里(稍后-排除源站/分支名称上的gitignores)

    注意:如果要保留尚未跟踪的文件,但不在gitignore中,您可能希望跳过此步骤,因为它将擦除远程存储库中找不到的未跟踪文件(谢谢@xtrmjosh)。

    git add --all
    

    然后我

    git fetch --all
    

    然后我重置为原点

    git reset --hard origin/branchname
    

    这将使它回到正方一。就像重新克隆分支一样,同时将所有gitignored文件保留在本地和适当的位置。

    以下按用户更新的评论: 变量将重置为用户当前所在的分支。

    git reset --hard @{u}
    
        16
  •  26
  •   artur    13 年前

    尝试了上面的所有解决方案,但仍然无法删除新的、未老化的文件。

    使用 git clean -f 删除那些新文件- 但是要小心! 注意强制选项。

        17
  •  21
  •   DrB Kris Verlaenen    9 年前

    简单地说

    git stash
    

    它将删除所有本地更改。你以后也可以说

    git stash apply 
    

    或 流行音乐流行歌曲

        18
  •  20
  •   Ben Wilde    8 年前

    只需使用:

    git stash -u
    

    完成。容易的。

    如果你 真的? 关心你的藏匿处然后你可以跟着 git stash drop . 但在这一点上,你最好使用(来自Mariusz Nowak):

    git checkout -- .
    git clean -df
    

    尽管如此,我还是喜欢 git stash -u 最好是因为它“丢弃”所有跟踪和未跟踪的更改 一个命令 . 然而 git checkout -- . 只丢弃跟踪的更改, 和 git clean -df 只丢弃未跟踪的更改…输入这两个命令 远的 工作太多:)

        19
  •  16
  •   GlassGhost    9 年前

    这甚至在正常git权限之外的目录中也可以工作。

    sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx
    

    最近发生在我身上

        20
  •  14
  •   vivekporwal04    10 年前
    cd path_to_project_folder  # take you to your project folder/working directory 
    git checkout .             # removes all unstaged changes in working directory
    
        21
  •  11
  •   jdgregson Mark    6 年前

    无论回购处于何种状态,您都可以重置为以前的任何承诺:

    git reset --hard <commit hash>
    

    这将放弃在提交之后所做的所有更改。

        22
  •  10
  •   tjb    12 年前

    另一种消除新文件的方法比git clean-df更具体(它允许您除去一些文件,不一定全部),是先将新文件添加到索引中,然后存储,然后删除存储。

    当由于某种原因,您无法通过某种普通机制(如rm)轻松删除所有未跟踪的文件时,此技术非常有用。

        23
  •  9
  •   bbarker    10 年前

    如果您使用的是存储库的一个分支,在该分支中定期与另一个repo同步(例如pull请求),那么下面的内容实际上只是一个解决方案。简短回答:删除fork并重新格式化,但是 阅读GitHub上的警告 .

    我也遇到过类似的问题,也许不完全相同,我很遗憾地说,我的解决方案并不理想,但最终是有效的。

    我经常会收到这样的git状态消息(至少包含2/4个文件):

    $ git status
    # Not currently on any branch.
    # Changes to be committed:
    #   (use "git reset HEAD <file>..." to unstage)
    #
    #       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
    #       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
    #
    # Changes not staged for commit:
    #   (use "git add <file>..." to update what will be committed)
    #   (use "git checkout -- <file>..." to discard changes in working directory)
    #
    #       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
    #       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats
    

    敏锐的眼睛会注意到这些文件中的“兴奋剂”是一个单独的字母,以防万一。不知何故,我不知道是什么引导我沿着这条路径开始(因为我自己没有从上游repo处理这些文件),我已经切换了这些文件。尝试本页(和其他页)列出的许多解决方案似乎没有帮助。

    我可以通过删除分叉的存储库和所有本地存储库并重新格式化来解决这个问题。仅此一项是不够的;上游必须将有问题的文件重命名为新文件名。 只要你没有任何未被限制的工作,没有维基,也没有任何与上游存储库不同的问题,你就应该很好。上游可能对你不太满意,至少可以说。至于我的问题,这无疑是一个用户错误,因为我不太精通git,但事实上,要解决git问题还远不容易。

        24
  •  9
  •   Lahiru Jayaratne    8 年前

    在我看来,

    git clean -df
    

    应该有技巧。按照 Git documentation on git clean

    git clean-从工作树中删除未跟踪的文件

    描述

    通过递归删除 不受版本控制,从当前目录开始。

    通常,只删除Git未知的文件,但如果-x选项 如果指定,则忽略的文件也将被删除。例如,这可以 有助于删除所有生成产品。

    如果有可选的…给出了参数,只有这些路径 影响。

    选项

    -d删除未跟踪的目录以及未跟踪的文件。如果一个未跟踪的目录是由另一个git存储库管理的,那么它是 默认情况下不删除。如果您真的想使用-f选项两次 删除这样的目录。

    -F --强制如果git配置变量clean.requireforce未设置为false,则git clean将拒绝运行,除非给出-f、-n或-i。

        25
  •  7
  •   twicejr    9 年前

    当你想把藏品转移给其他人时:

    # add files
    git add .  
    # diff all the changes to a file
    git diff --staged > ~/mijn-fix.diff
    # remove local changes 
    git reset && git checkout .
    # (later you can re-apply the diff:)
    git apply ~/mijn-fix.diff
    

    [编辑]正如评论所述,可以命名隐藏。好吧,如果你想分享你的藏品,就用这个;)

        26
  •  6
  •   Ivan    9 年前

    如果所有阶段文件都已提交,则只需单击三次鼠标即可从GUI重置分支: 分公司 , 重置 , 是的 !

    所以我在实践中经常做的是恢复不需要的本地更改,提交所有好的东西,然后重新设置分支。

    如果好的东西是在一个单一的提交中提交的,那么如果您最终想要以一点不同的方式提交它,那么您可以使用“修正最后提交”将其恢复到阶段性或非阶段性。

    这可能不是您在寻找解决问题的技术解决方案,但我发现这是一个非常实用的解决方案。它允许您有选择地放弃未保存的更改,重新设置您不喜欢的更改并保留您所做的更改。

    总之,我只是 犯罪 , 分支复位 修改上次提交 .

        27
  •  6
  •   Pau    7 年前

    您可以创建自己的别名,该别名以描述性的方式描述如何执行该操作。

    我使用下一个别名放弃更改。


    放弃工作树中文件(列表)的更改

    discard = checkout --
    

    然后您可以将其用作下一个选项来放弃所有更改:

    discard .
    

    或者只是一个文件:

    discard filename
    

    否则,如果您要放弃所有更改以及未跟踪的文件,我将混合使用签出和清理:

    清除并丢弃工作树中的更改和未跟踪的文件

    cleanout = !git clean -df && git checkout -- .
    

    因此使用简单如下:

    cleanout
    

    现在可以在下一个包含大量别名的Github repo中使用:

        28
  •  6
  •   Vadim Kotov First Zero    7 年前

    如果您是在子模块的情况下,没有其他解决方案起作用,请尝试:

    • 要检查问题是什么(可能是“脏”情况),请使用:

      git diff

    • 清除堆积物

      git submodule update

        29
  •  6
  •   Vadim Kotov First Zero    7 年前

    我遇到了一个奇怪的情况,文件总是不稳定的,这有助于我解决问题。

    Git rm.Gittributes属性
    Git加-A
    Git重置--硬

        30
  •  5
  •   Malcolm Boekhoff    9 年前

    如果你改变了 权限 文件(在DOS/windoze上)

    Mon 23/11/2015-15:16:34.80 C:\...\work\checkout\slf4j+> git status
    On branch SLF4J_1.5.3
    Changes not staged for commit:
      (use "git add ..." to update what will be committed)
      (use "git checkout -- ..." to discard changes in working directory)
    
            modified:   .gitignore
            modified:   LICENSE.txt
            modified:   TODO.txt
            modified:   codeStyle.xml
            modified:   pom.xml
            modified:   version.pl
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    Mon 23/11/2015-15:16:37.87 C:\...\work\checkout\slf4j+> git diff
    diff --git a/.gitignore b/.gitignore
    old mode 100644
    new mode 100755
    diff --git a/LICENSE.txt b/LICENSE.txt
    old mode 100644
    new mode 100755
    diff --git a/TODO.txt b/TODO.txt
    old mode 100644
    new mode 100755
    diff --git a/codeStyle.xml b/codeStyle.xml
    old mode 100644
    new mode 100755
    diff --git a/pom.xml b/pom.xml
    old mode 100644
    new mode 100755
    diff --git a/version.pl b/version.pl
    old mode 100644
    new mode 100755
    
    Mon 23/11/2015-15:16:45.22 C:\...\work\checkout\slf4j+> git reset --hard HEAD
    HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore
    
    Mon 23/11/2015-15:16:47.42 C:\...\work\checkout\slf4j+> git clean -f
    
    Mon 23/11/2015-15:16:53.49 C:\...\work\checkout\slf4j+> git stash save -u
    Saved working directory and index state WIP on SLF4J_1.5.3: 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore
    HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore
    
    Mon 23/11/2015-15:17:00.40 C:\...\work\checkout\slf4j+> git stash drop
    Dropped refs/stash@{0} (cb4966e9b1e9c9d8daa79ab94edc0c1442a294dd)
    
    Mon 23/11/2015-15:17:06.75 C:\...\work\checkout\slf4j+> git stash drop
    Dropped refs/stash@{0} (e6c49c470f433ce344e305c5b778e810625d0529)
    
    Mon 23/11/2015-15:17:08.90 C:\...\work\checkout\slf4j+> git stash drop
    No stash found.
    
    Mon 23/11/2015-15:17:15.21 C:\...\work\checkout\slf4j+> git checkout -- .
    
    Mon 23/11/2015-15:22:00.68 C:\...\work\checkout\slf4j+> git checkout -f -- .
    
    Mon 23/11/2015-15:22:04.53 C:\...\work\checkout\slf4j+> git status
    On branch SLF4J_1.5.3
    Changes not staged for commit:
      (use "git add ..." to update what will be committed)
      (use "git checkout -- ..." to discard changes in working directory)
    
            modified:   .gitignore
            modified:   LICENSE.txt
            modified:   TODO.txt
            modified:   codeStyle.xml
            modified:   pom.xml
            modified:   version.pl
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    Mon 23/11/2015-15:22:13.06 C:\...\work\checkout\slf4j+> git diff
    diff --git a/.gitignore b/.gitignore
    old mode 100644
    new mode 100755
    diff --git a/LICENSE.txt b/LICENSE.txt
    old mode 100644
    new mode 100755
    diff --git a/TODO.txt b/TODO.txt
    old mode 100644
    new mode 100755
    diff --git a/codeStyle.xml b/codeStyle.xml
    old mode 100644
    new mode 100755
    diff --git a/pom.xml b/pom.xml
    old mode 100644
    new mode 100755
    diff --git a/version.pl b/version.pl
    old mode 100644
    new mode 100755
    

    解决此问题的唯一方法是手动重置已更改文件的权限:

    Mon 23/11/2015-15:25:43.79 C:\...\work\checkout\slf4j+> git status -s | egrep "^ M" | cut -c4- | for /f "usebackq tokens=* delims=" %A in (`more`) do chmod 644 %~A
    
    Mon 23/11/2015-15:25:55.37 C:\...\work\checkout\slf4j+> git status
    On branch SLF4J_1.5.3
    nothing to commit, working directory clean
    
    Mon 23/11/2015-15:25:59.28 C:\...\work\checkout\slf4j+>
    
    Mon 23/11/2015-15:26:31.12 C:\...\work\checkout\slf4j+> git diff