2009-05-02 7 views
44

Ein Mitarbeiter und ich arbeiten beide gerade in der Meisterbranche. Ich habe Code in meinem Arbeitsbaum, den ich nicht committen möchte (Debugging-Anweisungen und ähnliches). Nun, wenn er Änderungen an einige diese gleichen Dateien verpflichtet, ich kann sie nicht fusionieren:Wie man git merge handle nicht festgeschriebene Änderungen an meinem Arbeitsbaum machen?

$ git merge origin/master 
Updating 1b8c5c6..eb44c23 
error: Entry 'blah.java' not uptodate. Cannot merge. 

Von einem Subversion-Hintergrund, ich bin es gewohnt, mein Arbeits Baum automatisch mit zusammengeführt, wenn ich ziehe Änderungen aus dem Repository und wenn es Konflikte gibt, löse ich sie manuell auf.

Der schnellste Weg, fand ich dies in git zu tun ist:

$ git stash 
$ git merge origin/master 
$ git stash pop 

Im Wesentlichen meiner unbestätigten Änderungen zu entfernen, die Zusammenführung zu tun und dann erneut die Anwendung der Änderungen. Wie kann ich Merge mitteilen, um meinen Arbeitsbaum automatisch mit den Änderungen zu verbinden, die ich versuche zu ziehen?

+3

Was ist, wenn Sie Zusammenführungskonflikte haben? Was wäre, wenn Sie Konflikte in schmutzigen Dateien (Dateien, die Sie geändert haben) hätten? Siehe auch "Spaß mit lokalen Änderungen zu halten" bei Junio ​​C Hamano (git Betreuer) Blog: http://gitster.livejournal.com/29060.html –

+0

Danke für den Link. Wiederum, in der überwiegenden Mehrheit der Fälle, erwarte ich entweder keine oder nur sehr kleine Konflikte, die mir nichts ausgemacht haben. Ich laufe das gleiche Risiko von Konflikten, wenn ich meine schmutzigen Dateien trotzdem begehe, außer dann muss ich die Mühe machen, sie danach zu entmachten. –

+0

In Verbindung stehende Frage: http://stackoverflow.com/questions/18529206/when-do-i-need-to-do-git-pull-before-or-after-git-add-git-commit – leo9r

Antwort

18

Soweit ich das beurteilen kann, ist das Beste, was Sie tun können, was Sie bereits mit git stash haben. Ich finde es auch merkwürdig, dass Merge nur mit sauberen Bäumen umgehen will.

+3

Ich werde dies in meine .bashrc einfügen: gm() { git stash; Git mischen $ @; git stash pop } Und dann warten, um zu sehen, wie lange es dauert, mich irgendwie in den Arsch beißen. –

+1

@jeremy: Sie werden eines Tages einen sehr sehr alten Stash anwenden :). passierte mir :). – reto

+0

@reto: Wie würde das passieren? – Casebash

36

Vergessen Sie alles, was Sie jemals von Subversion gelernt haben.

Immer festschreiben, bevor externe Änderungen eingeführt werden.

Stellen Sie sich vor, Sie hätten einen größtenteils funktionierenden Baum - vielleicht nicht perfekt, aber Sie machen Fortschritte. Dann gehst du, um eine Zusammenführung zu machen und der Code, den du hereinbringst, hat nur Chaos angerichtet (war selbst fehlerhaft, zu viele Konflikte, um damit umzugehen, etc ...). Wäre es nicht schön, wenn Sie das einfach rückgängig machen könnten?

Wenn Sie sich verpflichten, können Sie. Wenn du es nicht tust, wirst du einfach leiden.

Erinnern: Was Sie begehen, hat nicht zu sein, was Sie schieben, aber was Sie nicht verpflichten, können Sie leicht verlieren.

Tun Sie einfach die sichere und einfache Sache und verpflichten Sie sich früh und häufig begehen.

+1

So begehe ich meine Debugging-Anweisungen und dann fusionieren. Dann mache ich einige echte Veränderungen, die ich vorantreiben möchte. Wie bekomme ich meine Debugging-Anweisungen heraus, jetzt hängt das Zeug, das ich begehen will, von diesem Commit ab? –

+0

Sie können ein vorheriges Commit immer mit dem Befehl "revert" rückgängig machen. –

+1

Ich werde diese Strategie in Erwägung ziehen, wenn unser Code tatsächlich verrückt genug wird, dass ich mich darum kümmern muss, ihn rückgängig zu machen. Im Moment glaube ich, dass die "Stash" -Version noch reversibel ist. Ich kann den Merge-Commit erneut starten, den Merge-Commit beenden und den Stash wieder auf den anderen Commit setzen, den ich möchte. Es macht mir nichts aus zu vergessen, was ich über Subversion gelernt habe, aber es bläst, wenn es etwas viel besser als Git tut, vor allem, wenn git derjenige sein soll, der so gut zu verschmelzen ist. –

2

Sie können git merge nicht mitteilen, dass Änderungen an Dateien zusammengeführt werden sollen, die Änderungen in Bezug auf Ihr lokales Repository aufweisen. Dies schützt Sie davor, Ihre Änderungen zu verlieren, wenn eine Zusammenführung schlecht verläuft.

Mit dem CVS- und SVN-Ansatz zum Zusammenführen, wenn Sie Ihre Dateien vor dem Update nicht manuell kopiert haben und sie bei der Zusammenführung verschlüsselt haben, müssen Sie manuell erneut bearbeiten, um wieder in einen guten Zustand zu gelangen.

Wenn Sie Ihre Änderungen entweder bestätigen oder speichern, bevor Sie eine Zusammenführung durchführen, ist alles reversibel. Wenn die Zusammenführung nicht gut verläuft, können Sie verschiedene Methoden ausprobieren, um es zum Laufen zu bringen und mit dem zu arbeiten, der am besten funktioniert.

Wenn Sie experimentelle oder Debug-Änderungen vornehmen, können Sie sie nach den Commits, die Sie über git merge erhalten, mit git rebase verschieben, um sie leichter loszuwerden oder sie nicht versehentlich in ein Repository zu verschieben.

Beachten Sie, dass die Verwendung von git rebase in einem Zweig, den Sie in ein gemeinsam genutztes Repository verschoben haben, für alle Beteiligten, die dieses Repository verwenden, ein Problem darstellt.

Ich bevorzuge in diesen Fällen git stash, aber ich verwende es nur, wenn die Zusammenführung Dateien ändert, die ich bearbeitet und nicht festgeschrieben habe.

+0

Wovon redest du? SVN sichert Ihre Dateien vor dem Zusammenführen. Git ist das C++ der Versionskontrolle. Es ist stolz darauf, übermäßig komplex und kompliziert zu sein. – JohnPristine

+0

Ich denke, mein Wissen über SVN ist veraltet. Git entwickelt sich auch, um im Laufe der Zeit nützlicher zu werden. Ich habe gerade eine Diskussion über Gitless gestern gesehen, die auf Git-Repositories wirkt, aber viel einfacher zu verwenden ist, wenn Sie nicht festgeschriebene Änderungen haben und Zweige verschmelzen oder ändern wollen. –

Verwandte Themen