【问题标题】:How can I discard modified files?如何丢弃修改过的文件?
【发布时间】:2012-01-06 14:41:45
【问题描述】:

这是一个 Linux 2.6 内核存储库。我将它克隆到我的本地主机。

之后。我没有做任何改变。但是当我“git status”时。我找到了 13 个修改过的文件。我想丢弃它们,但我不能。

> luke@Macbook-Pro~/Documents/workspace/linuxkernel/linux-2.6$ git
> status
> # On branch master
> # 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:   include/linux/netfilter/xt_connmark.h
> # modified:   include/linux/netfilter/xt_dscp.h
> # modified:   include/linux/netfilter/xt_mark.h
> # modified:   include/linux/netfilter/xt_rateest.h
> # modified:   include/linux/netfilter/xt_tcpmss.h
> # modified:   include/linux/netfilter_ipv4/ipt_ecn.h
> # modified:   include/linux/netfilter_ipv4/ipt_ttl.h
> # modified:   include/linux/netfilter_ipv6/ip6t_hl.h
> # modified:   net/ipv4/netfilter/ipt_ecn.c
> # modified:   net/netfilter/xt_dscp.c
> # modified:   net/netfilter/xt_hl.c
> # modified:   net/netfilter/xt_rateest.c
> # modified:   net/netfilter/xt_tcpmss.c
> #
> # Untracked files:
> #   (use "git add <file>..." to include in what will be committed)
> #
> # samples/hidraw/ no changes added to commit (use "git add" and/or "git commit -a")
> luke@Macbook-Pro~/Documents/workspace/linuxkernel/linux-2.6$ git
> checkout -- include/linux/netfilter/xt_connmark. h
> luke@Macbook-Pro~/Documents/workspace/linuxkernel/linux-2.6$ git
> status
> # On branch master
> # 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:   include/linux/netfilter/xt_CONNMARK.h
> # modified:   include/linux/netfilter/xt_dscp.h
> # modified:   include/linux/netfilter/xt_mark.h
> # modified:   include/linux/netfilter/xt_rateest.h
> # modified:   include/linux/netfilter/xt_tcpmss.h
> # modified:   include/linux/netfilter_ipv4/ipt_ecn.h
> # modified:   include/linux/netfilter_ipv4/ipt_ttl.h
> # modified:   include/linux/netfilter_ipv6/ip6t_hl.h
> # modified:   net/ipv4/netfilter/ipt_ecn.c
> # modified:   net/netfilter/xt_dscp.c
> # modified:   net/netfilter/xt_hl.c
> # modified:   net/netfilter/xt_rateest.c
> # modified:   net/netfilter/xt_tcpmss.c
> #
> # Untracked files:
> #   (use "git add <file>..." to include in what will be committed)
> #
> # samples/hidraw/ no changes added to commit (use "git add" and/or "git commit -a")
> luke@Macbook-Pro~/Documents/workspace/linuxkernel/linux-2.6$ git
> checkout -- include/linux/netfilter/xt_dscp.h
> luke@Macbook-Pro~/Documents/workspace/linuxkernel/linux-2.6$ git
> status
> # On branch master
> # 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:   include/linux/netfilter/xt_CONNMARK.h
> # modified:   include/linux/netfilter/xt_DSCP.h
> # modified:   include/linux/netfilter/xt_mark.h
> # modified:   include/linux/netfilter/xt_rateest.h
> # modified:   include/linux/netfilter/xt_tcpmss.h
> # modified:   include/linux/netfilter_ipv4/ipt_ecn.h
> # modified:   include/linux/netfilter_ipv4/ipt_ttl.h
> # modified:   include/linux/netfilter_ipv6/ip6t_hl.h
> # modified:   net/ipv4/netfilter/ipt_ecn.c
> # modified:   net/netfilter/xt_dscp.c
> # modified:   net/netfilter/xt_hl.c
> # modified:   net/netfilter/xt_rateest.c
> # modified:   net/netfilter/xt_tcpmss.c
> #
> # Untracked files:
> #   (use "git add <file>..." to include in what will be committed)
> #
> # samples/hidraw/ no changes added to commit (use "git add" and/or "git commit -a")
> luke@Macbook-Pro~/Documents/workspace/linuxkernel/linux-2.6$ 
> 

编辑:

