Ich habe ein Git-Repository aus GitHub geklont, einige Änderungen vorgenommen und einige Commits vorgenommen. Ich habe ziemlich viel gemacht und alle sind ziemlich dreckig, so dass sie nicht für eine Pull-Anfrage geeignet sind. Jetzt habe ich den Zweig cleanchanges
aus Origin/master
erstellt, also ist es sauber und ich möchte meine Änderungen dort als ein Commit mit einem Nice-Commit-Kommentar festlegen.
Wenn ich auf dem lokalen Master bin, möchte ich zu meiner cleanchanges
wechseln, ohne die Dateien zu ändern. Und dann kann ich mich verpflichten.
Wie kann ich Zweige wechseln, ohne Dateien zu ändern?
Ich möchte klarstellen: Ich habe alle Änderungen in der lokalen master
übernommen. Es gibt keine nicht festgeschriebenen Änderungen.
Edit: Ich habe gerade bemerkt, dass Sie gesagt haben, dass Sie bereits einige Commits erstellt haben. In diesem Fall verwenden Sie git merge --squash
, um eine einzelne Festschreibung durchzuführen:
git checkout cleanchanges
git merge --squash master
git commit -m "Nice commit comment for all my changes"
( Edit: Die folgende Antwort gilt, wenn Sie uncommitted geändert haben.)
Wechseln Sie einfach die Äste mit git checkout cleanchanges
. Wenn sich die Zweige auf den gleichen Verweis beziehen, bleiben alle Ihre nicht festgeschriebenen Änderungen in Ihrem Arbeitsverzeichnis erhalten, wenn Sie wechseln.
Der einzige Zeitpunkt, zu dem Sie einen Konflikt hätten, ist, wenn sich eine Datei im Repository zwischen Origin/master
und cleanchanges
unterscheidet. Wenn Sie gerade den Zweig erstellt haben, ist das kein Problem.
Wenn Sie sich Sorgen darüber machen, dass Sie Ihre Arbeit verlieren, erstellen Sie zuerst eine Sicherungskopie. Git soll keine Arbeit wegwerfen, ohne Sie vorher zu fragen.
Git. Zu einem anderen Zweig wechseln
git checkout branch_name
Die beste Wette ist, Stash die Änderungen und den Zweig wechseln. Um die Zweige zu wechseln, benötigen Sie einen sauberen Zustand. Legen Sie sie also ab, checken Sie einen neuen Zweig aus und übernehmen Sie die Änderungen für den neuen Zweig und übernehmen Sie ihn
Eine andere Möglichkeit, wenn Sie ein neues Commit erstellen möchten, anstatt eine Zusammenführung durchzuführen:
git checkout cleanchanges
git reset --hard master
git reset cleanchanges
git status
git add .
git commit
Beim ersten (harten) Reset wird Ihr Arbeitsbaum auf den gleichen Commit in master
gesetzt.
Beim zweiten Zurücksetzen wird Ihr HEAD wieder auf den ursprünglichen Wert gesetzt, wobei er auf die Spitze des cleanchanges
-Zweigs verweist, ohne jedoch Dateien zu ändern. Jetzt können Sie sie hinzufügen und festlegen.
Wenn Sie anschließend die fehlerhaften Commits entfernen möchten, die Sie aus master
erstellt haben (und davon auszugehen sind, dass Sie sie noch nicht geschoben haben), könnten Sie Folgendes tun:
git checkout master
git reset --hard Origin/master
Dadurch werden alle Ihre neuen Commits verworfen und der lokale Zweig master
wird auf den gleichen Commit zurückgesetzt wie der im Repository.
Es hört sich an, als ob Sie Änderungen vorgenommen haben, die Sie zwingen, auf dem Weg zu meistern, und jetzt möchten Sie sie in einem einzigen Commit kombinieren.
Wenn ja, möchten Sie rebase Ihre Commits in einem einzigen Commit zerquetschen.
Ich bin mir nicht ganz sicher, was genau Sie wollen, also werde ich Sie nicht mit einem Skript verführen. Ich schlage jedoch vor, dass Sie sich git rebase
und die Möglichkeiten zum "Squash" durchlesen und ein paar Dinge ausprobieren.
Warum nicht einfach git reset --soft <branch_name>
?
Demonstration:
mkdir myrepo; cd myrepo; git init
touch poem; git add poem; git commit -m 'add poem' # first commit
git branch original
echo bananas > poem; git commit -am 'change poem' # second commit
echo are tasty >> poem # unstaged change
git reset --soft original
Ergebnis:
$ git diff --cached
diff --git a/poem b/poem
index e69de29..9baf85e 100644
--- a/poem
+++ b/poem
@@ -0,0 +1 @@
+bananas
$ git diff
diff --git a/poem b/poem
index 9baf85e..ac01489 100644
--- a/poem
+++ b/poem
@@ -1 +1,2 @@
bananas
+are tasty
Beachten Sie jedoch, dass sich der aktuelle Zweig in original
ändert. Sie befinden sich nach dem Prozess immer noch im vorherigen Zweig, können jedoch leicht git checkout original
werden, da es sich um denselben Status handelt. Wenn Sie die vorherige HEAD
nicht verlieren möchten, sollten Sie die Festschreibungsreferenz notieren und danach git branch -f <previous_branch> <commit>
ausführen.
Der einfachste Weg ist wie folgt:
git fetch && git checkout <branch_name>