2010-11-03 10 views
5

Załóżmy, że jeden plik jest w stanie konfliktu z git.git: przechowuje różne etapy pliku w indeksie/drzewie roboczym po konflikcie

Oznacza to, że indeks zawiera 3 wersje pliku, poprzednią, jedną z jednego oddziału, drugą z drugiego.

Chciałbym sprawdzić wersję 3 ("ich") w katalogu roboczym, a wersję stage 2 ("nasze") w indeksie.

Czy jest to bezbolesny sposób?

+0

W rzeczywistości jest to wersja "nasza" (z bieżącej gałęzi, z którą się łączysz), wersja "ich" (z gałęzi, z którą się łączysz) i wersja "przodek" (wspólny przodek obu gałęzi) - poprzednia wersja w generał. –

Odpowiedz

4

Prawdopodobnie najbardziej bezbolesny sposób jest taki.

# 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 

fiddling z indeksem z update-index hydraulicznego nie powinno być konieczne, chyba że zgubiłeś HEAD (że tak powiem).

+0

Doskonały. Znacznie prostsze. +1 – VonC

1

Sztuczka polega na "dodaniu jednej wersji do indeksu": oznaczałoby to plik jako rozwiązany (co oznacza, że ​​nie jest już "nasz" lub "ich").
To musi być ostatni krok.

Może coś takiego:

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 

Niezupełnie "bezbolesny" ...


Aby uniknąć plik tymczasowy, Jakub Narębski sugeruje użycie git update index (polecenie hydrauliką) manipulować bezpośrednio indeks.

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

--cacheinfo służy do zarejestrowania pliku, który nie jest w bieżącym katalogu roboczym. Jest to użyteczne w przypadku minimalnego scalania transakcji.

Domyślnie, gdy ścieżka pliku istnieje w indeksie, git update-index odmawia próby dodania path/file. Podobnie, jeśli istnieje plik path/file, ścieżka pliku nie może zostać dodana. Za pomocą flagi --replace istniejące wpisy, które kolidują z dodawanym hasłem, są automatycznie usuwane z komunikatami ostrzegawczymi.

+0

VonC: Masz wszystko w porządku: dodawanie niszczy etapy indeksu. Jak dotąd znalazłem twoje rozwiązanie! :-) Nie bezbolesne, ale dzięki! Bardziej szukam jakiegoś polecenia git-instalacyjnego, które to umożliwiłoby bez kłopotliwego przechowywania pliku tymczasowego. –

+0

@Olivier: w porządku, poczekaj na Jakuba, Jefromi, Charlesa lub ... w dowolnym momencie;) – VonC

+0

Możesz użyć niskiego poziomu ['git update-index'] (http://www.kernel.org/pub /software/scm/git/docs/git-update-index.html) do manipulowania indeksem: zobacz '--cacheinfo ' (być może z opcjami '--replace') i' --force-remove'. –

Powiązane problemy