wake-up-neo.com

Wechseln Sie zu einem anderen Zweig, ohne die Arbeitsbereichsdateien zu ändern

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.

55
amorfis

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.

52
Greg Hewgill

Git. Zu einem anderen Zweig wechseln

git checkout branch_name
35

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

7
vivek85

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.

1
joeytwiddle

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.

1
timdev

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.

0
Yushin Washio

Der einfachste Weg ist wie folgt:

git fetch && git checkout <branch_name>
0
Mandeep Singh