luke@Macbook-Pro~/Documents/workspace/linuxkernel/linux-2.6$ git config -l
user.name=99999
user.email=99999
alias.co=checkout
core.editor=mate -w
core.edit=mate -w
core.excludesfile=/Users/luke/.gitignore_global
difftool.sourcetree.cmd=opendiff "$LOCAL" "$REMOTE"
difftool.sourcetree.path=
mergetool.sourcetree.cmd=/Applications/SourceTree.app/Contents/Resources/opendiff-w.sh "$LOCAL" "$REMOTE" -ancestor "$BASE" -merge "$MERGED"
mergetool.sourcetree.trustexitcode=true
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true

已编辑:这是我的差异文件:

diff --git a/include/linux/netfilter/xt_CONNMARK.h b/include/linux/netfilter/xt_CONNMARK.h
index 2f2e48e..efc17a8 100644
--- a/include/linux/netfilter/xt_CONNMARK.h
+++ b/include/linux/netfilter/xt_CONNMARK.h
@@ -1,6 +1,31 @@
-#ifndef _XT_CONNMARK_H_target
-#define _XT_CONNMARK_H_target
+#ifndef _XT_CONNMARK_H
+#define _XT_CONNMARK_H

-#include <linux/netfilter/xt_connmark.h>
+#include <linux/types.h>

-#endif /*_XT_CONNMARK_H_target*/
+/* Copyright (C) 2002,2004 MARA Systems AB <http://www.marasystems.com>
+ * by Henrik Nordstrom <hno@marasystems.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+enum {
+   XT_CONNMARK_SET = 0,
+   XT_CONNMARK_SAVE,
+   XT_CONNMARK_RESTORE
+};
+
+struct xt_connmark_tginfo1 {
+   __u32 ctmark, ctmask, nfmask;
+   __u8 mode;
+};
+
+struct xt_connmark_mtinfo1 {
+   __u32 mark, mask;
+   __u8 invert;
+};
+
+#endif /*_XT_CONNMARK_H*/
diff --git a/include/linux/netfilter/xt_DSCP.h b/include/linux/netfilter/xt_DSCP.h
index 648e0b3..15f8932 100644
--- a/include/linux/netfilter/xt_DSCP.h
+++ b/include/linux/netfilter/xt_DSCP.h
@@ -1,26 +1,31 @@
-/* x_tables module for setting the IPv4/IPv6 DSCP field
+/* x_tables module for matching the IPv4/IPv6 DSCP field
  *
  * (C) 2002 Harald Welte <laforge@gnumonks.org>
- * based on ipt_FTOS.c (C) 2000 by Matthew G. Marsh <mgm@paktronix.com>
  * This software is distributed under GNU GPL v2, 1991
  *
  * See RFC2474 for a description of the DSCP field within the IP Header.
  *
- * xt_DSCP.h,v 1.7 2002/03/14 12:03:13 laforge Exp
+ * xt_dscp.h,v 1.3 2002/08/05 19:00:21 laforge Exp
 */
-#ifndef _XT_DSCP_TARGET_H
-#define _XT_DSCP_TARGET_H
-#include <linux/netfilter/xt_dscp.h>
+#ifndef _XT_DSCP_H
+#define _XT_DSCP_H
+
 #include <linux/types.h>

