Ich frage das nur aus Neugier. Es gibt andere Möglichkeiten, um mit dieser Art von Situation im wirklichen Leben umzugehen, aber ich finde das folgende Verhalten von Git etwas seltsam.Rebasing aus dem Versteck, seltsames Ergebnis
Zusammenfassung: Stashing erstellt, hinter dem Vorhang, zwei Commits, eine enthält den Index und die andere die nicht hinzugefügten Bearbeitungen. Wenn wir Letztere auschecken und versuchen, sie zu rebasen, bekommen wir irgendwie nur die Änderungen aus dem Index. Warum das?
Detaillierte Beispiel folgt:
Lassen Sie uns zunächst ein Repo mit einem machen begehen, dann ein mehr bearbeiten, die zum Index hinzugefügt wird, dann ein mehr bearbeiten, die nicht zu Index hinzugefügt wird, und dann verschwinden lassen:
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
So scheint git stash
sowohl den Index als auch die nicht hinzugefügte Bearbeitung als commits mit ihren eigenen Hashes (in meinem Fall 965c986 für Index und 5c00fc0 für die nicht hinzugefügten Bearbeitungen) zu speichern.
nun eine neue Datei bearbeiten und begehen:
echo x >> b.txt
git add b.txt
git commit -m"Second commit"
So alle Commits nun wie folgt aussehen:
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
sagen, dass wir die verstaute Änderungen jetzt nehmen wollen und kombinieren sie mit der zweites Festschreiben. Es gibt auch andere Möglichkeiten, um dies (wie git stash apply
, aber was, wenn wir schon die Stash gereinigt hatten, und dann die von der reflog begehen digged) zu tun, aber sie versucht, nur mit:
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
Aber jetzt, die resultierenden Datei a.txt
ist einfach:
cat a.txt
1
2
das ist die ganze graph ist:
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
So ist es aussieht, auch wenn wir ausgecheckt commit 5c00fc0, das Fütterungsmaterial nur ap die Änderungen aus dem Commit 965c986, d. h. die Editierungen, die im Index waren, als wir uns versteckten. Aber was auch immer in 5c00fc0 war wurde ignoriert.
Frage: Warum ist das? Gibt es eine vernünftige Erklärung für dieses Verhalten? Oder sollte dies als Fehler angesehen werden?
Das erklärt nicht, warum es das Index-Commit ignorieren würde. Bei der Neuzuordnung werden normalerweise die Zusammenführungs-Commits entfernt. Dies bedeutet jedoch nicht, dass der Code, der zusammengeführt wurde, gelöscht wird. – Ilion
Es ignoriert das Index-Commit nicht. –