我使用命令错误地将文件添加到 Git :
git add myfile.txt
我还没有执行 git 承诺 。 我如何撤销此操作, 使这些更改不被包含在承诺中 ?
我使用命令错误地将文件添加到 Git :
git add myfile.txt
我还没有执行 git 承诺 。 我如何撤销此操作, 使这些更改不被包含在承诺中 ?
当前回答
您想要 :
git rm --cached <added_file_to_undo>
理由:
当我刚开始做这个的时候,我第一次尝试
git reset .
(取消我最初添加的全部内容), 只是为了得到这个(不是这样的)有用信息:
fatal: Failed to resolve 'HEAD' as a valid ref.
结果发现,这是因为 HEAD ref (blanch?) 直到第一次承诺之后才存在。 这就是说,你会遇到跟我一样的初学者的问题, 如果你的工作流程像我的一样, 像是:
cd to my great new project directory to try out Git, the new hotness git init git add . git status ... lots of crap scrolls by ... => Damn, I didn't want to add all of that. google "undo git add" => find Stack Overflow - yay git reset . => fatal: Failed to resolve 'HEAD' as a valid ref.
邮件列表上记录了一个窃听器 记录了这个无益之处
正确的解决方案就在 Git 状态输出中( 是的, 我将它伪装成“ 废话 ” ) 。
... # 将要执行的修改 : # (使用“ git rm -- cashed < file >...” 来取消)...
事实上,解决办法是使用Git rm -- cashed FILE。
在此注意其它处的警告 - git rm 删除您本地的文件工作副本, 但如果您使用 -- cashed , 则不使用。 这是 Git help rm 的结果 :
--cached 使用此选项来卸载和从索引中删除路径。 工作树文件, 不论是否修改, 都会被左移 。
我开始使用
git rm --cached .
以删除所有内容并重新开始。 虽然没有成功, 因为添加. 是循环的, 结果显示 Rm 需要 - r 循环。 叹息 。
git rm -r --cached .
好了,我现在回到我开始的地方。下次我要用...
git add -n .
我把所有东西都拉到一个安全的地方,
其他回答
还有一个互动模式:
git add -i
选择 选项 3 到 取消 添加文件 。 在我的情况中, 我通常要添加多个文件, 用交互模式, 您可以使用这样的数字来添加文件 。 这将除 4: 1, 1, 2, 3, 和 5 以外, 全部要用这个数字来添加文件 : 1, 2, 3 和 5
要选择一个序列, 只要类型 1-5 就可以从 1 到 5 全部取出 。
Git 中转文件
取消对未承诺更改的修改的 git 添加 :
git reset <file>
这将将文件从当前索引( “ 即将被承诺” 列表) 中删除, 而不更改其它内容 。
取消所有文件的所有更改 :
git reset
在旧版本的 Git 中, 上述命令分别相当于 git 重置 HEAD < file > 和 git 重置 HEAD, 如果 HEAD 未定义( 因为您尚未在仓库中做出任何承诺) 或含糊不清( 因为您创建了一个名为 HEAD 的分支, 这是您不应该做的蠢事 ) , 则上述命令将失败。 但是, 在 Git 1.8. 2 中, 这被更改了 。 因此, 在现代版本的 Git 中, 您可以在第一次承诺之前使用上面的命令 :
当您在历史中没有任何承诺时, “ 将重置” (没有选项或参数) 用于错误退出, 但它现在给了您一个空索引( 匹配不存在的重置, 您甚至没有在 ) 。
文献资料:Git重置
请注意,如果您没有指定修改,则必须包含一个分隔符。例如,我的控制台:
git reset <path_to_file>
fatal: ambiguous argument '<path_to_file>': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
git reset -- <path_to_file>
Unstaged changes after reset:
M <path_to_file>
(1.7.5.4版总版)
在您启动一个新工程时, 避免这个棘手问题的方法 :
为您的新工程创建主目录。 运行 git init 。 现在创建一个. gitignore 文件( 即使它是空的 ) 。 提交您的. gitignore 文件 。
Git 使得您在没有任何承诺的情况下很难重置 git 重置 。 如果您创建了一个小小的初始承诺, 仅是为了创建一个, 之后您可以按您想要的重置- A 和 git 重置多少次, 以便纠正一切 。
这种方法的另一个优点是,如果你以后遇到一连串的麻烦, 需要刷新你所有的文件, 这很容易:
检查此初始承诺 。 这将删除所有您的文件 。 然后再次检查您最近的承诺 。 这将使用您当前的行终结设置, 获取您文件的新副本 。
git 重置命令有助于您修改中转区或中转区和工作树。 Git 的手工能力与您想要的完全一样,意味着您有时需要取消对您用 Git 添加的修改的更改 。
您可以通过调用 git 重置 HEAD < file to change > 来做到这一点。 您有两个选项可以完全清除更改。 git checkout HEAD < file (s) 或 path(s) > 是撤销您中位区域和工作树的更改的快速方法 。
但是要小心这个命令, 因为它会消除你工作树上的所有变化。 Git 根本不知道这些变化, 因为他们从未被执行过。 一旦你执行这个命令, 就没有办法让这些变化回来 。
您可支配的另一个命令是 git 重置 -- hard 。 它同样会破坏您的工作树, 任何未承诺的更改或分阶段更改在运行后都会丢失。 正在运行 git 重置 - HEAD 和 git 检查退出 HEAD 一样。 它不需要文件或工作路径 。
您可以使用 -- 软化的 git 重置。 它重新将仓库设置为您指定的所有更改, 并分阶段进行这些更改。 您已经进行的任何更改都不会受到影响, 您的工作树上的更改也不会受到影响 。
最后, 您可以使用 -- mixed 来重置工作树而不进行任何修改 。 这也可以取消任何正在准备的修改 。