Der Git-Leitfaden für Fortgeschrittene: Git Stash, Reset, Rebase und mehr

Veröffentlicht: 2022-03-11

Jeder Entwickler sollte ein gutes Verständnis der Versionskontrolle haben, und Git ist zum De-facto-Standard für die Versionskontrolle in der Softwareentwicklung geworden.

Oft lernen Entwickler jedoch nur ein paar einfache Befehle und übersehen die Leistungsfähigkeit des Git-Verlaufs und die anderen Dinge, die Git tun kann, um Sie viel effizienter zu machen. Beispielsweise ist die Verwaltung von Releases mit Git mithilfe von git tag sehr einfach.

Ich habe einen Fortgeschrittenenkurs in Git online (mit Github) belegt und anschließend einen Git-Kurs für Anfänger in Verbindung mit Github unterrichtet. Als ich bemerkte, dass es nicht viele technische Artikel zu meinen bevorzugten Git-Features gab, ergriff ich die Gelegenheit, sie mit meinen Entwicklerkollegen zu teilen. In diesem Beitrag erfahren Sie, wie Sie die folgenden erweiterten Git-Funktionen nutzen können:

  • git stash , wodurch Ihr Code vorübergehend lokal gespeichert wird
  • git reset , mit dem Sie Ihren Code aufräumen können, bevor Sie einen Commit durchführen
  • git bisect , eine Funktion, mit der Sie schlechte Commits ausfindig machen können
  • git squash , mit dem Sie Ihre Commits kombinieren können
  • git rebase , wodurch Änderungen von einem Zweig auf einen anderen angewendet werden können

Git Stash

Git Stash ermöglicht es Ihnen, Ihren Code zu speichern, ohne einen Commit zu machen. Wie ist das nützlich? Stellen Sie sich folgendes Szenario vor:

