Git: Teiländerungen übernehmen

Lesezeit: 5 Minuten

Benutzer-Avatar
Tamás Pap

Es gibt mehrere Fragen zu Stack Overflow, die sich mit dem Problem des Bereitstellens und Festschreibens von nur Teilen von Dateien befassen. Ich kann es jedoch nicht zum Laufen bringen.

  • Wie kann ich nur einen Teil einer Datei in git committen

Nehmen wir an, wir wollen eine Dummy-Mathematikklasse in PHP implementieren (die Sprache spielt keine Rolle) mit einigen grundlegenden Methoden wie: add, subtract, multiply und divide.

Beginnen wir mit der Klassendefinition:

<?php
    class Math {
    }
?>

Jetzt:

$ git add math.php
$ git commit -m "Create Math class."

Im nächsten Schritt implementieren wir beides add und subtract vier Methoden:

<?php
    class Math {
        public function add($a, $b) {
            return $a + $b;
        }

        public function subtract($a, $b) {
            return $a - $b;
        }
    }
?>

Aber jetzt wollen wir die Umsetzung der begehen add und die subtract Methoden in separaten Commits.

Ist das möglich?

Was ich versucht habe

$ git add -p

Folgendes erscheint:

Geben Sie hier die Bildbeschreibung ein

Ich würde das Stück gerne in kleinere Stücke teilen, also drücke ich sund Folgendes erscheint:

Geben Sie hier die Bildbeschreibung ein

Es scheint, dass Git es nicht in kleinere Hunks aufgeteilt hat.

Versuchen wir nun, den aktuellen Hunk manuell zu bearbeiten. Also drücke ich: e.

Mein Standard-Texteditor (erhabener Text) wird geöffnet, und hier kann ich den Brocken bearbeiten:

Geben Sie hier die Bildbeschreibung ein

Ich versuche einfach Zeile 8,9,10,11 zu löschen – weil ich nur die inszenieren will add Funktion. Ich speichere, schließe den Editor, aber git sagt:

Your edited hunk does not apply. Edit again (saying "no" discards!) [y/n]?

Ich bin wirklich neu bei git add -p und interaktives Staging, also mache ich vielleicht etwas falsch, oder es ist einfach nicht möglich, was ich will, und hoffe wirklich, dass einige erfahrenere Git-Benutzer eine Anleitung haben, vielleicht auch eine Lösung für mich.

Vielen Dank!

  • Versuchst du, den “Git-Weg” zu lernen, es zu tun? Ich persönlich kümmere mich nicht um solche Details. Ich würde nur eine Funktion entfernen, diese festschreiben, sie wieder hinzufügen und diese festschreiben.

    – TheBuzzSaw

    21. April 2013 um 18:26 Uhr

  • Ja, genau das habe ich in meinem letzten Projekt gemacht. Vielleicht ist das der einfachere Weg. Ich würde es jedoch gerne in Git machen und dann entscheiden, welchen Weg ich wählen möchte.

    – Tamás Pap

    21. April 2013 um 18:27 Uhr

  • mögliches Duplikat von Commit only part of a file in Git

    – 7ochem

    3. April 2015 um 8:31 Uhr

Sie tun genau das, was ich in der Vergangenheit getan habe, und ich habe sogar Ihr gesamtes Experiment auf einem UNIX-Rechner neu erstellt und es hat genau wie erwartet funktioniert.

Ich vermute, Ihr Editor ändert beim Speichern die Zeilenenden im Diff-Hunk.

  • Ich bin wieder da. Ich habe meinen gesamten Editor so eingerichtet, dass Unix-Zeilenenden verwendet werden, und alles funktioniert wie erwartet.

    – Tamás Pap

    22. April 2013 um 20:25 Uhr

  • Jenseits der Linie EndenErhabenes trim_trailing_white_space_on_save Die Einstellung wird auch Diffs unterbrechen, wenn der betreffende Hunk nachgestellte Leerzeichen hat. Es ist standardmäßig deaktiviert, aber vielleicht hat der Fragesteller es aktiviert. So schalten Sie es speziell für Diffs aus: Wenn das Diff zum Bearbeiten geöffnet wurde, wählen Sie Einstellungen -> Einstellungen – Syntaxspezifisch aus der Menüleiste und speichern { "trim_trailing_white_space_on_save": false, } in die Öffnung Diff.sublime-settings Datei.

    – nh2

    6. März 2020 um 22:31 Uhr

