我使用命令错误地将文件添加到 Git :
git add myfile.txt
我还没跑呢git commit
。我如何撤销这些修改,使这些修改不包含在承诺中?
我使用命令错误地将文件添加到 Git :
git add myfile.txt
我还没跑呢git commit
。我如何撤销这些修改,使这些修改不包含在承诺中?
当前回答
撤消撤消git add
用于未承诺更改的更改 :
git reset <file>
这将将文件从当前索引( “ 即将被承诺” 列表) 中删除, 而不更改其它内容 。
取消所有文件的所有更改 :
git reset
在旧的 Git 版本中,上述命令相当于git reset HEAD <file>
和git reset HEAD
或将失效,如果HEAD
未定义(因为你尚未在仓库中做出任何承诺)或模糊(因为你创建了一个分支,称为:HEAD
这是你不该做的蠢事在Git 1.8.2中更改。,所以在现代版本的 Git 中,你可以使用上面的命令,甚至在你第一次做出承诺之前:
当您在历史中没有任何承诺时, “ 将重置” (没有选项或参数) 用于错误退出, 但它现在给了您一个空索引( 匹配不存在的重置, 您甚至没有在 ) 。
文 件:git 重设
其他回答
缩略git reset
命令帮助您修改中转区域或中转区域以及工作树。 Git 的手工能力与您想要的完全一样,意味着有时需要取消对您所要的修改的修改git add
.
你可以通过拨打电话来做到这一点git reset HEAD <file to change>
。您有两种选择可以完全消除变化。git checkout HEAD <file(s) or path(s)>
是一种快速的方法 来消除改变你的中转区和工作树的改变。
但是要小心这个命令, 因为它会消除你工作树上的所有变化。 Git 根本不知道这些变化, 因为他们从未被执行过。 一旦你执行这个命令, 就没有办法让这些变化回来 。
您可支配的另一个命令是git reset --hard
。它同样会破坏您的工作树,任何未承诺的改变或分阶段的改变在运行后都会丢失。运行中git reset -hard HEAD
做同样的事情git checkout HEAD
。它只是不需要文件或工作路径。
您可以使用--soft
与git reset
。它将存储库重新设置为您指定和分阶段进行所有这些修改的承诺。您已经进行的任何修改都不会受到影响,工作树上的修改也不会受到影响。
最终,你可以使用--mixed
将工作树重置,不进行任何修改。这也将取消任何正在准备的修改。
使用使用git add -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 add
将当前工作目录的更改移动到中转区(索引)。
此进程被称为此进程中 中 中。因此,最自然的命令阶段更改(已修改的文件)是显而易见的:
git stage
git add
是一个简单到类型化的别名git stage
可惜没有git unstage
英git unadd
命令。相关命令更难猜或记,但很明显:
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 add myfile.txt
# 这将将您的文件添加到待发列表中
与这个命令完全相反的是,
git reset HEAD myfile.txt # This will undo it.
因此,您将处于上一个状态。指定的状态将再次出现在未跟踪的列表中(先前的状态)。
它会用指定的文件重置你的头。 所以, 如果您的头没有它意味着, 它只会重置它 。
我第一次遇到这个问题时,发现此员额从这里和从第一个答案 我学到,我应该做的git reset <filename>
它的工作顺利。
最后,我碰巧在我的主 Git 文件夹中 有一些子文件夹。git add .
以在子文件夹中添加所有文件,然后git reset
我并不想添加的少数文件 。
如今我有很多档案和子文件夹git reset
单一个一个,但更简单git add .
首先, 然后重置少数重/ 不受欢迎但有用的文件和文件夹 。
我找到了以下方法(没有记录)在这里或在这里相对容易,我希望会有所帮助:
假设你的情况如下:
Folder/SubFolder1/file1.txt
Folder/SubFolder2/fig1.png
Folder/SubFolderX/fig.svg
Folder/SubFolder3/<manyfiles>
Folder/SubFolder4/<file1.py, file2.py, ..., file60.py, ...>
您想要添加所有文件夹和文件, 但不是fig1.png
,而不是SubFolderX
,而不是file60.py
名单不断增长...
首先,制造/制造bash shell script
并给它一个名字。你说:git_add.sh
:
然后将所有路径添加到所有文件夹和文件git reset
之前的git reset --
。您可以很容易地将路径复制到脚本中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
很重要。 那么source git_add.sh
运行它。 在那之后, 你可以做git commit -m "some comment"
,然后git push -u origin master
如果你已经设置了比特巴基特/吉图布。
免责声明:我只在Linux测试过这个。
如果您在本地 git 仓库中保留了大量文件和文件夹, 但是您不想当您保存时跟踪更改git add .
说视频和数据文件您必须学会如何使用.gitignore
. 可能来自在这里.