-/* target info */
-struct xt_DSCP_info {
+#define XT_DSCP_MASK   0xfc    /* 11111100 */
+#define XT_DSCP_SHIFT  2
+#define XT_DSCP_MAX    0x3f    /* 00111111 */
+
+/* match info */
+struct xt_dscp_info {
    __u8 dscp;
+   __u8 invert;
 };

-struct xt_tos_target_info {
-   __u8 tos_value;
+struct xt_tos_match_info {
    __u8 tos_mask;
+   __u8 tos_value;
+   __u8 invert;
 };

-#endif /* _XT_DSCP_TARGET_H */
+#endif /* _XT_DSCP_H */
diff --git a/include/linux/netfilter/xt_mark.h b/include/linux/netfilter/xt_mark.h
index ecadc40..41c456d 100644
--- a/include/linux/netfilter/xt_mark.h
+++ b/include/linux/netfilter/xt_mark.h
@@ -1,15 +1,6 @@
-#ifndef _XT_MARK_H
-#define _XT_MARK_H
+#ifndef _XT_MARK_H_target
+#define _XT_MARK_H_target

-#include <linux/types.h>
+#include <linux/netfilter/xt_mark.h>

-struct xt_mark_tginfo2 {
-   __u32 mark, mask;
-};
-
-struct xt_mark_mtinfo1 {
-   __u32 mark, mask;
-   __u8 invert;
-};
-
-#endif /*_XT_MARK_H*/
+#endif /*_XT_MARK_H_target */
diff --git a/include/linux/netfilter/xt_rateest.h b/include/linux/netfilter/xt_rateest.h
index d40a619..6605e20 100644
--- a/include/linux/netfilter/xt_rateest.h
+++ b/include/linux/netfilter/xt_rateest.h
@@ -1,37 +1,15 @@
-#ifndef _XT_RATEEST_MATCH_H
-#define _XT_RATEEST_MATCH_H
+#ifndef _XT_RATEEST_TARGET_H
+#define _XT_RATEEST_TARGET_H

由于堆栈溢出长度限制。这里只能复制部分diff文件。

仍然需要帮助

【问题讨论】:

  • 你能在 /linux-2.6 中执行 'git config -l' 并粘贴输出吗?
  • 查看git diff 的输出也不会受到影响。
  • @DavidDegea 我有同样的问题,git reset --hard HEADgit checkout -- . 没有帮助。你解决了吗?
  • 我也遇到过这个问题。

标签: git


【解决方案1】:

git reset --hard HEAD 应该可以解决问题。

【讨论】:

  • 这些更改不是暂存的(因为它们在Changes not staged for commit 下列出),但无论如何硬重置应该可以工作。
  • @KL-7:是的,现在我注意到了。我相应地修改了我的答案。
  • 不工作。另外,我尝试了“git config core.filemode false”,然后重置。还是……
  • 这不是一个好的答案。这是问题的真正原因。
  • 有没有办法只重置修改过的文件(而不是删除的文件)
【解决方案2】:

您也可以使用 clean 删除未跟踪的文件

git clean -f

【讨论】:

    【解决方案3】:

    还有另一种可能性,即问题与文件模式有关。这种情况你可以试试git config core.filemode false

    更多信息:How do I make Git ignore file mode (chmod) changes?

    编辑:

    另一种可能是行尾,尝试设置git config core.autocrlf true|false|input 看看是否有任何不同。

    更多信息:Why should I use core.autocrlf=true in Git?

    【讨论】:

    • 不同问题的几个答案都没有对我有用,但是这个
    【解决方案4】:

    对我来说,这个问题是由不区分大小写的文件系统引起的(例如在 Mac OS 上)。您可以创建一个区分大小写的磁盘映像并将其挂载并在那里进行 git 工作,或者使用不同的操作系统进行开发。

    【讨论】:

      【解决方案5】:

      这是因为 linux 内核包含了同名的文件(但不同的情况):

      include/linux/netfilter/xt_connmark.h 
      include/linux/netfilter/xt_CONNMARK.h
      

      【讨论】:

        【解决方案6】:

        你可以使用:

        git checkout .
        

        要了解git checkoutgit reset 之间的区别,请参阅以下问题:

        What's the difference between "git reset" and "git checkout"?

        【讨论】:

          【解决方案7】:

          问题类似于Strange behaviour of Git: mysterious changes cannot be undone

          您需要一个不区分大小写的文件系统。如果你的电脑和我一样是 Apple MAC,你可以创建区分大小写的磁盘。

          hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 25g ~/android.dmg
          
          hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
          
          # mount the android file image
          function mountAndroid { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; }
          
          # unmount the android file image
          function umountAndroid() { hdiutil detach /Volumes/android; }
          

          【讨论】:

            【解决方案8】:

            通过连续输入这些命令。

            git stash
            git stash drop
            

            git stash 将修改后的文件存储在堆栈中以供以后检索。

            git stash drop 丢弃它们。

            【讨论】:

            • 这样更安全:)
            【解决方案9】:

            恢复:

            修改:具体文件名

            git checkout &lt;specific_filename&gt;

            这比使用git checkout . 一次性删除所有文件更安全。

            【讨论】:

            • 这是正确的答案,删除特定的修改文件。 +1
            【解决方案10】:

            如果您想删除与您的 origin 分支不同的所有文件和修改,但想保留所有被忽略的文件(例如 node_modules、.vscode、.idea 等)最好的选择是结合这两个命令:

             git reset --hard && git clean -f
            

            这将重置所有已修改的文件并清除所有未暂存的文件。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-10-27
              • 2012-08-27
              • 1970-01-01
              • 1970-01-01
              • 2019-08-08
              • 2015-03-08
              • 2012-05-25
              • 1970-01-01
              相关资源
              最近更新 更多