2012-02-03 7 views
34

Chcę skorzystać z algorytmu git-merge na dwóch dowolnych plikach w repozytorium git. Oto mój katalog roboczy:Uruchom algorytm git merge na dwóch pojedynczych plikach

folder/ 
    file1 
    file2 

plik1 i plik2 są podobne, ale chcę zobaczyć jak git będzie połączyć je tak, jakby były różne wersje tego samego pliku. Innymi słowy, chcę coś takiego:

git merge-files file1 file2 > merge_of_file1_file2 

Czy istnieje sposób, aby to zrobić?

Odpowiedz

43

To naprawdę nie ma sensu, ponieważ nie zapewniasz wspólnego przodka. Jeśli go masz, możesz użyć:

git merge-file <current-version> <common-ancestor> <other-version> 

Powoduje to umieszczenie wyników w bieżącym pliku wersji; jeśli chcesz je gdzieś indziej, użyj:

git merge-file -p <current> <common> <other> > <dest> 

Potrzebuje wspólnego przodka, aby zapewnić coś do rozważenia zmian w stosunku do. Możesz go zhackować, dostarczając pusty plik lub kopię starszej wersji jednego z nich z historii twojego repozytorium, ale jakość wyników będzie zależeć od tego, jak dobrze wybierzesz wspólnego przodka, ponieważ łączy on dwie różnice , pomiędzy tą a każdą nową wersją. Pusty plik będzie działał dobrze tylko wtedy, gdy oba są podobne (wiele przebiegów co najmniej trzech identycznych linii).

Bez tego wszystko można naprawdę zrobić, to patrzeć na różnice:

git diff --no-index file1 file2 
+2

Co powiesz na użycie kopii jednego z plików jako wspólnego przodka? –

+1

@CarlG, Powiedzmy, że plik2 zawiera jeszcze jeden wiersz niż plik1. Jeśli wybierzesz plik1 jako przodek, wiersz ten zostanie zinterpretowany jako dodatek, więc scalenie będzie miało postać pliku 2. Jeśli wybierzesz plik2 jako ankiestrę, linia zostanie zinterpretowana jako usunięcie i w wyniku otrzymasz plik1. –

+2

@CarlG Innymi słowy, jeśli zaczynasz od A i jedna strona zmienia ją na B, podczas gdy druga strona zachowuje ją jako A, wynik połączony jest wyraźnie B. – Cascabel

29

Za to, co staramy się robić:

touch file3 #empty 
git merge-file file1 file3 file2 

to zrobi trójdrożny scalania plik1 i plik2 z plikiem3 (pusty plik) jako bazą.

Należy zauważyć, że zapisuje to do pliku1. Możesz oczywiście wykonać poniższe czynności, jeśli nie jest to pożądane:

touch file3 
cp file1 merge_of_file1_file2 
git merge-file merge_of_file1_file2 file3 file2 
+1

Sprawdziłem, że to działa (przez Git Bash). Oto funkcja bash pisałem do hermetyzacji to pod jednym poleceniem: '' ' funkcja łączenia() { \t dotykowy __merge_result__ \t git merge-file $ 1 __merge_result__ $ 2 \t rm __merge_result__ } ' '' –

Powiązane problemy