Benutzer-Avatar
Chronisch

Dies fühlt sich nicht wie der absolute „Git-Weg“ an, da Git die Befehlszeile liebt, aber ich mache Folgendes:

Git wird mitgeliefert git gui – Sie können es starten, indem Sie nur diesen Befehl ausführen. Dort können Sie Ihre unstagierte Datei auswählen, die Zeilen markieren, die Sie übergeben möchten, und auf „Zeilen zum Übertragen bereitstellen“ klicken. Wenn Sie möchten, dass es sich eher wie ein Befehlszeilentool verhält, können Sie es ausführen git gui citoolwas dazu führt, dass die Benutzeroberfläche geschlossen wird, wenn Sie einen Commit ausführen.

Teilweises Staging mit Git-GUI

Beachten Sie, dass dieses Tool ordnungsgemäß in Git integriert ist. Sie müssen Ihr Commit nicht in dieser Benutzeroberfläche vornehmen. Sie können einfach die relevanten Zeilen inszenieren, schließen, vielleicht noch mehr tun git add und dann über die Kommandozeile committen.

Im Allgemeinen liebe ich die Git-Befehlszeilenschnittstelle und obwohl ich nicht unbedingt ein Shell-Fan bin, habe ich es nach einer Weile einfach geliebt. Ich habe mehrere GUIs ausprobiert und sie alle weggeworfen, weil sie nicht mit der Git-Befehlszeilenschnittstelle konkurrieren können. Aber für git add -p Ich würde definitiv sagen, dass das eine Aufgabe für eine GUI ist. Teilweise Commits durchzuführen ist einfach viel einfacher mit git gui. Gleiches gilt für das Durchsuchen der komplexen Historie. gitk (ebenfalls mit Git ausgeliefert) macht dort einen viel besseren Job als git log --graph -p (solange Sie den Baum wirklich verstehen müssen und sich jetzt nicht mit dem Stand der Geschichte befassen).

Notiz: Aber Sie scheinen immer noch alles richtig zu machen – ich habe versucht, was Sie getan haben, und muss Ben Jackson zustimmen. Das sollte auf jeden Fall funktionieren. Ihr Redakteur muss etwas vermasseln.

Schlussbemerkung: Sie scheinen die Git-Befehlszeile mit den Standardfenstern zu verwenden cmd Terminal. Ich empfehle dringend, zu wechseln Minze. Laden Sie die msys-Version herunter, legen Sie sie in Ihre Program Files\Git\bin Verzeichnis und führen Sie es aus (erstellen Sie eine Verknüpfung) mit mintty -. Dadurch erhalten Sie die gleiche Shell, aber alles besser (insbesondere bessere Größenanpassung und Kopieren und Einfügen).

  • git add -p ist ein traditioneller Git-Weg. Ich habe es immer benutzt und hatte noch nie Probleme. Es könnte nur der Editor sein, der anscheinend nicht die richtigen Zeilenenden hinzufügt, die Git erwartet. Übrigens zu verwenden git gui Unter Windows sollten Sie entweder cygwin oder msys verwenden.

    – Tuxdude

    21. April 2013 um 23:49 Uhr

  • ich weiß das git add -p funktioniert und sollte für das funktionieren, was OP zu erreichen versucht. Mein Punkt ist, dass es einfacher ist, Teile einer Datei zu inszenieren, wenn Sie richtig durch sie scrollen und einzelne Zeilen inszenieren können, ohne zu einem Editor wechseln zu müssen. Und wenn Sie git unter Windows verwenden, dann immer mit cygwin oder msys – git kann aufgrund seiner Shell-Skripte gar nicht nativ auf Windows laufen.

    – Chronisch

    22. April 2013 um 0:52 Uhr

  • Vielen Dank für Ihren ausführlichen Kommentar. Ich habe auch git gui ausprobiert, aber der gleiche Fehler ist aufgetreten. Das Zeilenende war der Schlüssel zur Lösung, wie Ben Jackson und Sie darauf hingewiesen haben. Jetzt funktioniert auch git gui wie erwartet.

    – Tamás Pap

    22. April 2013 um 20:28 Uhr

1187590cookie-checkGit: Teiländerungen übernehmen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy