Včasih git predlaga git rm --cached
za odstranitev datoteke, včasih pa git reset HEAD file
. Kdaj naj uporabim katero?
EDIT:
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 rm --cached <filepath>
ne odstrani datoteke, ampak dejansko odstrani datoteko(-e) iz repozitorija (ob predpostavki, da je bila že prej oddana), vendar pusti datoteko v vašem delovnem drevesu (ostane vam neprevedena datoteka).
S funkcijo git reset -- <filepath>
se odstavijo vse odložene spremembe za dano(-e) datoteko(-e).
Če bi uporabili git rm --cached
za novo datoteko, ki je postavljena na stopnjo, bi bilo v bistvu videti, kot da ste jo pravkar odstranili s stopnje, saj še nikoli prej ni bila oddana.
git rm --cached
se uporablja za odstranitev datoteke iz indeksa. V primeru, da je datoteka že v repu, git rm --cached
odstrani datoteko iz indeksa in jo pusti v delovnem imeniku, objava pa jo zdaj odstrani tudi iz repa. V bistvu bi po oddaji datoteko razveljavili in ohranili lokalno kopijo.
git reset HEAD file
(ki privzeto uporablja zastavico --mixed
) se razlikuje po tem, da v primeru, ko je datoteka že v repu, zamenja indeksno različico datoteke z različico iz repa (HEAD), s čimer dejansko odpravi spremembe datoteke.
V primeru datoteke brez različice pa se odstrani celotna datoteka, saj je ni bilo v glavi (HEAD). S tega vidika sta git reset HEAD file
in git rm --cached
enaka, vendar nista enaka ( kot je pojasnjeno v primeru datotek, ki so že v repu)
Na vprašanje Kaj sta v sistemu git dva načina za odstranitev datoteke iz reda?
- v sistemu git nikoli ni samo enega načina za karkoli. v tem je njegova lepota :)
Ta nit je nekoliko stara, vendar bi še vedno rad dodal malo demonstracije, saj to še vedno ni intuitiven problem:
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")
git reset HEAD
(brez -q
) poda opozorilo o spremenjeni datoteki in njegova izstopna koda je 1, kar se v skripti šteje za napako.
Edit: git checkout HEAD to-be-modified to-be-removed
prav tako deluje za umik, vendar spremembo v celoti odstrani iz delovnega prostora
Posodobitev git 2.23.0: Od časa do časa se ukazi spremenijo. Zdaj git status
pravi:
(use "git restore --staged <file>..." to unstage)
... kar deluje za vse tri vrste sprememb