2009-08-18 12 views
30

Wie können Sie git-checkout ohne die Daten zu überschreiben?Zum Auschecken ohne Überschreiben von Daten

Ich betreibe

git checkout master 

ich

error: Entry 'forms/answer.php' would be overwritten by merge. Cannot merge. 

Diese überraschend ist, da ich nicht wusste, dass Git verschmilzt, wenn ich git-checkout. Ich habe immer nach dem Befehl getrennt git merge new-feature ausgeführt. Dies scheint anscheinend unnötig, wenn Git beim Auschecken zusammenläuft.

Antwort

51

Git warnt Sie, dass forms/answers.php Änderungen in Ihrer Arbeitskopie oder Ihrem Index hat, die nicht festgeschrieben wurden.

können Sie verwenden git-stash Ihre Änderungen dann git-Stash anwenden zu speichern, um sie wiederherzustellen.

Der gemeinsame Anwendungsfall von git-Stash ist, dass Sie auf Änderungen arbeiten, aber dann vorübergehend einen anderen Zweig Kasse muss einen Bug-Fix zu machen. So können Sie stash Ihre Änderungen in Ihrem Index und Arbeitskopie, Checkout der anderen Branche, machen Sie den Bug beheben, commit, die ursprüngliche Filiale, und git-stash gelten, um Ihre Änderungen wiederherzustellen und Pick-up, wo Sie verlassen aus.

+1

Vielen Dank für die Erwähnung von 'Git-Stash'! - Ich wusste nicht, dass sein Zweck in Situationen wie diesem verwendet werden soll. –

+2

Aus irgendeinem Grund konnte ich den Befehl git-stash nicht verwenden. Stattdessen musste ich "Git Stash" (kein Bindestrich) verwenden. –

+0

Wenn Sie nur eine andere Revision inspizieren möchten, während Sie Ihre nicht festgeschriebenen Änderungen beibehalten (was manchmal der Fall ist, wenn Sie nach der Revision suchen, die einen Bug einführt), ist Jakubs Vorschlag ('git checkout -m') viel einfacher. –

18

Git hat eine 2-Wege-Zusammenführung von uncomitted Änderungen wenn Zweige Schalen (unter Verwendung von git checkout <branch>), aber normalerweise hat es nur triviale (Baum-Ebene) verschmelzen.

Neben git-stashsolution by Karl Voigtland, können Sie zusätzliche Optionen zu git checkout geben, eine der folgenden Optionen wählen:

  • Tells git versuchen härter uncomitted Änderungen in den Zweig fusionieren zu wechseln mit -m/--merge Möglichkeit. Mit dieser Option wird eine Drei-Wege-Verknüpfung zwischen dem aktuellen Zweig, Ihrem Arbeitsbauminhalt und dem neuen Zweig hergestellt, und Sie befinden sich in der neuen Verzweigung.

  • Erinnere git an überschreiben nicht behobene Änderungen, lokale Änderungen mit -f Option wegwerfen. Achtung: Unbearbeitete Änderungen gehen verloren!

+2

Danke dafür. Der zweite ("git checkout -f master") half mir, zurück zu kommen. Ich weiß nicht, welche Veränderungen ich verloren habe, aber sie waren nicht wichtig, da dies eine sehr alte Kopie eines Repos ist, den ich nur inspizieren wollte. – mgilson

+0

Ist es möglich, das "Gegenteil" von 'git checkout -f' zu tun? Grundsätzlich möchte ich, dass Git die Dateien, die zu Konflikten führen würden, auscheckt. – giusti