2014-10-10 4 views
6

Wie würde ich in Git einen älteren Zweig auschecken, während alle Änderungen aus dem aktuellen Zweig beibehalten würden, aber sie würden nur als nicht festgeschriebene Änderungen oder neue Dateien markiert.Git: Checken Sie einen Zweig aus, der nicht festgeschriebene Änderungen enthält

Gibt es einen Befehl wie git checkout-but-keep-changes branch_name?

+0

Es ist nicht klar, was Sie fragen. Wenn Sie "meine Änderungen" sagen, beziehen Sie sich auf Commits zu einer vorherigen Verzweigung oder geänderten Dateien oder? –

+0

@AndrewC Danke, ich habe meine Frage aktualisiert. –

+0

Die Antwort von 3340 deckt in diesem Fall fast alles ab. –

Antwort

-1

Ich war für eine git Suche war zurückgesetzt --soft

Leider meine Frage nicht ganz klar.

10

Git normally does this Wenn Sie Dateien auschecken, gehen Sie davon aus, dass die vorgenommenen Änderungen nicht für Dateien gelten, die beim Auschecken geändert werden. Zum Beispiel nehme ich die folgenden Dateien in einem Repository haben:

a.txt 
b.txt 
c.txt 

Jetzt werde ich eine Änderung a.txt machen in Datei:

a.txt (modified) 
b.txt 
c.txt 

Jetzt nehme ich an zwei anderen Zweigen, a-changed und b-changed, in denen a.txt und b.txt wurden jeweils geändert.

Wenn ich versuche, b-changed auszuchecken, wird Git dies ohne Beanstandung tun, weil meine Arbeitsverzeichnisänderungen nicht mit den Änderungen in diesem Zweig in Konflikt stehen. Wenn ich jedoch versuche, a-changed auszuchecken, wird Git das nicht tun, weil ich Änderungen an meiner lokalen Kopie vorgenommen habe, und der Checkout würde sie überlisten. Git sagt:

$ git checkout a-changed 
error: Your local changes to the following files would be overwritten by checkout: 
     a.txt 
Please, commit your changes or stash them before you can switch branches. 
Aborting 

Git Sie nicht bieten eine Möglichkeit, um dieses Problem zu umgehen: stash your changes! Dadurch werden Ihre aktuellen Änderungen als Patch gespeichert und im Arbeitsverzeichnis rückgängig gemacht. Das heißt, nach der Ausführung von git stash wird das Arbeitsverzeichnis bereinigt, und Ihre Änderungen werden auf den Stash-Stack übertragen. Sie können dann den gewünschten Zweig auschecken und git stash pop ausführen, wodurch Ihre Änderungen vom Stapel entfernt und auf den neuen Arbeitsbaum angewendet werden. Hoffentlich werden sie sauber anwenden. Wenn dies nicht der Fall ist, erhalten Sie die standardmäßigen Merge-Konfliktmarker in a.txt. Bemerkenswerterweise ist das Versteck nicht aus dem Stapel, so dass Sie eine git stash drop tun müssen, nachdem Sie die Zusammenführung auflösen.

Sie können auch das Flag -m (--merge) an den Befehl checkout übergeben, der angibt, dass die Änderungen dreifach mit den eingehenden Änderungen zusammengeführt werden sollen. Generell bevorzuge ich Dinge zu verstauen.