有时git会建议git rm——cached来取消文件,有时git会重置HEAD文件。什么时候用哪个?
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
#
我很惊讶没有人提到git reflog (http://git-scm.com/docs/git-reflog):
# git reflog
<find the place before your staged anything>
# git reset HEAD@{1}
reflog是一个git历史记录,它不仅跟踪对repo的更改,还跟踪用户的操作(例如。拉,签出到不同的分支等),并允许撤销这些操作。因此,与其取消被错误地暂存的文件,还不如恢复到没有暂存文件的位置。
这类似于git reset HEAD <file>,但在某些情况下可能更细粒度。
抱歉,我并没有真正回答你的问题,只是指出了另一种方法来取消我经常使用的文件(我非常喜欢Ryan Stewart和waldyrious的答案);)我希望这能有所帮助。
我很惊讶没有人提到git reflog (http://git-scm.com/docs/git-reflog):
# git reflog
<find the place before your staged anything>
# git reset HEAD@{1}
reflog是一个git历史记录,它不仅跟踪对repo的更改,还跟踪用户的操作(例如。拉,签出到不同的分支等),并允许撤销这些操作。因此,与其取消被错误地暂存的文件,还不如恢复到没有暂存文件的位置。
这类似于git reset HEAD <file>,但在某些情况下可能更细粒度。
抱歉,我并没有真正回答你的问题,只是指出了另一种方法来取消我经常使用的文件(我非常喜欢Ryan Stewart和waldyrious的答案);)我希望这能有所帮助。
1.
D:\code\gt2>git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: a
(使用“git rm—cached…”取消阶段)
Git是一个指针系统
您还没有要更改指针的提交
“从指向的桶中取出文件”的唯一方法是删除你告诉git观察变化的文件
2.
D:\code\gt2>git commit -m a
[master (root-commit) c271e05] a
0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 a
Git提交-m a
你承诺了,“拯救了”
3.
D:\code\gt2>git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: b
#
(使用“git reset HEAD…”取消舞台)
此时,您在代码中进行了一次提交
现在你可以重置指针指向你提交的"恢复到上次保存"
如果有问题的文件已经在repo中并且处于版本控制之下(以前提交过等),这两个命令有几个微妙的区别:
git reset HEAD <file>取消当前提交的文件。
Git rm——cached <file>将取消该文件以供将来提交。直到git add <file>再次添加它之前,它都是不暂存的。
还有一个更重要的区别:
在运行git rm——cached <file>并将你的分支推到远程,任何从远程拉你的分支的人都会从他们的文件夹中实际删除这个文件,即使在你的本地工作集中,这个文件只是变得不被跟踪(即没有从文件夹中物理删除)。
最后一个区别对于包含配置文件的项目很重要,其中团队中的每个开发人员都有不同的配置(即不同的基本url, ip或端口设置),所以如果你使用git rm——cached <file>,任何拉你的分支的人都必须手动重新创建配置,或者你可以将你的配置发送给他们,他们可以重新编辑回他们的ip设置(等),因为删除只会影响从远程拉你的分支的人。