2010-11-03 8 views
5

Angenommen, eine Datei befindet sich im Konflikt mit Git.Git: Speichern Sie verschiedene Phasen einer Datei im Index/Arbeitsbaum nach dem Konflikt

Es bedeutet, dass der Index 3 Versionen der Datei enthält, die vorherige, die aus einer Verzweigung, die aus der anderen Verzweigung.

Ich möchte Version 3 ("theirs") im Arbeitsverzeichnis auschecken, und stage Version 2 ("unsere") im Index.

Gibt es eine schmerzfreie Möglichkeit, das zu tun?

+0

Eigentlich ist es "unsere" Version (aus dem aktuellen Zweig in die Sie zusammenführen), "ihre" Version (aus dem Zweig, den Sie zusammenführen), und "Vorfahren" Version (gemeinsamer Vorfahr beider Zweige) - nicht frühere Version in Allgemeines. –

Antwort

4

Wahrscheinlich ist die schmerzloseste Art und Weise so.

# Checkout 'their' version from the index into the working tree 
git checkout --theirs file 

# reset the index to the HEAD version, i.e 'our' branch 
git reset HEAD file 

Hantieren mit dem Index mit dem update-index Sanitär sollte nicht notwendig sein, wenn Sie Ihre HEAD (sozusagen) verloren haben.

+0

Ausgezeichnet. Viel einfacher. +1 – VonC

1

Der Trick besteht darin, "eine Version zum Index hinzuzufügen": das würde die Datei als gelöst markieren (also nicht mehr "unsere" oder "ihre").
Also muss es der letzte Schritt sein.

Vielleicht so etwas wie:

git show :3:<filename> > <filename>.theirs # save the "theirs" version in a tmp file 
git show :2:<filename> > <filename>  # display the "ours" version in the working dir 
git add <filename>       # add it to the index 
              # (marking the conflicting file as resolved) 
move <filename>.theirs <filename>  # erasing the file with the "theirs" version 
              # in the working directory 

Nicht gerade "schmerzlos" ...


die temporäre Datei zu vermeiden, schlägt Jakub Narębski mit git update index (ein Sanitär-Befehl) direkt zu manipulieren Der Index.

--replace --cacheinfo <mode> <object> <path> 

--cacheinfo wird verwendet, um eine Datei zu registrieren, die nicht im aktuellen Arbeitsverzeichnis ist. Dies ist nützlich für das Zusammenführen von Mindestabfragen.

Wenn ein Dateipfad im Index vorhanden ist, verweigert git update-index standardmäßig den Versuch, path/file hinzuzufügen. Wenn eine Datei path/file vorhanden ist, kann ein Dateipfad nicht hinzugefügt werden. Mit dem Flag --replace werden vorhandene Einträge, die mit dem hinzuzufügenden Eintrag in Konflikt stehen, automatisch mit Warnmeldungen entfernt.

+0

VonC: Sie haben den Trick in Ordnung: Hinzufügen zerstört die Indexstufen. Ich habe deine Lösung bisher gefunden! :-) Nicht schmerzfrei, aber trotzdem danke! Ich suche mehr nach einem git plumbing-Befehl, der dies ohne das Problem erreichen würde, eine temporäre Datei zu speichern. –

+0

@Olivier: Alles klar, warte einfach auf Jakub oder Jefromi oder Charles oder ... jederzeit jetzt;) – VonC

+0

Du kannst Low-Level ['git update-index'] (http://www.kernel.org/pub /software/scm/git/docs/git-update-index.html) um Index zu manipulieren: siehe '--cacheinfo ' (vielleicht mit '--replace') und' --force-remove' Optionen. –

Verwandte Themen