Sen*_*ess 1109 git git-reset git-rm
有时,git建议git rm --cached
取消暂存文件git reset HEAD file
.我什么时候应该使用哪个?
编辑:
D:\code\gt2>git init
Initialized empty Git repository in D:/code/gt2/.git/
D:\code\gt2>touch a
D:\code\gt2>git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# a
nothing added to commit but untracked files present (use "git add" to track)
D:\code\gt2>git add a
D:\code\gt2>git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: a
#
D:\code\gt2>git commit -m a
[master (root-commit) c271e05] a
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 a
D:\code\gt2>touch b
D:\code\gt2>git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# b
nothing added to commit but untracked files present (use "git add" to track)
D:\code\gt2>git add b
D:\code\gt2>git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: b
#
Run Code Online (Sandbox Code Playgroud)
Rya*_*art 1809
git rm --cached <filePath>
它不会取消暂存文件,它实际上是从repo中删除文件(假设它之前已经提交过),但是将文件留在工作树中(留下未跟踪的文件).
git reset -- <filePath>
将取消暂存给定文件的任何分阶段更改.
也就是说,如果你git rm --cached
在一个新的文件上使用过,那么它基本上看起来就像你刚刚从未提交它一样,因为它之前从未提交过.
man*_*lds 327
git rm --cached
用于从索引中删除文件.在文件已经存在于repo中的情况下,git rm --cached
将从索引中删除该文件,将其保留在工作目录中,并且提交现在也将从repo中删除它.基本上,在提交之后,您将无文件化并保留本地副本.
git reset HEAD file
(默认情况下使用--mixed
标志)不同之处在于,在文件已经存在于repo中的情况下,它将文件的索引版本替换为repo(HEAD)中的文件,从而有效地取消对它的修改.
在无版本文件的情况下,它会取消整个文件的分级,因为HEAD中没有该文件.在这方面git reset HEAD file
和git rm --cached
有相同的,但他们不一样的(如已在回购中的文件的情况进行了说明)
对于这个问题Why are there 2 ways to unstage a file in git?
- 从来没有一种方法可以在git中做任何事情.这就是它的美丽:)
wal*_*ous 120
很简单:
git rm --cached <file>
使git完全停止跟踪文件(将其留在文件系统中,与普通git rm
*不同)git reset HEAD <file>
unstages自上次提交以来对文件所做的任何修改(但不会在文件系统中恢复它们,这与命令名称可能建议的相反**).该文件仍在版本控制之下.如果文件之前没有处于版本控制之下(即你是git add
第一次取消刚刚编辑过的文件),那么这两个命令具有相同的效果,因此它们的外观是"两种做事方式" ".
*请记住@DrewT提到了他的答案,对于警告git rm --cached
,这是一个文件的先前提交到仓库.在这个问题的上下文中,对于刚添加但尚未提交的文件,没有什么可担心的.
**我很害怕一个令人尴尬的长时间使用,因为它的名字的git的复位命令- ,还是在今天,我经常仰望的语法,以确保我不会搞砸.(更新:我终于花时间总结的使用git reset
在tldr页面,所以我现在的它是如何工作的一个更好的心理模型,以及当我忘记一些细节的快速参考.)
Dan*_*der 47
这个线程有点旧,但我仍然想添加一些演示,因为它仍然不是一个直观的问题:
me$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: to-be-added
# modified: to-be-modified
# deleted: to-be-removed
#
me$ git reset -q HEAD to-be-added
# ok
me$ git reset -q HEAD to-be-modified
# ok
me$ git reset -q HEAD to-be-removed
# ok
# or alternatively:
me$ git reset -q HEAD to-be-added to-be-removed to-be-modified
# ok
me$ git status
# On branch master
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: to-be-modified
# deleted: to-be-removed
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# to-be-added
no changes added to commit (use "git add" and/or "git commit -a")
Run Code Online (Sandbox Code Playgroud)
git reset HEAD
(不-q
)给出关于修改文件的警告,其退出代码为1,这将被视为脚本中的错误.
编辑:git checkout HEAD to-be-modified to-be-removed
也适用于取消暂停,但完全从工作区中删除更改
ive*_*ves 35
如果你不小心上演了你不想提交的文件,并且想要确定你保留更改,你也可以使用:
git stash
git stash pop
Run Code Online (Sandbox Code Playgroud)
这将重置为HEAD并重新应用您的更改,允许您重新暂存单个文件以进行提交.如果您忘记为pull requests(git stash ; git checkout -b <feature> ; git stash pop
)创建功能分支,这也很有用.
DEE*_*PAK 28
在 > 2.2 的较新版本中,您可以使用git restore --staged <file_name>
. 请注意,如果您想一次取消暂存(移动到更改)您的文件,请使用上述命令和您的文件名。例如
git restore --staged abc.html
Run Code Online (Sandbox Code Playgroud)
现在,如果您想立即取消暂存所有文件,您可以执行以下操作
git restore --staged .
Run Code Online (Sandbox Code Playgroud)
请注意空格和点(.),这意味着考虑暂存所有文件。
Dre*_*ewT 15
如果有问题的文件已经在repo中且受版本控制(之前已提交等),则这两个命令有几个细微差别:
git reset HEAD <file>
在当前提交中取消暂存文件.git rm --cached <file>
将取消暂存该文件以供将来提交.它是未分阶段的,直到再次添加git add <file>
.还有一个更重要的区别:
git rm --cached <file>
并将分支推送到远程控制器之后,任何从远程控制器拉出分支的人都会从其文件夹中删除文件,即使在本地工作集中文件刚刚未跟踪(即未从文件夹中物理删除).最后一个区别对于包含配置文件的项目非常重要,其中团队中的每个开发人员都有不同的配置(即不同的基本URL,IP或端口设置),因此,如果您使用git rm --cached <file>
任何拉动您的分支的人将不得不手动重新配置创建配置,或者您可以将它们发送给您的配置,并且可以将其重新编辑回其IP设置(等),因为删除只会影响人们从遥控器拉动您的分支.
jim*_*kiz 10
比方说,你stage
通过整个目录git add <folder>
,但要排除来自上演列表中的文件(即运行时产生的列表git status
),并保持已排除的文件中修改(您正在使用的东西,对提交它没有准备好,但你不想失去你的工作......).你可以简单地使用:
git reset <file>
当您运行时git status
,您将看到无论您reset
是哪个文件unstaged
以及您added
仍在staged
列表中的其余文件.
D:\code\gt2>git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: a
Run Code Online (Sandbox Code Playgroud)
(使用"git rm --cached ..."来取消演出)
git是一个指针系统
你还没有提交更改指针的提交
"将文件从指向桶中取出"的唯一方法是删除告诉git监视更改的文件
D:\code\gt2>git commit -m a
[master (root-commit) c271e05] a
0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 a
Run Code Online (Sandbox Code Playgroud)
git commit -ma
D:\code\gt2>git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: b
#
Run Code Online (Sandbox Code Playgroud)
(使用"git reset HEAD ..."来取消演示)
小智 8
取消暂存文件(撤消 git add)
git Restore --staged file.js # 将 file.js 的最新版本从存储库复制到索引
放弃本地更改
git Restore file.js # 将 file.js 从索引复制到工作目录
git Restore file1.js file2.js # 恢复工作目录中的多个文件
git 恢复 . # 放弃所有本地更改(未跟踪的文件除外)
git clean -fd # 删除所有未跟踪的文件
只需使用:
git reset HEAD <filename>
这会取消暂存文件并保留您对其所做的更改,因此您可以反过来,根据需要更改分支,并将git add
这些文件改为另一个分支。保留所有更改。
我很惊讶没有人提到git reflog(http://git-scm.com/docs/git-reflog):
# git reflog
<find the place before your staged anything>
# git reset HEAD@{1}
Run Code Online (Sandbox Code Playgroud)
reflog是一个git历史记录,它不仅跟踪repo的更改,还跟踪用户操作(例如,pull,checkout到不同的分支等)并允许撤消这些操作.因此,不是取消暂停错误播放的文件,而是可以恢复到不放置文件的位置.
这类似于git reset HEAD <file>
但在某些情况下可能更精细.
对不起 - 没有真正回答你的问题,但只是指出另一种方式来取消我经常使用的文件(我非常喜欢Ryan Stewart和waldyrious的回答.);)我希望它有所帮助.
归档时间: |
|
查看次数: |
1008483 次 |
最近记录: |