Wie gehe ich damit um, wenn ein laufender Commit plötzlich von einem anderen abzuhängen scheint, der noch nicht vorhanden ist?

13

Ich bin unerfahren mit Git, aber ich versuche mein Bestes, um mich daran zu gewöhnen, und bis jetzt benutze ich es nur für Projekte, an denen ich alleine arbeite.

Wenn ich programmiere, gibt es natürlich einen Top-Down-Ansatz (da ich die Zukunft nicht kenne) und es gibt ein wiederkehrendes Thema:

Ich mache etwas Arbeit.
Ich finde heraus, dass ich, um meine Arbeit in etwas "Verbindliches" zu verwandeln, andere Arbeiten machen muss.
Die andere Arbeit verdient ihren eigenen Einsatz.

Mit etwas Verbindlichem meine ich etwas, das kompiliert oder etwas, das kein totales Chaos ist.
Und von etwas, das sein eigenes Commit verdient, verweise ich darauf, dass ich gelernt habe, dass Commits nur eine Sache tun sollten.

Die Art und Weise, wie ich es auflöse, ist umständlich. Wenn sich die andere Arbeit in einer anderen Datei befindet, erstelle ich eine neue Verzweigung, gebe sie dort ein und füge sie zusammen. Befindet sich die Arbeit in derselben Datei? Ugh? Ich erstelle eine lokale Kopie und versetze die Datei in den HEAD-Status. Führen Sie das erforderliche Commit durch und beginnen Sie dann, meine Arbeit von der Kopie wiederherzustellen. Wie soll ich damit eigentlich umgehen? Ich kann mir nicht vorstellen, dass das so ist, oder? Das nehme ich nicht an, weil es für alle (die zumindest die Zukunft nicht kennen) etwas öfter auftauchen muss. Oder scheint mein Workflow fehlerhaft zu sein?

MasterMastic
quelle
1
Ich befinde mich ziemlich oft in der gleichen Situation, normalerweise beim Hinzufügen von Bibliotheken und Konfigurationen. Ich verwende nur git status, um alle geänderten Dateien zu sehen und zwei oder mehr Festschreibungen zu machen, indem ich git addmit bestimmten Dateien (anstelle von git add --all) arbeite und Stück für Stück festschreibe.
Chris Cirefice
Sie können Teile von Dateien mit auswählen git add -pund dann nur diese Teile festschreiben. Es ist eine sehr mächtige Technik und ich benutze sie fast die ganze Zeit.
Eush77

Antworten:

17

Es gibt mehrere Möglichkeiten, dies zu lösen.

Wenn Sie die Änderungen für das erste Commit vornehmen möchten, ohne Ihre aktuellen Änderungen zu beeinträchtigen, können Sie sie verwenden git stash. Dadurch werden alle offenen Änderungen entfernt, sodass Sie sie später wiederherstellen können. Verwenden Sie, um git statuszu sehen, dass sie nicht mehr vorhanden sind. Erstellen Sie nun das erste Commit, wie Sie es gewohnt sind. Als Nächstes können Sie git stash popIhre ursprünglichen Änderungen wiederherstellen und das zweite Commit erstellen, das Ihre primäre Arbeit erledigt.

Eine andere Möglichkeit wäre, alle erforderlichen Änderungen vorzunehmen und dann zwei Festschreibungen zu erstellen, die beide einen Teil Ihrer Arbeit enthalten. Verwenden Sie dazu den von git bereitgestellten Index (auch als Staging-Bereich bezeichnet). Dies ist ein spezieller Bereich, in dem Sie Commits vorbereiten können. Angenommen, Sie haben mehrere Dateien geändert, können Sie jede mit dem Index hinzufügen git add. Dabei werden git commitnur die zum Index hinzugefügten Dateien festgeschrieben. git statuszeigt Ihnen, welche Teile Ihrer Änderungen übernommen werden und welche nicht. Zum Beispiel sieht es so aus, nachdem die Dateien a.txt, b.txt und c.txt geändert wurden und danach git add a.txt:

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   a.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   b.txt
        modified:   c.txt

Wenn Sie tun , git commitin diesem Zustand nur die Änderungen an a.txt werden hinzugefügt werden , um Ihr zu begehen.

Zusätzlich können Sie die genauen Änderungen, die festgeschrieben werden sollen, mit überprüfen. git diff --cachedDies zeigt Ihnen eine Übersicht aller Änderungen, die festgeschrieben werden sollen.

Wenn eine Datei Änderungen für beide Commits enthält, können Sie dem Index auch nur Teile davon hinzufügen, indem Sie "git add --patch b.txt" verwenden. git bietet Ihnen einen interaktiven Modus, in dem Sie bei jeder Änderung an der angegebenen Datei gefragt werden, ob sie dem Index hinzugefügt werden soll. Dies kann schwieriger werden, wenn Sie Änderungen in den Zeilen nebeneinander haben, die in die beiden Festschreibungen aufgeteilt werden müssen. Es gibt jedoch auch Möglichkeiten, dies zu lösen.

Wenn Sie mehr über den Staging-Bereich erfahren möchten, lesen Sie dies unter http://gitready.com/beginner/2009/01/18/the-staging-area.html

Weitere Informationen zum interaktiven Hinzufügen finden Sie hier: http://nuclearsquid.com/writings/git-add/

Lucash
quelle
5

Wenn Sie eine GUI für Git wie SourceTree von Atlassian oder verwenden git gui, können Sie Teile von Dateien festschreiben und andere Teile nicht festschreiben. Tatsächlich können Sie einzelne Codezeilen festschreiben.

Ich mache das oft, wenn ich in Kaninchenlöcher falle, wie du es beschreibst. Dies ist eine großartige Möglichkeit, dieses sinnvolle Commit oder Commit als Vorläufer des Haupt-Commits zu verwenden.

Sie können dies über die Befehlszeile tun, aber es ist etwas umständlich.

Wenn Sie auf Git-Patch-Ebene und in einzelnen Zeilen ein Commit durchführen können, müssen Sie keine neuen Zweige erstellen, stapeln, festschreiben, stapeln und zusammenführen. Arbeiten Sie einfach weiter und unterbrechen Sie nicht den Fluss. Du hast eine gute Sache am Laufen.

Greg Burghardt
quelle
@ MasterMastic Dies sollte Ihre akzeptierte Antwort sein. Es ist ein verdammter Glücksfall
JesseTG