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

git add myfile.txt

我还没有执行 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添加有两个含义:

将新文件添加到中转区, 然后用 git rm -- checked 文件撤消。 向中转区添加一个修改过的文件, 然后用 git 重置 HEAD 文件撤消 。

如果有疑问,使用

git reset HEAD file

因为它在两种情况下都做了预期的事

警告: 如果您在已修改的文件上做了 git rm -- checked 文件( 之前在仓库中存在过的文件) , 文件将会在 git 承诺时被删除 ! 它将仍然存在于您的文件系统中, 但是如果有其他人拉动您的执行, 文件将会被从工作树上删除 。

git status 会告诉您文件是新文件还是已修改 :

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   my_new_file.txt
    modified:   my_modified_file.txt

使用 git 添加 - i 来从您即将做出的承诺中删除仅添加的文件。 例如 :

添加您不想添加的文件 :

$ git add foo
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   foo
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]#

进入交互式添加以取消您的添加( 这里输入的 git 命令是“ r”( revert) , “ 1”( 列表返回显示的第一个条目) , “ return” 退出返回模式, 以及“ q” ( quit) :

$ git add -i
           staged     unstaged path
  1:        +1/-0      nothing foo

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> r
           staged     unstaged path
  1:        +1/-0      nothing [f]oo
Revert>> 1
           staged     unstaged path
* 1:        +1/-0      nothing [f]oo
Revert>> 
note: foo is untracked now.
reverted one path

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> q
Bye.
$

这就是你的证据 证明"foo"又回到了未追踪的名单上

$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]
#       foo
nothing added to commit but untracked files present (use "git add" to track)
$

要澄清: 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 重置, 它就会返回, 并且它就像您自上次承诺以来从未键入过 git 添加 。 请确认您以前已经承诺过 。

我第一次遇到这个问题时, 我发现这篇文章在这里, 从第一个答案我学到我应该做的是 Git 重置 < filename > , 效果很好 。

最后,我碰巧在我的主 Git 文件夹中有一些子文件夹。 我发现很容易在子文件夹中添加所有文件, 然后重置一些我不想添加的文件 。

现在,我有很多文件和子文件夹。 单次重置是无聊的, 但还是容易添加。 首先, 然后再重置少数重/ 不受欢迎但有用的文件和文件夹 。

我发现以下方法(这里或这里没有记录)比较容易。我希望它能有所帮助:

假设你的情况如下:

Folder/SubFolder1/file1.txt
Folder/SubFolder2/fig1.png
Folder/SubFolderX/fig.svg
Folder/SubFolder3/<manyfiles>
Folder/SubFolder4/<file1.py, file2.py, ..., file60.py, ...>

您想要添加所有文件夹和文件, 但不是 digg1. png, 而不是 SubFolderX, 而不是 file60. py, 而列表还在不断增长...

首先, 制作/ 创建一个 shash shell 脚本并给它命名 。 例如, git_ add. sh :

然后将所有路径添加到所有文件夹和文件, 您想要在 git 重设之前重置所有文件夹和文件 -- 。 您可以随文件列表增长, 很容易地将路径复制到脚本 git_ add.sh。 git_ add.sh 脚本应该像这样看 :

#!/bin/bash

git add .
git reset -- Folder/SubFolder2/fig1.png
git reset -- Folder/SubFolderX
git reset -- Folder/SubFolder4/file60.py

# ! / bin/ bash 很重要 。 然后做源 git_ add. sh 运行它。 在此之后, 您可以执行 git 承诺 - m " some opotion" , 然后再做 git push - u 源主, 如果您已经设置了 Bitbucket/ Github / Github 。

免责声明:我只在Linux测试过这个。


如果您在本地 git 仓库中总是保留很多文件和文件夹, 但是您不想让 Git 添加... , 例如视频和数据文件时跟踪更改, 您必须学习如何使用. gitignore。 也许从这里学习 。