Lo chiedo solo per curiosità. Ci sono altri modi per affrontare questo tipo di situazione nella vita reale, ma trovo il seguente comportamento di git un po 'strano.Rifondazione dallo stash, risultato strano
Sommario: Sommario: lo stivaggio crea, dietro la tenda, due commit, uno contiene l'indice e l'altro le modifiche non aggiunte. Se eseguiamo il checkout di quest'ultimo e proviamo a rebase, in qualche modo otteniamo solo i cambiamenti dall'indice. Perché?
esempio dettagliata segue:
Prima facciamo un pronti contro termine con un commesso, poi un altro di modifica che viene aggiunto all'indice, poi un altro di modifica che non viene aggiunto all'indice, e poi riporre:
git init
echo 1 > a.txt
git add a.txt
git commit -m"First commit"
echo 2 >> a.txt
git add a.txt
echo 3 >> a.txt
git stash
git log --all --graph --oneline
* 5c00fc0 WIP on master: c8af537 First commit
|\
| * 965c986 index on master: c8af537 First commit
|/
* c8af537 First commit
Quindi git stash
sembra salvare sia l'indice che la modifica non aggiunta come commit con i propri hash (nel mio caso, 965c986 per l'indice e 5c00fc0 per le modifiche non aggiunte).
Ora modificare un nuovo file e si impegnano:
echo x >> b.txt
git add b.txt
git commit -m"Second commit"
Così tutti i commit apparire così:
git log --all --graph --oneline
* b589f50 Second commit
| * 5c00fc0 WIP on master: c8af537 First commit
| |\
|//
| * 965c986 index on master: c8af537 First commit
|/
* c8af537 First commit
Dire, ora vogliono prendere le modifiche stashed e combinarle con la secondo impegno. Ci sono altri modi per fare questo (come git stash apply
, ma cosa succede se avevamo già ripulito la scorta, e poi scavato il commit dalla reflog), ma diciamo basta provare con:
git checkout 5c00fc0
[warning message here]
cat a.txt
1
2
3
git rebase master
First, rewinding head to replay your work on top of it...
Applying: index on master: c8af537 First commit
Ma ora, il file risultante a.txt
è solo:
cat a.txt
1
2
questo è l'intero grafo:
git log --all --graph --oneline
* 5fc3ade index on master: c8af537 First commit
* b589f50 Second commit
| * 5c00fc0 WIP on master: c8af537 First commit
| |\
|//
| * 965c986 index on master: c8af537 First commit
|/
* c8af537 First commit
Quindi sembra che, anche se abbiamo controllato commit 5c00fc0, l'unica rebase ap applicato i cambiamenti dal commit 965c986, cioè le modifiche che erano nell'indice quando abbiamo nascosto. Ma qualunque cosa fosse in 5c00fc0 è stata ignorata.
Domanda: Perché è? C'è qualche spiegazione ragionevole per questo comportamento? O dovrebbe essere considerato un bug?
Questo non spiega perché ignorerebbe il commit dell'indice. Il rebasing di solito rimuove i commit di unione, ma ciò non significa che rimuova il codice che è stato unito. – Ilion
Non ignora il commit dell'indice. –