如何丢弃Git中未老化的更改?

如何丢弃Git中未老化的更改?,git,version-control,Git,Version Control,如何放弃工作副本中不在索引中的更改?对于当前工作目录中的所有未老化文件,请使用: git checkout -- . 对于特定的文件使用: git checkout -- path/to/file/to/revert --此处用于消除歧义(这称为) 对于Git2.23以后的版本,可能需要使用更具体的 git restore . 分别 与git开关一起替换重载的git checkout(),从而消除参数歧义。另一种更快的方法是: git stash save --keep-index --i

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

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

git checkout -- .
对于特定的文件使用:

git checkout -- path/to/file/to/revert
--
此处用于消除歧义(这称为)

对于Git2.23以后的版本,可能需要使用更具体的

git restore .
分别


git开关一起
替换重载的
git checkout
(),从而消除参数歧义。

另一种更快的方法是:

git stash save --keep-index --include-untracked
如果您不想彻底了解它,您不需要包括
——包括未跟踪的


之后,如果愿意,您可以使用
git stash drop
命令删除该存储。

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

git checkout .
或者从索引中检出所有文件,覆盖工作树文件

git checkout-index -a -f

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

git diff | git apply --reverse

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

使用
git clean-f
删除这些新文件,但要小心!请注意强制选项

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

-d
:除了未跟踪的文件之外,还删除未跟踪的目录

-f
:强制(根据
清洁.要求强制设置,可能不需要强制)


运行
git help clean
查看手册

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


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

我发现本文有助于解释何时使用哪个命令:

有两种不同的情况:

  • 如果尚未暂存文件,则使用
    git checkout
    。签出“更新工作树中的文件以匹配索引中的版本”。如果文件尚未暂存(亦称添加到索引中)。。。此命令实质上将文件还原为上次提交的文件

    git签出——foo.txt

  • 如果已暂存文件,则使用git reset。重置更改索引以匹配提交

    git重置--foo.txt

  • 我怀疑使用
    git-stash
    是一种流行的选择,因为它不太危险。如果在使用git reset时不小心吹走了太多,您可以随时返回到它。默认情况下,重置是递归的


    查看上面的文章以获得进一步的建议。

    似乎完整的解决方案是:

    git clean -df
    git checkout -- .
    

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

    当您要将存储转移给其他人时:

    # 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
    

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

    即使在以下目录中也有效:;在正常git权限之外

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

    最近发生在我身上的事

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

    我有一个类似的问题,也许不完全相同,我很难过地说我的解决方案并不理想,但它最终是有效的

    我经常会有这样的git状态消息(至少涉及2/4个文件):

    $git状态
    #目前不在任何分支上。
    #要提交的更改:
    #(使用“git重置磁头…”取消分级)
    #
    #修改:doc/PROJECT/MEDIUM/ATS约束/约束变量dats
    #修改:doc/PROJECT/MEDIUM/ATS constraint/parsing/parsing_s2var.dats
    #
    #未为提交而暂存的更改:
    #(使用“git add…”更新将提交的内容)
    #(使用“git签出--…”放弃工作目录中的更改)
    #
    #修改:doc/PROJECT/MEDIUM/ATS约束/约束变量dats
    #修改:doc/PROJECT/MEDIUM/ATS constraint/parsing/parsing_s2Var.dats
    
    敏锐的眼睛会注意到这些文件中有一个doppleganger,在case off中只有一个字母。不知怎的,我不知道是什么让我走上了这条路(因为我自己没有从上游回购协议处理这些文件),我已经切换了这些文件。尝试本页(和其他页)列出的许多解决方案似乎没有帮助


    我可以通过删除我的分叉存储库和所有本地存储库,然后重新工作来解决这个问题。单靠这一点是不够的;上游必须将有问题的文件重命名为新文件名。只要您没有任何未经限制的工作、没有Wiki,也没有与上游存储库产生分歧的问题,您就应该没事。至少可以说,上游可能对你不太满意。至于我的问题,这无疑是一个用户错误,因为我对git不太精通,但事实上,解决git的问题也很不容易

    git签出-f


    mangit结帐

    -f,--force

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

    从索引中检出路径时,不要在未合并条目时失败;相反,未合并的条目将被忽略。

    我最喜欢的是

    cd path_to_project_folder  # take you to your project folder/working directory 
    git checkout .             # removes all unstaged changes in working directory
    
    git checkout -p
    
    那就让
    cd path_to_project_folder  # take you to your project folder/working directory 
    git checkout .             # removes all unstaged changes in working directory
    
    git checkout -p
    
    git add -p
    
    git stash
    
    git stash apply 
    
    git add --all
    
    git fetch --all
    
    git reset --hard origin/branchname
    
    git reset --hard @{u}
    
    git add .
    git stash
    
    git stash drop
    
    git reset --hard <commit hash>
    
    git clean -dxn .  # dry-run to inspect the list of files-to-be-removed
    git clean -dxf .  # REMOVE ignored/untracked files (in the current directory)
    git checkout -- . # ERASE changes in tracked files (in the current directory)
    
    git clean -df
    
    git stash -u
    
    git checkout -- .
    git clean -df
    
    git checkout -- .
    
    git stash -u
    
    discard = checkout --
    
    discard .
    
    discard filename
    
    cleanout = !git clean -df && git checkout -- .
    
    cleanout
    
    git checkout -- .
    
    git clean -i 
    
    git stash
    
    git restore <file>
    
    git restore .