我使用命令错误地将文件添加到 Git :

git add myfile.txt

我还没有执行 git 承诺 。 我如何撤销此操作, 使这些更改不被包含在承诺中 ?


当前回答

此命令将卸载您的更改 :

git reset HEAD filename.txt

您也可以使用

git add -p 

以添加文件的部分。

其他回答

我将使用 git 恢复 -- paged. 或 git 恢复 -- paged < filename >

您也可以使用 git rm -- ccared, 但是, git rm 命令最好用于已经跟踪的文件 。

您想要 :

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 添加从当前工作目录向中转区域( index) 移动到中转区域( index) 的移动 。

这个过程叫做中转。 因此,最自然的指令是 进行修改( 更改过的文件) 。 显而易见的是 :

git stage

git 添加只是 Git 阶段的一种更容易到类型化的别名

可惜没有非舞台或不添加命令。 相关命令更难猜测或记住, 但显而易见:

git reset HEAD --

我们可以很容易地为此创建别名:

git config --global alias.unadd 'reset HEAD --'
git config --global alias.unstage 'reset HEAD --'

最后,我们有了新的命令:

git add file1
git stage file2
git unadd file2
git unstage file1

我个人甚至使用更短的化名:

git a # For staging
git u # For unstaging

在您启动一个新工程时, 避免这个棘手问题的方法 :

为您的新工程创建主目录。 运行 git init 。 现在创建一个. gitignore 文件( 即使它是空的 ) 。 提交您的. gitignore 文件 。

Git 使得您在没有任何承诺的情况下很难重置 git 重置 。 如果您创建了一个小小的初始承诺, 仅是为了创建一个, 之后您可以按您想要的重置- A 和 git 重置多少次, 以便纠正一切 。

这种方法的另一个优点是,如果你以后遇到一连串的麻烦, 需要刷新你所有的文件, 这很容易:

检查此初始承诺 。 这将删除所有您的文件 。 然后再次检查您最近的承诺 。 这将使用您当前的行终结设置, 获取您文件的新副本 。

也许Git已经进化了 自从你提出问题之后

$> git --version
git version 1.6.2.1

现在,你可以试试:

git reset HEAD .

这应该就是你要找的