reset撤销修改 - 如何丢弃Git中的未分级更改?




git暂存更改 (20)

git checkout -f

man git-checkout

-f, --force

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

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

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


以下内容实际上只是一个解决方案,如果您正在使用存储库的分支,您可以定期与另一个存储库同步(例如,拉取请求)。 简短回答:删除fork和refork,但是读取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

敏锐的眼睛会注意到这些文件中的doppleganger是单个字母,以防万一。 不知何故,我不知道是什么导致我开始这条路(因为我自己从上游回购中没有使用这些文件),我已经切换了这些文件。 尝试此页面上列出的许多解决方案(和其他页面)似乎没有帮助。

我能够通过删除我的分叉存储库和所有本地存储库来重新解决问题。 仅这一点还不够; 上游必须将有问题的文件重命名为新文件名。 只要您没有任何未完成的工作,没有wiki,并且没有与上游存储库不同的问题,您应该没问题。 至少可以说,上游可能对您不满意。 至于我的问题,它无疑是一个用户错误,因为我不是那么精通git,但事实上它很容易修复指向git的问题。


你可以使用git stash - 如果出现问题,你仍然可以从藏匿处恢复。 与此处的其他答案类似,但此处还会删除所有未暂存的文件以及所有未暂存的删除:

git add .
git stash

如果你检查一切正常,扔掉藏匿处:

git stash drop

Bilal Maqsood使用git clean的答案对我来说也很有用,但是我有更多的控制权 - 如果我不小心做了,我仍然可以得到我的更改

UPDATE

我认为还有一个更改(不知道为什么这对我有用):

git add . -A git add . -A而不是git add .

如果没有-A ,删除的文件将不会被暂存


另一种更快捷的方法是:

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

如果你不想彻底了解它,你不需要包含--include-untracked

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


在我看来,

git clean -df

应该做的伎俩。 根据git clean上的Git文档

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

描述

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

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

如果给出任何可选的...参数,则只会影响这些路径。

选项

-d除了未跟踪的文件外,还删除未跟踪的目录。 如果未跟踪的目录由不同的Git存储库管理,则默认情况下不会删除它。 如果您确实要删除此类目录,请使用-f选项两次。

-f --force如果Git配置变量clean.requireForce未设置为false,则除非给定-f,-n或-i,否则git clean将拒绝运行。


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

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

    git diff

  • 要删除藏匿处

    git submodule update


如果您刚刚更改了文件的权限 (这是在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/[email protected]{0} (cb4966e9b1e9c9d8daa79ab94edc0c1442a294dd)

Mon 23/11/2015-15:17:06.75 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/[email protected]{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


如果您只想删除对现有文件的更改 ,请使用checkouthttps://git-scm.com/docs/git-checkout )。

git checkout -- .
  • 没有指定分支,因此它检出当前分支。
  • 双连字符( -- )告诉Git后面的内容应该作为它的第二个参数(路径),你跳过了分支的规范。
  • 句点( . )表示所有路径。

如果要删除自上次提交后添加的文件 ,请使用cleangit-scm.com/docs/git-clean ):

git clean -i 
  • -i选项启动交互式clean ,以防止错误删除。
  • 还有一些其他选项可以更快地执行; 看文档。

如果您希望将更改移动到保留空间以供以后访问 ,请使用stash此处记录 ):

git stash
  • 所有更改都将移至Git的Stash,以便以后访问。
  • 有一些选项可用于更细微的存储; 看文档。

对于所有未暂存的文件,请使用:

git checkout -- .

对于特定文件使用:

git checkout path/to/file/to/revert

确保在最后包括期间。


尝试了上面的所有解决方案,但仍然无法摆脱新的,未停止的文件。

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


当您输入git status时,会显示(使用“git checkout - ...”来放弃工作目录中的更改)

例如git checkout -- .


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

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

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

discard = checkout --

然后您可以将其用作下一个以丢弃所有更改:

discard .

或者只是一个文件:

discard filename

否则,如果您要丢弃所有更改以及未跟踪的文件,我会使用checkout和clean的混合:

在工作树中清理并放弃更改和未跟踪的文件

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

所以下次使用很简单:

cleanout

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


我有一个奇怪的情况,一个文件总是未分阶段,这有助于我解决。

git rm .gitattributes
git add -A
git reset --hard


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

所以我这样做是为了确保当我git重置时它们不会坐在那里(稍后 - 在Origin / branchname上排除gitignores)

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

git add --all

然后我

git fetch --all

然后我重置为原点

git reset --hard origin/branchname

这将使它回到原点。 就像重新克隆分支一样,WHILE将所有gitignored文件保存在本地并就位。

下面的每个用户评论更新:更改以重置用户所在的当前分支。

git reset --hard @{u}

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

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


无论您的仓库处于什么状态,您都可以随时重置为之前的任何提交:

git reset --hard <commit hash>

这将丢弃在提交后进行的所有更改。


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

git clean -dfx
git checkout .

这是用过的git clean选项的在线帮助文​​本:

-d

除了未跟踪的文件之外,删除未跟踪的目录。 如果未跟踪的目录由不同的Git存储库管理,则默认情况下不会删除它。 如果您确实要删除此类目录,请使用-f选项两次。

-f

如果Git配置变量clean.requireForce未设置为false ,则除非给定-f-n-i ,否则Git clean将拒绝删除文件或目录。 除非给出第二个-f ,否则Git将拒绝删除.git子目录或文件中的.git

-x

不要使用.gitignore (每个目录)和$GIT_DIR/info/exclude的ignore规则,但仍然使用-e选项给出的ignore规则。 这允许删除所有未跟踪的文件,包括构建产品。 这可以使用(可能与git reset一起使用)来创建一个pristine工作目录来测试一个干净的构建。

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


简单地说

git stash

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

git stash apply 

或者git stash pop


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

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

最近发生在我身上


cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory




git