# Übung SCM ## 1. Staging Area ### 1. Ornder "UebungSCM" angelegt ("mkdir UebungSCM"), mit dem Befehl "git init" ein local repository in "UebungSCM" initialisiert ### 2. Datei "SCM.txt" ("touch SCM.txt") in dem Ordner erstellt und mit dem Befehl "nano" folgende Textzeilen hinzugefügt: > 1 > 2 > 3 > hello > world > x ### 3. Status des Repository anzeigen lassen : > $ git status > On branch master > > No commits yet > > Untracked files: > (use "git add ..." to include in what will be committed) > SCM.txt > > nothing added to commit but untracked files present (use "git add" to track) ### 4. "SCM.txt" zur git Stage hinzufügen > $ git add "SCM.txt" > ### 5. aktuellen Status des Repository anzeigen > $ git status > On branch master > No commits yet > > Changes to be committed: > (use "git rm --cached ..." to unstage) > new file: SCM.txt ### 6. Änderungen in der Datei anzeigen > $ git diff > ### 7. einige weitere Zeilen in "SCM.txt einfügen > 1 > 2 > 3 > hello > world > x > 5 > 6 > 7 > 8 > neun > zehn ### 8. aktuellen Status des Repository anzeigen > $ git status > On branch master > > No commits yet > > Changes to be committed: > (use "git rm --cached ..." to unstage) > new file: SCM.txt > > Changes not staged for commit: > (use "git add ..." to update what will be committed) > (use "git restore ..." to discard changes in working directory) > modified: SCM.txt > > ### 9. Änderungen in der Datei anzeigen > $ git diff > diff --git a/SCM.txt b/SCM.txt > index 8c721ef..87e597b 100644 > --- a/SCM.txt > +++ b/SCM.txt > @@ -4,3 +4,9 @@ > hello > world > x > +5 > +6 > +7 > +8 > +neun > +zehn > > ### 10. Einen commit erzeugen > $ git commit -m "SCM" > [master (root-commit) 888f529] SCM > 1 file changed, 6 insertions(+) > create mode 100644 SCM.txt > ### 11. Commit-ID identifizieren > [master (root-commit) 888f529] SCM > $ git show 888f529 > commit 888f5299d207085f201038b048e4e1a99503585f ### 12. Zeigen sie die Änderung in der Datei an > $ git diff > diff --git a/SCM.txt b/SCM.txt > index 8c721ef..87e597b 100644 > --- a/SCM.txt > +++ b/SCM.txt > @@ -4,3 +4,9 @@ > hello > world > x > some *+5* text > +6 > +7 > +8 > +neun > +zehn > > ## Staging Area ### 1. Datei auf den Stand in der Stage zurücksetzen ("git reset --hard "commit_hash") > $ git reset --hard 888f5299d207085f201038b048e4e1a99503585f > HEAD is now at 888f529 SCM > ### 2. Aktueller Status des Repository > $ git status > On branch master > nothing to commit, working tree clean > ### 3. Änderungen in der Datei anzeigen > $ git diff > ### 4. Änderungen aus der Stage entfernen ohne die Datei zurückzusetzen > git checkout -- SCM.txt > Updated 0 paths from the Index > ### 5. Aktueller Status des Repository > $ git status > On branch master > nothing to commit, working tree clean > ### 6. Änderungen in der Datei anzeigen > $ git diff > ### 7. Datei auf den Stand im commit zurücksetzen #### Eingabe > $ git revert HEAD #### Ausgabe 1 > Revert "SCM" > > This reverts commit 4bcb7c56d9dcf9e06223188c52c5d9b6f5a9030d. > Please enter the commit message for your changes. Lines starting > with '#' will be ignored, and an empty message aborts the commit. > > On branch master > Changes to be committed: > deleted: SCM.txt > ### Ausgabe 2 > $ git revert HEAD > [master cb6d2d7] Revert "SCM" > 1 file changed, 4 deletions(-) > delete mode 100644 SCM.txt ### 8. Status des Repository > $ git status > On branch master > nothing to commit, working tree clean > ## Branching - Anlegen ### 1. Zeilen zur Datei "SCM.txt" hinzufügen (nano SCM.txt) und die Änderung comitten. Commit-Message : "main1" > $ git commit -m "master1" > [master 938ffec] master1 > 1 file changed, 2 insertions(+) > create mode 100644 SCM.txt > ### 2. Schritt 1 Wiederholen. Commit-Message : "master2" > $ git commit -m "master2" > [master 91cb85a] master2 > 1 file changed, 6 insertions(+), 2 deletions(-) > ### 3. Weitere Textdatei "testSCM.txt" anlegen, zur Stage hinzufügen und comitten > $ git commit -m "testSCM hinzugefuegt" > [master 09c235a] testSCM hinzugefuegt > 1 file changed, 0 insertions(+), 0 deletions(-) > create mode 100644 testSCM.txt > ### 4. Neuen Branch "test1" erzeugen > $ git branch "test1" > - und zu diesem wechseln > $ git checkout "test1" > Switched to branch 'test1 ' > ### 5. Weiter Zeilen in die erste Datei "SCM.txt" einfügen und committen > $ git commit -m "test1Commit1" > [test1 2e0aea7] test1Commit1 > 1 file changed, 4 insertions(+) > ### 6. Schritt 5 Wiederholen > $ git commit -m "test1Commit2" > [test1 539ef41] test1Commit2 > 1 file changed, 4 insertions(+) > ### 7. Commit-ID merken > commit 539ef4193e4bf79a6e8d54d46f8506998192a2d8 > test1 539ef41 > ### 8. Weitere Zeilen in die zweite Datei "testSCM.txt" einfügen (nano "testSCM") ### 9. Änderungen zur git Stage hinzufügen (git add "testSCM.txt") ### 10. Aktueller Status des Repository > $ git status > On branch test1 > Changes to be committed: > (use "git restore --staged ..." to unstage) > modified: testSCM.txt > ### 11. Weitere Zeilen zu "testSCM.txt" hinzufügen ## Branching - Zweige wechseln 1 ### 1. Zum Branch "master" wechseln > git checkout "master" ### 2. Aktueller Status des Repository > $ git status > On branch master > Changes to be committed: > (use "git restore --staged ..." to unstage) > modified: testSCM.txt > #### alt: > $ git status > On branch master > nothing to commit, working tree clean > ### 3. Branch wechseln zu "test1" > $ git checkout "test1" > ### 4. Neuen Branch erzeugen "test2" > & git branch "test2" > ## Branching - Zweige Wechseln 2 ### 1. Aktuellen Branch auf den Stand des Branches "master" zurücksetzen > $ git reset "2e0aea7" > ### 2. Status des Repository anzeigen #### Neuer Status > $ git status > On branch test1 > Changes not staged for commit: > (use "git add ..." to update what will be committed) > (use "git restore ..." to discard changes in working directory) > modified: SCM.txt > modified: testSCM.txt > > no changes added to commit (use "git add" and/or "git commit -a") #### Alter Status > $ git status > On branch master > Changes to be committed: > (use "git restore --staged ..." to unstage) > modified: testSCM.txt ### 3. Neue Zeilen in der ersten Datei "SCM.txt" hinzufügen ohne commit ### 4. Auf den Branch "test2" wechseln > $ git checkout test2 > error: Your local changes to the following files would be overwritten by checkout: > SCM.txt > Please commit your changes or stash them before you switch branches. > Aborting > ### 5. Warum schlägt das fehl? - Da die Änderungen an meiner Datei sonst überschrieben werden würden. Man muss zuerst die aktuelle Version der Datei committen oder zur Stash hinzufügen, sonst bricht Git den Versuch, den Branch zu wechseln ab. ### 6. Änderungen in die Stage übernehmen > $ git commit -m "master3" > ### 7. Branch lässt sich wechseln ### 8. Wechsel auf den Branch "test2" > git checkout "test2" > ### 9. Branch "test1" in "test3" umbenennen > $ git branch -m "test1" "test3" ## Historie - Anzeigen 1 ### 1. Auf Branch "test3" wechseln > $ git checkout "test3" > ### 2. Historie anzeigen lassen > $ git log > commit f68024ec473989ad16ef5c3e60deca3e27da199f (HEAD -> test3, test2) > Author: HV <123> > Date: Sun Nov 19 17:16:37 2023 +0100 > > test1Commit1 > > commit 9380ec4ee992866ca2a06af022d665eed8918ab0 > Author: HV <123> > Date: Sun Nov 19 17:16:15 2023 +0100 > > test1Commit1 > > commit 74660af0098e5ea03e23dc3b611deb26ef6022a4 (master) > Author: HV <123> > Date: Sun Nov 19 17:12:40 2023 +0100 > > testSCM hinzugefuegt > > commit 93adc2aaf180b9e8d7f143d81e460d8692bb2aaa > Author: HV <123> > Date: Sun Nov 19 17:09:48 2023 +0100 > > main2 > ### 3. Informationen über den commit - Author, Uhrzeit, Datum, Commit-Message, Commit-Hash ### 4. Nur den aktuellen Commit anzeigen (-1) > $ git log -1 > commit f68024ec473989ad16ef5c3e60deca3e27da199f (HEAD -> test3, test2) > Author: HV <123> > Date: Sun Nov 19 17:16:37 2023 +0100 > > test1Commit1 ### 5. Vereinfachte Historie > $ git log --oneline > f68024e (HEAD -> test3, test2) test1Commit1 > 9380ec4 test1Commit1 > 74660af (master) testSCM hinzugefuegt > 93adc2a main2 > b93db03 main1 > 979512c SCM > ### 6. Informationen über einen Commit - Commit-Message und ID werden ausgegeben ### 7. Anzahl der Branches - 3 ### 8. Komplette vereinfachte Historie > $ git log --oneline --all > 7a29ba9 (test1) master3 > f68024e (HEAD -> test3, test2) test1Commit1 > 9380ec4 test1Commit1 > 74660af (master) testSCM hinzugefuegt > 93adc2a main2 > b93db03 main1 > 979512c SCM > ### 9. Anzahl der Branches in der komplett vereinfachten Historie - 4 ### 10. Wo befindet sich die Markierung HEAD - HEAD -> test3, test2 ### 11. Auf Branch "test2" wechseln > $ git checkout "test2" > Switched to branch "test2" > ### 12. Vereinfachte Historie ohne (--all) anzeigen > $ git log --oneline > f68024e (HEAD -> test2, test3) test1Commit1 > 9380ec4 test1Commit1 > 74660af (master) testSCM hinzugefuegt > 93adc2a main2 > b93db03 main1 > 979512c SCM > ### 13. Mit Ergebnis von Schritt 7 vergleichen - gleich ## Historie Anzeigen 2 ### 1. Wechseln auf Branch "test3" > $ git checkout "test3" > Switched to branch 'test3' > ### 2. Weitere Zeile in der ersten Datei hinzufügen und comitten > $ git commit -m "test3Commit1" > [test3 7074e81] test3Commit1 > 1 file changed, 3 insertions(+) > ### 3. Schritt 2 drei Mal wiederholen > $ git commit -m "test3Commit2" > [test3 2440b20] test3Commit2 > 1 file changed, 1 insertion(+) > $ git commit -m "test3Commit3" > [test3 2e428f4] test3Commit3 > 1 file changed, 1 insertion(+) > $ git commit -m "test3Commit4" > [test3 1ae6afe] test3Commit4 > 1 file changed, 1 insertion(+) ### 4. Vereinfachte Historie ohne (--all) > $ git log --oneline > 1ae6afe (HEAD -> test3) test3Commit4 > 2e428f4 test3Commit3 > 2440b20 test3Commit2 > 7074e81 test3Commit1 > f68024e (test2) test1Commit1 > 9380ec4 test1Commit1 > 74660af (master) testSCM hinzugefuegt > 93adc2a main2 > b93db03 main1 > 979512c SCM > ### 5. Ergebnis mit Schritt 5 vergleichen - HEAD ist jetzt nur auf "test3" und die neuen commits, wurden in der Historie ergänzt ### 6. Komplette verinfachte Historie anzeigen mit (--all) > $ git log --oneline --all > 1ae6afe (HEAD -> test3) test3Commit4 > 2e428f4 test3Commit3 > 2440b20 test3Commit2 > 7074e81 test3Commit1 > 7a29ba9 (test1) master3 > f68024e (test2) test1Commit1 > 9380ec4 test1Commit1 > 74660af (master) testSCM hinzugefuegt > 93adc2a main2 > b93db03 main1 > 979512c SCM > ### 7. Mit Schrit 8 vergleichen - HEAD ist jetzt auf "test3", die letzten drei commits wurden ergänzt ## Merging ### 1. Eine Markierung setzen > $ git tag "tag-test3" ### 2. Branch wechseln auf test2 > $ git checkout "test2" ### 3. Eine Markierung setzen > $ git tag "tag-test2" ### 4. "test3" in "test2" mergen > $ git merge test3 > Auto-merging SCM.txt > CONFLICT (content): Merge conflict in SCM.txt > Automatic merge failed; fix conflicts and then commit the result. ### 5. Ergebnis in der Datei anzeigen > ... > ... > ... > '<<<<<<< HEAD' > '=======' > ... > ... ### 6. Historie des Repository anzeigen > $ git log --oneline > 1bd5765 (HEAD -> test2, tag: tag-test2) test1_2 > 84ff691 test1_1 > 598ccc0 Revert "master3" > 9706980 master3 > ef10ce0 (master) master3 neue txt-Datei > 1c67e50 master2 > 83e9caf master1 > cb6d2d7 Revert "SCM" > 4bcb7c5 SCM ### 7. Branch test2 auf Markierung tag-test2 zurücksetzen > $ git reset --hard "f68024e" > HEAD is now at f68024e test1Commit1 ### 8. Auf branch "test3" wechseln > $ git checkout "test3" ### 9. "test2" in "test3" mergen > $ git merge test2 > Auto-merging SCM.txt > CONFLICT (content): Merge conflict in SCM.txt > Automatic merge failed; fix conflicts and then commit the result. ### 10. Repository anzeigen und mit Schritt 3 vergleichen > $ git log --oneline > e257d98 (HEAD -> test3) test3_1 > 6675e4e (tag: tag-test3) test1_3 > ef10ce0 (master) master3 neue txt-Datei > 1c67e50 master2 > 83e9caf master1 > cb6d2d7 Revert "SCM" > 4bcb7c5 SCM ### 11. Vergleichen ( Die Zeile "=======" wird nicht mehr angezeigt) > ... > ... > ... > <<<<<<< HEAD > ... > ... ## Merging - Konfliktauflösung und Vorbereitung ### 1. Branch "test3" auf die Markierung "tag-test3" zurücksetzen > $ git reset --hard "tag-test3" > HEAD is now at 6675e4e test1_3 ### 2. Name des Branches an das Ende der zweiten Zeile der ersten Datei hinzufügen und committen > $ git commit -m "Name vom Branch am Ende der zweiten Zeile" > [test3 c4141f4] Name vom Branch am Ende der zweiten Zeile > 1 file changed, 1 insertion(+), 1 deletion(-) ### 3. Für die nächsten 3 Zeilen wiederholen > $ git commit -m "Name vom Branch am Ende der dritten Zeile" > $ git commit -m "Name vom Branch am Ende der vierten Zeile" > $ git commit -m "Name vom Branch am Ende der fuenften Zeile" ### 4. Markierung setzen > $ git tag "tag-test3-conflict" ### 5. Auf Branch "test2" wechseln > $ git checkout "test2" ### 6. Namen des Branches am Ende in die sechste Zeile schreiben und committen > $ git commit -m "Name vom Branch am Ende der sechsten Zeile" ### 7. Für die nächsten 3 Zeilen wiederholen > $ git commit -m "Name vom Branch am Ende der siebten Zeile" > $ git commit -m "Name vom Branch am Ende der achten Zeile" > $ git commit -m "Name vom Branch am Ende der neunten Zeile" ### 8. Markierung setzen > & git tag "tag-test2-conflict" ## Merging Konfliktauflösung ### 1. Merge von test3 aus starten > $ git checkout "test3" > Switched to branch 'test3' > $ git merge "test2" ### 2. Ausgabe (Merge Conflict) > $ git merge test2 > Auto-merging SCM.txt > CONFLICT (content): Merge conflict in SCM.txt > Automatic merge failed; fix conflicts and then commit the result. ### 3. Aktueller Status des Repository > $ git status > On branch test3 > You have unmerged paths. > (fix conflicts and run "git commit") > (use "git merge --abort" to abort the merge) > > Unmerged paths: > (use "git add ..." to mark resolution) > both modified: SCM.txt > > no changes added to commit (use "git add" and/or "git commit -a") ### 4. Zu entnehmende Infos - Branches sind nicht gemerged und haben Konflikte ### 5. Merge abbrechen > $ git merge --abort ### 9. Welche Änderungen stammen aus welchem Branch? - Zeilen mit "test3" stammen aus dem Branch "test3" ## Merging - Konfliktauflösung 2 ### 1. Merge von Branch test2 aus starten > $ git checkout "test2" > Switched to branch 'test2' > $ git merge test3 > Auto-merging SCM.txt > CONFLICT (content): Merge conflict in SCM.txt > Automatic merge failed; fix conflicts and then commit the result. ### 2. Inhalt der Datei betrachten ### 3 / 4 / 5 / 6 ### 7. Änderungen committen > $ git commit -m "Zeilen kopiert, Konfliktbereich" > [test2 7c42bfa] Zeilen kopiert, Konfliktbereich ### 8. Aktuellen Status des Repository anzeigen > $ git status > On branch test2 > nothing to commit, working tree clean ### 9. Historie anzeigen > $ git log --oneline ### 10. test3 auf die Markierung tag-test3 zurücksetzen > git reset --hard tag-test3