Sie haben bereits drei saubere und ordentliche Commits durchgeführt, aber Sie haben auch noch nicht festgeschriebenen Code, der ziemlich chaotisch ist; Sie möchten es nicht festschreiben, ohne zuerst Ihren Debugging-Code zu entfernen. Dann müssen Sie sich aus irgendeinem Grund plötzlich einer anderen Aufgabe widmen und den Zweig wechseln. Dies kann häufig passieren, wenn Sie sich in Ihrem main befinden und vergessen haben, einen neuen Zweig für Ihr Feature zu erstellen. Im Moment sieht Ihr Code so aus:

 $ git status On branch my-feature 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: css/common.scss no changes added to commit (use "git add" and/or "git commit -a")
 $ git diff diff --git a/css/common.scss b/css/common.scss index 2090cc4..90fd457 100644 --- a/css/common.scss +++ b/css/common.scss @@ -13,6 +13,6 @@ body { font-family: "Proxima Nova", Arial, sans-serif; font-size: 13px; - color: #333; + color: red; background-color: #f00; }

Wenn Sie git stash ausführen, verschwindet der nicht festgeschriebene Code, ohne festgeschrieben zu werden. Stashing ist wie das Speichern eines temporären lokalen Commits in Ihrem Branch. Es ist nicht möglich, einen Stash in ein entferntes Repository zu verschieben, daher ist ein Stash nur für Ihren persönlichen Gebrauch bestimmt.

 $ git stash Saved working directory and index state WIP on my-feature: 49ee696 Change text color

Ihr Branch erscheint jetzt so, wie Sie es bei Ihrem letzten Commit gemacht haben. Jetzt können Sie Zweige sicher ändern, ohne Ihren Code zu verlieren oder einen unordentlichen Commit zu haben. Wenn Sie zurück zu Ihrem Zweig wechseln und git stash list ausführen, sehen Sie eine Liste mit Stashes, die ungefähr so ​​​​aussehen:

 $ git stash list stash@{0}: WIP on my-feature: 49ee696 Change text color

Sie können den zwischengespeicherten Inhalt einfach erneut anwenden, indem Sie git stash apply . Sie können auch einen bestimmten Stash anwenden (wenn Sie mehr als einmal gestasht haben), indem Sie git stash apply stash@{1} (die '1' steht für den vorletzten Stash). Hier ist ein Beispiel für das Stashing von mehr als einem Commit und die Anwendung eines anderen Stashs:

 $ git diff diff --git a/css/common.scss b/css/common.scss index 2090cc4..90fd457 100644 --- a/css/common.scss +++ b/css/common.scss @@ -13,6 +13,6 @@ body { font-family: "Proxima Nova", Arial, sans-serif; font-size: 13px; - color: #333; + color: red; background-color: #f00; } $ git stash Saved working directory and index state WIP on my-feature: 49ee696 Change text color $ git diff diff --git a/css/common.scss b/css/common.scss index 2090cc4..b63c664 100644 --- a/css/common.scss +++ b/css/common.scss @@ -13,6 +13,6 @@ body { font-family: "Proxima Nova", Arial, sans-serif; font-size: 13px; - color: #333; + color: red; background-color: #f00; } $ git stash Saved working directory and index state WIP on my-feature: 49ee696 Change text color
 $ git stash list stash@{0}: WIP on my-feature: 49ee696 Change text color stash@{1}: WIP on my-feature: 49ee696 Change text color stash@{2}: WIP on my-feature: 49ee696 Change text color $ git stash apply stash@{2} On branch my-feature 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: css/common.scss no changes added to commit (use "git add" and/or "git commit -a")

git stash apply stash@{2} hat den ältesten versteckten Code angewendet, als wir die Farbe des Textes auf Rot geändert haben.

 $ git diff diff --git a/css/common.scss b/css/common.scss index 2090cc4..90fd457 100644 --- a/css/common.scss +++ b/css/common.scss @@ -13,6 +13,6 @@ body { font-family: "Proxima Nova", Arial, sans-serif; font-size: 13px; - color: #333; + color: red; background-color: #f00; }

Wenn Sie sich entscheiden, Ihre Arbeit nicht festzuschreiben, nachdem Sie den Stash wiederhergestellt haben, können Sie git checkout . , wodurch der gesamte nicht festgeschriebene Code zurückgesetzt wird.

Als weiteres Beispiel für die Verwendung von Git Stash: Angenommen, Sie haben einige neue Dateien, von denen eine einen Fehler aufweist. Lassen Sie alle außer der Datei mit dem vermuteten Fehler unstaged (Code muss gestagt werden, um zwischengespeichert zu werden), dann können Sie diese Datei zwischenspeichern und das Problem beheben. Wenn die Stash-Datei nicht das Problem war, können Sie den Stash wiederherstellen.

 $ git status On branch my-feature Untracked files: (use "git add <file>..." to include in what will be committed) css/colors.scss nothing added to commit but untracked files present (use "git add" to track)
 $ git add css/colors.scss $ git stash Saved working directory and index state WIP on my-feature: 0d8deef delete colors $ git status On branch my-feature nothing to commit, working tree clean $ git stash apply stash@{0} On branch my-feature Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: css/colors.scss

Sie können Ihre gestashed Commits auch in einen neuen Feature-Branch oder Debugging-Branch übertragen, indem Sie git stash branch verwenden:

 $ git status On branch my-feature 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: css/common.scss no changes added to commit (use "git add" and/or "git commit -a") $ git stash Saved working directory and index state WIP on my-feature: 66f3f3b Add colors file $ git stash branch debugging-branch M css/common.scss Switched to a new branch 'debugging-branch' Unstaged changes after reset: M css/common.scss On branch debugging-branch 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: css/common.scss Dropped refs/stash@{0} (d140624f60d8deef7bceb0d11fc80ed4fd47e0a1)

Beachten Sie, dass, wenn Sie einen Stash angewendet haben, der Stash nicht gelöscht wird. Sie können Stashes einzeln entfernen, indem Sie git drop verwenden, oder alle Stashes entfernen, indem Sie git stash clear verwenden:

 $ git stash list stash@{0}: WIP on my-feature: 66f3f3b Add colors file stash@{1}: WIP on my-feature: 0d8deef delete colors stash@{2}: WIP on my-feature: 49ee696 Change text color $ git stash drop stash@{2} Dropped stash@{2} (8ed6d2ce101aa2e28c8ccdc94cb12df8e5c468d6) $ git stash list stash@{0}: WIP on my-feature: 66f3f3b Add colors file stash@{1}: WIP on my-feature: 0d8deef delete colors $ git stash clear $ git stash list $

Git-Reset

Wenn Sie sich in einer Situation befinden, in der Sie versehentlich einen unordentlichen Code übertragen haben, können Sie einen „weichen“ Reset durchführen. Das bedeutet, dass der Code so aussieht, als wäre er noch nicht festgeschrieben worden. Dann können Sie Ihren Code in Ihrer IDE aufräumen, bevor Sie einen saubereren Commit durchführen. Dazu können Sie git reset --soft HEAD~1 . Dadurch wird der letzte Commit zurückgesetzt. Sie können mehr als einen Commit zurücksetzen, indem Sie die Zahl nach ~ zB git reset --soft HEAD~2 .

 $ git reset --soft HEAD~1 $ git status On branch debugging-branch Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: css/common.scss 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: css/common.scss
 $ git diff diff --git a/css/common.scss b/css/common.scss index 2090cc4..90fd457 100644 --- a/css/common.scss +++ b/css/common.scss @@ -13,6 +13,6 @@ body { font-family: "Proxima Nova", Arial, sans-serif; font-size: 13px; - color: $grey; + color: red; background-color: #f00; }

Das Zurücksetzen von Git ist etwas verwirrender, insbesondere wenn neue Git-Benutzer unterrichtet werden. Ein Soft-Reset sollte für einen echten Fehler reserviert werden, während ein Stash zum Austauschen von Code verwendet werden kann.

Sie können auch einen Hard-Reset durchführen ( git reset --hard HEAD~1 ). Diese Art des Zurücksetzens löscht im Wesentlichen Ihren letzten Commit. Sie sollten beim Durchführen von Hard-Resets sehr vorsichtig sein, insbesondere wenn Sie Ihren Zweig pushen, da es keine Möglichkeit gibt, Ihr Commit wiederherzustellen.

Git Bisect

Mein Lieblings-Git-Tool ist git bisect . Ich habe es nur ein paar Mal gebraucht, aber wenn ich es tat, war es von unschätzbarem Wert! Ich habe es hauptsächlich bei großen Codebasen verwendet, bei denen es ein Problem gab, für das niemand die Ursache gefunden hat, selbst nach einigem intensiven Debugging.

git bisect führt im Wesentlichen eine binäre Suche zwischen zwei gegebenen Commits durch und präsentiert Ihnen dann die Details eines bestimmten Commits. Sie müssen Git zuerst einen guten Commit geben, bei dem Sie wissen, dass Ihre Funktionalität funktioniert hat, und einen schlechten Commit. Beachten Sie, dass, solange Sie einen guten und einen schlechten Commit haben, die Commits Jahre auseinander liegen können (obwohl es umso schwieriger wird, je weiter Sie in der Zeit zurückgehen!).

Das Spannendste an git bisect ist, dass Sie normalerweise nicht wirklich wissen, wer den fehlerhaften Commit geschrieben hat, wenn Sie anfangen. Die Aufregung, herauszufinden, wo der Fehler eingeführt wurde, hat mehr als einmal dazu geführt, dass sich ein paar Kollegen um meinen Computer gedrängt haben!

Schauen Sie sich zunächst den Buggy-Zweig an und finden Sie die guten Commits. Sie müssen Ihren Commit-Verlauf durchgehen und den Commit-Hash finden, dann diesen spezifischen Commit überprüfen und Ihren Zweig testen. Sobald Sie einen guten und einen schlechten Platz zum Arbeiten gefunden haben, können Sie einen git bisect ausführen.

In diesem Szenario ist der Text auf dieser von uns erstellten Website rot (obwohl er einen UI-Designer verwenden könnte), aber wir wissen nicht, wie oder wann er rot gemacht wurde. Dies ist ein sehr einfaches Beispiel, in einem realen Szenario hätten Sie wahrscheinlich ein viel weniger offensichtliches Problem, z. B. ein Formular, das nicht gesendet/funktioniert.

Wenn wir ein git log ausführen, können wir die Liste der Commits sehen, aus der wir auswählen können.

 $ git log commit a3cfe7f935c8ad2a2c371147b4e6dcd1a3479a22 (HEAD -> main) Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:52:57 2021 +0100 Update .gitignore file for .DS_Store commit 246e90977790967f54e878a8553332f48fae6edc Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:51:23 2021 +0100 Change styling of page commit d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:50:48 2021 +0100 Change text color commit 032a41136b6653fb9f7d81aef573aed0dac3dfe9 Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:42:57 2021 +0100 Change text color commit 246e90977790967f54e878a8553332f48fae6edc Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:41:23 2021 +0100 delete colors commit d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:50:48 2021 +0100 Change text color commit ce861e4c6989a118aade031020fd936bd28d535b Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:07:36 2021 +0100 ...

Wenn ich meine Webseite mit dem letzten Commit-Hash öffne, ist der Text rot, also weiß ich, dass ich ein Problem habe.

Git bisect, Schritt 1: eine Webseite mit rotem Text.

Jetzt starten wir die Halbierung und teilen Git mit, dass wir einen schlechten Commit haben.

 $ git bisect start $ git bisect bad 8d4615b9a963ef235c2a7eef9103d3b3544f4ee1

Jetzt gehen wir in der Zeit zurück, um zu versuchen, einen Commit zu finden, bei dem der Text nicht rot war. Hier versuche ich, mein erstes Commit auszuprobieren…

 $ git checkout ce861e4c6989a118aade031020fd936bd28d535b Note: checking out 'ce861e4c6989a118aade031020fd936bd28d535b'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name> HEAD is now at ce861e4 Add CSS styles

…und aktualisieren Sie die Webseite…

Git bisect, Schritt 2: eine Webseite mit schwarzem Text.

Der Text ist nicht mehr rot, das ist also ein guter Commit! Je neuer das Commit ist, dh je näher am schlechten Commit, desto besser:

 $ git checkout d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e Previous HEAD position was ce861e4c6989a118aade031020fd936bd28d535b Add CSS styles HEAD is now at d647ac4 Change text color

Git teilt Ihnen nun mit, wie viele Commits es durchsuchen muss, bevor es das richtige findet. Die Anzahl der Commits, die Git durchläuft, hängt davon ab, wie viele Commits zwischen dem guten und dem schlechten Commit liegen (je länger die Zeitspanne, desto öfter muss Git iterieren).

Jetzt müssen Sie Ihren Zweig erneut testen und sehen, ob Ihr Problem verschwunden ist. Manchmal kann dies etwas umständlich sein, wenn Sie Module regelmäßig aktualisieren, da Sie möglicherweise Knotenmodule in Ihrem Front-End-Repository neu installieren müssen. Wenn es Datenbankaktualisierungen gegeben hat, müssen Sie diese möglicherweise ebenfalls aktualisieren.

git bisect automatisch einen Commit zwischen guten und schlechten Commits aus. Hier wird ein Schritt geschätzt, um den schlechten Commit zu finden.

 $ git bisect good 1cdbd113cad2f452290731e202d6a22a175af7f5 Bisecting: 1 revision left to test after this (roughly 1 step) [ce861e4c6989a118aade031020fd936bd28d535b] Add CSS styles $ git status HEAD detached at ce861e4 You are currently bisecting, started from branch '8d4615b'. (use "git bisect reset" to get back to the original branch)

Aktualisieren Sie die Seite und prüfen Sie, ob Ihr Problem behoben ist. Das Problem besteht immer noch, also teilen wir Git mit, dass dies immer noch ein schlechter Commit ist. Diesmal muss nicht auf den Commit-Hash verwiesen werden, da Git den Commit verwendet, den Sie ausgecheckt haben. Wir müssen diesen Vorgang wiederholen, bis Git alle möglichen Schritte durchlaufen hat.

 $ git bisect bad Bisecting: 0 revisions left to test after this (roughly 0 steps) [cbf1b9a1be984a9f61b79ae5f23b19f66d533537] Add second paragraph to page

Aktualisieren Sie die Seite und unser Problem ist wieder verschwunden, also ist dies ein guter Commit:

Git bisect, Schritt 3: Dieselbe Webseite mit etwas zusätzlichem schwarzen Text.

An diesem Punkt hat Git den ersten schlechten Commit gefunden:

 $ git bisect good ce861e4c6989a118aade031020fd936bd28d535b is the first bad commit commit ce861e4c6989a118aade031020fd936bd28d535b Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:52:57 2021 +0100 Add CSS styles :000000 100644 0000000000000000000000000000000000000000 092bfb9bdf74dd8cfd22e812151281ee9aa6f01a M css

Jetzt können wir git show verwenden, um den Commit selbst anzuzeigen und das Problem zu identifizieren:

 $ git show ce861e4c6989a118aade031020fd936bd28d535b commit ce861e4c6989a118aade031020fd936bd28d535b Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:52:57 2021 +0100 Add CSS styles diff --git a/css/base.scss b/css/base.scss index e69de29..26abf0f 100644 --- a/css/base.scss +++ b/css/base.scss @@ -1,7 +1,7 @@ body { background-color: $white; margin: 0px; line-height: 20px; - color: $grey; + color: red; }

Wenn Sie fertig sind, können Sie git bisect reset ausführen, um Ihren Zweig in seinen normalen Betriebszustand zurückzusetzen.

Je näher die Commits beieinander liegen, desto einfacher kann Git das Problem finden, aber ich habe es zuvor 10 Schritte machen lassen und den fehlerhaften Commit immer noch leicht gefunden. Es ist nicht garantiert, dass es funktioniert, aber es hat das Problem die meiste Zeit für mich gefunden. Herzlichen Glückwunsch, jetzt bist du ein Code-Archäologe!

Zerquetschen Sie Ihre Verpflichtungen

Ich habe zuvor Vollzeit an einem Open-Source-Projekt für eine globale Organisation gearbeitet und schnell gelernt, wie wichtig es ist, Ihre Commits zu komprimieren – oder zu kombinieren. Ich denke, es ist eine ausgezeichnete Angewohnheit, sich anzugewöhnen, auch wenn Ihr Arbeitgeber es nicht verlangt. Dies ist besonders hilfreich für andere Entwickler, die später von Ihnen erstellte Features überprüfen und bearbeiten müssen.

Warum Ihre Commits kürzen?

  • Es ist einfacher für Mitwirkende an Ihrem Repository zu lesen. Stellen Sie sich vor, Sie hätten eine Commit-Liste wie diese:
    • Karussell-Slider implementieren
    • Fügen Sie Styling zum Karussell hinzu
    • Schaltflächen zum Karussell hinzufügen
    • Seltsames Problem im IE mit Karussell behoben
    • Passen Sie die Ränder im Karussell an

    Es ist viel einfacher, diese in einem einzigen Commit zusammenzufassen, das sagt: „Karussell zur Homepage hinzufügen“.

  • Es ermutigt Sie, Ihre Commit-Nachrichten verständlich und relevant zu halten, wenn Sie jedes Mal, wenn Sie eine Pull-Anforderung stellen, Ihre Commits in eine quetschen müssen. Wie oft haben Sie einen Commit mit dem Titel „WIP“, „Bugfix für Anmeldeseite“ oder „Fix Tippfehler“ gesehen? Es ist wichtig, relevante Commit-Namen zu haben, z. B. „Bugfix für #444-Anmeldeseite - Flimmern aufgrund fehlender $scope-Funktion behoben“.

Ein Grund, warum Sie Ihre Commits nicht quetschen möchten, könnte sein, dass Sie an einem sehr detaillierten und langwierigen Feature arbeiten und einen täglichen Verlauf für sich behalten möchten, falls Sie später auf Fehler stoßen. Dann ist Ihr Feature einfacher zu debuggen. Wenn Sie Ihr Feature jedoch in Ihren Hauptzweig einchecken und sicher sind, dass es fehlerfrei ist, ist es immer noch sinnvoll, es zu squashen.

In diesem Szenario habe ich fünf Commits vorgenommen, aber alle beziehen sich auf ein Feature. Meine Commit-Nachrichten sind auch zu eng mit der Trennung von Verdiensten verbunden – bei allen meinen Commits geht es darum, die Seite für diese neue Funktion zu gestalten:

 $ git log commit a8fbb81d984a11adc3f72ce27dd0c39ad24403b7 (HEAD -> main) Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 11:16:10 2021 +0100 Import colors commit e2b3ddd5e8b2cb1e61f88350d8571df51d43bee6 Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 11:15:32 2021 +0100 Add new color commit d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:50:48 2021 +0100 Change text color commit c005d9ceeefd4a8d4e553e825fa40aaafdac446e Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 09:59:57 2021 +0100 Add CSS styles commit 9e046b7df59cef07820cc90f694fabc666731bd2 Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 09:56:28 2021 +0100 Add second paragraph to page commit 5aff973577d67393d914834e8af4c5d07248d628 Author: Ursula Clarke <[email protected]> Date: Mon Jan 10 16:04:22 2021 +0100 Add colors CSS file and edit background color

Sie können auch git merge --squash , aber ich denke, es ist klarer, rebase zu verwenden, da es einfacher ist, die Commit-Beschreibung zu sehen, wenn Sie Ihre Commits aussuchen. Wenn Sie git merge --squash , müssen Sie zuerst einen Hard-Reset Ihrer Commits durchführen ( git reset --hard HEAD~1 ), und es ist leicht, die genaue Anzahl der Commits zu verwechseln, mit denen Sie dies tun müssen. Ich finde git rebase visueller.

Beginnen Sie mit dem Ausführen von git rebase -i --root und Ihr Standard-Texteditor in der Befehlszeile wird mit Ihrer Liste von Commits geöffnet:

 pick eb1eb3c Update homepage pick 5aff973 Add colors CSS file and edit background color pick 9e046b7 Add second paragraph to page pick c005d9c Add CSS styles pick d647ac4 Change text color pick e2b3ddd Add new color pick a8fbb81 Import colors # Rebase a8fbb81 onto b862ff2 (7 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

Möglicherweise möchten Sie nur Ihre letzten paar Commits quetschen, in diesem Fall könnten Sie git rebase -i HEAD~3 und Ihre letzten drei Commits angezeigt bekommen:

 pick eb1eb3c Update homepage pick 5aff973 Add colors CSS file and edit background color pick 9e046b7 Add second paragraph to page # Rebase b862ff2..9e046b7 onto b862ff2 (3 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

Jetzt können wir alle Commits in den ersten Commit quetschen, wie unten gezeigt.

 pick eb1eb3c Update homepage squash 5aff973 Add colors CSS file and edit background color squash 9e046b7 Add second paragraph to page # Rebase b862ff2..9e046b7 onto b862ff2 (3 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

Wenn Sie die Datei speichern, öffnet Git Ihre Commit-Nachricht zum Bearbeiten.

 # This is a combination of 3 commits. # This is the 1st commit message: Update homepage # This is the commit message #2: Add colors CSS file and edit background color # This is the commit message #3: Add second paragraph to page # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Wed Jan 13 18:31:28 2021 +0100 # # interactive rebase in progress; onto b862ff2 # Last commands done (3 commands done): # squash 5aff973 Add colors CSS file and edit background color # squash 9e046b7 Add second paragraph to page # No commands remaining. # You are currently rebasing branch 'main' on 'b862ff2'. # # Changes to be committed: # new file: .gitignore # new file: css/base.css # new file: css/base.scss # new file: css/colors.css # new file: css/colors.css.map # new file: css/colors.scss # new file: css/common.css # new file: css/common.scss # new file: index.html #

Während wir die Rebase durchführen, können wir auch die Commit-Beschreibung bearbeiten, damit sie leichter lesbar ist.

 Implement new design for homepage. Add .gitignore file for Sass folder. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. #

Speichern Sie diese Datei erneut und Sie sind fertig! Wenn wir uns das Git-Protokoll noch einmal ansehen, sehen wir, dass es nur einen sauberen Commit gibt.

 [detached HEAD 574ec7e] Implement new design for homepage. Add .gitignore file for Sass folder. Date: Wed Jan 13 18:31:28 2021 +0100 10 files changed, 215 insertions(+) create mode 100644 .gitignore create mode 100644 css/base.css create mode 100644 css/base.scss create mode 100644 css/colors.css create mode 100644 css/colors.css.map create mode 100644 css/colors.scss create mode 100644 css/common.css create mode 100644 css/common.scss create mode 100644 index.html create mode 100644 verylargefile.txt Successfully rebased and updated refs/heads/main. $ git log commit 574ec7e5d7d7a96427e049cad9806cdef724aedd (HEAD -> main) Author: Ursula Clarke <[email protected]> Date: Wed Jan 13 18:31:28 2021 +0100 Implement new design for homepage. Add .gitignore file for Sass folder.

Git-Rebase

Entwickler zögern normalerweise, git rebase zu verwenden, da sie wissen, dass ein Rebase verwendet werden kann, um Dateien dauerhaft aus Ihrer Codebasis zu löschen.

Wie wir oben gesehen haben, kann git rebase verwendet werden, um Ihren Code aufzubewahren und aufzuräumen sowie zu löschen - aber was ist, wenn Sie eine Datei wirklich dauerhaft aus dem Verlauf entfernen möchten?

Ich war einmal Zeuge eines Szenarios, in dem ein Mitglied unseres Entwicklungsteams versehentlich eine sehr große Datei in die Codebasis übertragen hatte. Es war Teil eines viel größeren Zweigs, sodass die große Datei bei der Codeüberprüfung unbemerkt blieb und fälschlicherweise in den Hauptzweig eingecheckt wurde. Dies wurde immer dann zu einem Problem, wenn jemand das Repository neu klonen wollte – das Herunterladen dauerte sehr lange! Und natürlich war die fragliche Datei unnötig. Es wäre kein Problem gewesen, wenn die Datei das letzte Commit für den Hauptzweig gewesen wäre – in diesem Fall könnten Sie einfach einen Hard-Reset ausführen ( git reset --hard HEAD~1 ) und das Pushen des Zweigs erzwingen.

Wenn die Datei die einzige Änderung in einem bestimmten Commit war, könnten Sie ebenso einfach den gesamten Commit entfernen, indem Sie git reset --hard <commit-id> . In unserem Szenario wurde die große Datei jedoch zusammen mit anderem Code, den wir im Verlauf behalten wollten, als vorletzter Commit festgeschrieben.

Sobald Sie den problematischen Commit gefunden haben, überprüfen Sie ihn mit git checkout und dem Commit-Hash:

 $ git checkout ce861e4c6989a118aade031020fd936bd28d535b Note: checking out 'ce861e4c6989a118aade031020fd936bd28d535b'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name> HEAD is now at ce861e4 Add CSS styles

Entfernen Sie die Datei oder bearbeiten Sie Ihren Code und lassen Sie den Code (oder die Dateien), den Sie beibehalten möchten, intakt.

 $ rm verylargefile.txt $ git status HEAD detached at ce861e4 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) deleted: verylargefile.txt no changes added to commit (use "git add" and/or "git commit -a")

Stellen Sie sicher, dass Sie git add -A ausführen, damit Ihre gelöschte Datei bereitgestellt wird und Git weiß, dass sie entfernt werden muss. Führen Sie nun git commit --amend -v und Git fordert Sie auf, Ihre Commit-Nachricht zu bearbeiten.

Führen git rebase --onto HEAD <commit-id> main . Hier könnten Sie auf Merge-Konflikte stoßen, was bedeutet, dass es einen Konflikt zwischen Ihrem neuen Commit und dem alten Code gibt. Git wird Sie bitten, den Konflikt zu lösen:

 $ git add -A $ git status HEAD detached at ce861e4 Changes to be committed: (use "git reset HEAD <file>..." to unstage) deleted: verylargefile.txt $ git commit --amend -v [detached HEAD 7c9516a] Add CSS styles Date: Thu Jan 14 14:43:54 2021 +0100 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 css/common.css.map delete mode 100644 verylargefile.txt $ git status HEAD detached from ce861e4 nothing to commit, working tree clean $ git rebase --onto HEAD ce861e4 First, rewinding head to replay your work on top of it... Fast-forwarded HEAD to HEAD.

Wenn Sie die Datei in Ihrem Texteditor öffnen, sehen Sie, dass Git zwei Versionen der Indexdatei markiert hat. Sie müssen nur eines entfernen oder eines bearbeiten, um die gewünschten Änderungen beizubehalten.

 <p> Toptal was created by engineers. We are entrepreneurs, all passionate about working with top tech talent and exciting companies from all over the world. </p> <<<<<<< HEAD <p> Toptal connects the top 3% of freelance talent all over the world. </p> </main> </body> </html> ======= </main> </body> </html> >>>>>>> Add index file

Der Code zwischen <<<<<<< HEAD und der Zeile mit Gleichheitszeichen ist eine Version, und der Code zwischen den Gleichheitszeichen und >>>>>>> Add index file ist die Version aus dem Commit „Indexdatei hinzufügen“. . Sie können also sehen, dass eine Version den zusätzlichen Abschnitt „Toptal verbindet die besten 3 % der freiberuflichen Talente auf der ganzen Welt“ enthält, während dies bei der anderen nicht der Fall ist.

Speichern Sie Ihre bearbeitete Datei und führen git add filename filename gefolgt von git rebase --continue . Wenn es keine Änderungen gibt, können Sie auch git rebase --skip . Es kann eine Weile dauern, das Rebasing durchzugehen, wenn viele Commits zwischen Ihrem „Large File“-Commit und dem letzten Commit auf main lagen.

Seien Sie geduldig, und wenn Sie in einem großen Team sind, holen Sie unbedingt eine zweite Meinung ein! Es ist besonders wichtig, sich nach Möglichkeit mit der/den Person(en) zu beraten, die die Commit(s) geschrieben haben, die Sie zusammenführen.

Denken Sie daran, dass die Merge-Änderungen für den spezifischen Commit im Verlauf relevant sind und nicht Ihre aktuellsten Änderungen. Das heißt, wenn Sie einen Commit aus der Zeit bearbeiten, als der Text auf Ihrer Website Arial war, und es jetzt Verdana ist, sollten Sie diesen Commit mit der Geschichte von Arial als Schriftart behalten.

Beachten Sie auch, dass wenn Git ein Leerzeichen oder ein Zeilenendezeichen sieht, dies zu einem Zusammenführungskonflikt führen kann, seien Sie also vorsichtig!

Mehr als nur Commit und Pull

Git ist mächtiger als viele Entwickler denken. Wenn Sie zufällig einen Neuling vorstellen, geben Sie ihm unbedingt einige Tipps zu diesen unschätzbaren Funktionen. Es sorgt für einen effizienteren Arbeitsablauf.

Möchten Sie mehr über Git erfahren? Werfen Sie einen Blick auf die Git-Tipps und -Praktiken-Seite von Toptal.