git hat mich reingelegt.

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 961
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

git hat mich reingelegt.

Beitrag von fliegermichl »

Hallo,

Ich habe im branch master verschiedene (recht umfangreiche) Änderungen gemacht und mich dann entschlossen, daraus einen separaten Branch namens "solar" zu machen.

Code: Alles auswählen

git checkout -b solar
Das zeigt mir die derzeit modifizierten Dateien an, erstellt einen neuen Branch solar und wechselt auch gleich dahinein.
Wenn ich jetzt mit

Code: Alles auswählen

git checkout master
wieder in den master Branch wechsele, so hatte ich angenommen, daß die Änderungen da nicht mehr sichtbar sind, weil ich diese ja in den branch solar "verschoben" habe.
Er zeigte mir darauf wieder die Liste der modifizierten Dateien an.
Ich habe dann im master Branch mit

Code: Alles auswählen

git reset --hard
diese Änderungen löschen wollen. Hat git auch sauber gemacht. In beiden Branches. Meine Änderungen sind jetzt komplett futsch.

Frage, wie kann ich das gewünschte Resultat erzeugen. So als hätte ich vor den Änderungen den Branch erzeugt, in diesen gewechselt und dann erst die Änderungen vorgenommen?
Gibt es irgendeine Option, meine Änderungen doch noch wieder zu bekommen?

Ich weiss, hat nicht direkt mit Lazarus zu tun aber es waren ja Änderungen in meinen .pas files.

Warf
Beiträge: 1585
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: git hat mich reingelegt.

Beitrag von Warf »

Nö, du hast deine Änderungen mit dem reset --hard permanent gelöscht.

Dein Problem war das du deine Änderungen nie zu einem der branches commited hast. Wenn du was in deinem Arbeitsverzeichnis änderst musst du danach git sagen das du diese änderungen gerne zum repository hinzufügen würdest indem du sie commitest. Dann sind sie teil vom Branch und sind wenn du den branch wechselst auch wieder weg.

Mit git am besten immer wenn man irgendwas gemacht hat erst mal commiten. Es müssen nicht mal sinnige commits sein, man kann commits im nachhinein immer noch ändern, löschen, zusammenführen oder aufsplitten. Einfach immer wenn man etwas gemacht hat, z.B. sobald man für einen Tag fertig ist und die IDE schließt, oder auch nur wenn man mittagspause macht, einen commit machen dann sind die daten schon erst mal gesichert.
Musst halt nur dran denken sobald dein Feature fertig ist einmal durch deinen branch zu gehen und die commits aufzuräumen, damit die nicht ausversehen im master landen

Wenn du nicht commiten willst aber die änderungen temporär entfernen möchtest kannst du auch stashen, dabei speicherst du die änderungen zwischen und stellst den letzten commit wieder her. Beispiel:

Code: Alles auswählen

$> git stash # speichert die aktuellen änderungen
$> git co master # checkt master aus
# mach irgendwas
$> git co mein_branch # wieder zurück zum ursprünglichen branch
$> git stash pop # stellt die gestashten änderungen wieder her

Nachtrag:
Du könntest sogar glück haben, Lazarus speichert regelmäßige backups des codes als .bak dateien. Eventuell hast dei deinen code da noch

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 961
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: git hat mich reingelegt.

Beitrag von fliegermichl »

Danke für die Erklärung.
Tatsächlich hätte

Code: Alles auswählen

git checkout -b solar
git commit -a -s -m"Solarfunktionalitaet eingebaut"
genau das erreicht, was ich wollte. Naja, beim nächsten mal dann...

Socke
Lazarusforum e. V.
Beiträge: 2968
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: git hat mich reingelegt.

Beitrag von Socke »

Aus den Computerspielen gab es doch so eine Weisheit: Commit early, commit often
Wenn man seine Änderungen irgendwann als Pull-Request zur Verfügung stellt, können die ganzen Änderungen zu einer zusammengefasst werden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Warf
Beiträge: 1585
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: git hat mich reingelegt.

Beitrag von Warf »

Auch keine angst zu haben auf dem falschen Branch zu commiten. Git ist ein dezentrales SCM, was bedeutet du kannst lokal alles machen was du willst ohne angst haben zu müssen was kaputt zu machen (außer deinen eigenen code).
D.h. wenn es dir mal passiert das du angefangen hast zu arbeiten ohne zu checken ob du auf dem richtigen branch bist (und z.b. auf master statt auf deinem eigenen branch arbeitest) lieber erst mal auf diesem branch commiten damit es gespeichert ist, und dann den commit via cherry-pick auf den richtigen branch bringen. Denn falls es konflikte dabei geben sollte hast du immerhin ein backup auf dem alten branch, das du im notfall einfach ein reset --hard machen kannst wenn durch den merge plötzlich alles kaputt geht (glaub mir, aus Erfahrung kann ich sagen das sowas schneller geht als man denken sollte).

Wenn der commit erfolgreich auf dem neuen branch ist kannst du den original branch dann wieder herstellen. Und normalerweise sollte das git repo eh so konfiguriert sein das man nicht auf den Master pushen darf, also wenn du ausversehen pushen willst geht das eh nicht.

Als Faustregel: Erst commiten dann denken

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 961
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: git hat mich reingelegt.

Beitrag von fliegermichl »

Warf hat geschrieben:
Di 17. Aug 2021, 18:24
...sobald dein Feature fertig ist einmal durch deinen branch zu gehen und die commits aufzuräumen
Da hätte ich jetzt auch noch mal eine Frage zu. Die Arbeit an meinem Branch ist jetzt soweit fertig, so daß ich den in den master Branch mergen kann.
Wie kann ich erreichen, daß nur der aktuelle Stand gemergt wird? (also ohne die vielen kleinen Commits im neuen Branch)
Thema Branch aufräumen.

martin_frb
Beiträge: 546
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: git hat mich reingelegt.

Beitrag von martin_frb »

Code: Alles auswählen

git merge --squash ..........
https://git-scm.com/docs/git-merge

Oder

Code: Alles auswählen

git rebase -i ................
https://git-scm.com/docs/git-rebase

rebase erlaubt auch die vielen commits gezielt in 2 oder 3 größere zu gruppieren.

Du kannst den Branch entweder beibehalten und dann (den neuen Branch mit weniger commits) mergen. "git rebase -f -i --keep-base main" (wenn der aktuelle Branch van "main" abzweigt)
Oder die neuen commits direkt im Ziel Branch unterbringen (ohne merge) "git rebase -i main" (und dann fast forward main)

martin_frb
Beiträge: 546
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: git hat mich reingelegt.

Beitrag von martin_frb »

Ebenfalls interessant für die Zukunft https://git-scm.com/docs/git-commit#Doc ... ltcommitgt

Antworten