2013-06-07 20 views
6

Załóżmy, że mam projekt na oddział MASTER z 100s plików php. Aby wykonać poprawek błędów w projekcie, i utworzyć oddzielną gałąźjak scalić określone pliki w git

git checkout -b bugfix 

Następnie po poprawiania błędów w 3 plików (na przykład index.php, register.php i login.php), i połączyć je w mistrz oddziału

git checkout master 
git merge bugfix 

powyższy kod będzie łączyć wszystkie 3 pliki i dokonane zmiany, ale czy jest tak, że mogę zmusić GIT scalić tylko 2 pliki, powiedzmy login.php i register.php tylko?

+1

Myślę, że jednym ze sposobów byłoby zatwierdzenie tych dwóch plików w jednym zatwierdzeniu, a ostatnie w drugim, myślę, że można określić commit i scalić tylko jeden. – dutt

+0

@dutt Problem z OP polega na tym, że zmiany w plikach są już zatwierdzone, jak sądzę. – arkascha

+0

Może to pomoże znaleźć sposób http://stackoverflow.com/questions/449541/how-do-you-merge-selective-files-with-git-merge – hellectronic

Odpowiedz

0

Nie można zarejestrować częściowego scalenia w Git, wszystkie scalenia muszą łączyć wszystkie drzewa katalogów głównych wszystkich scalanych commitów.

Oczywiście można zdecydować się na rozwiązanie tego scalenia, wybierając niezmienioną kopię jednego z plików jednego z rodziców, ale jest to nadal "pełne" scalenie, a zmiany w tym pliku zostaną uznane za scalone jeśli chodzi o późniejsze rebazy lub połączenia między zaangażowanymi oddziałami.

0

Nie, nie istnieje bezpośredni sposób. Chociaż; możesz wybrać pliki z gałęzi, które chcesz scalić i zastąpić je istniejącymi w gałęzi głównej. Komendy w kolejności są:

git checkout master 
git show bugfix:login.php > login.php 
git show bugfix:register.php > register.php 
git add . 
git commit -m "Select login and register from branch/bugfix" 

Ok, powyższa metoda "zniszczyć" Historia pliku. Istnieje stara dyskusja o tym samym w this mailing list.

Z technicznego punktu widzenia, rzecz, która sprawia, że ​​historia sprawę (i dlaczego „zestaw zobowiązuje w porządku chronologicznym” jest bezużyteczny) dlatego, że daje nam wspólnego przodka! I , że jest jedyną rzeczą, która ma znaczenie.

Co jest zasadniczo nie tak z robieniem historii pliku?

Teraz, jeśli podążyłeś za tym argumentem, powinieneś pójść "Aaahh! Oczywisty!".

Ignorowanie wielu akapitów; znajdziesz rozwiązania:

git diff commit..othercommit filename | git-apply --index && git commit 

W twoim przypadku, commit = hash udać/głównego oddziału; i othercommit = hash gałęzi błędu.

+0

Nie łączy gałęzi w 'master'. – axiac

3

Poniżej rozwiązanie zostanie przyjęte z a blog post

Okazało się, że kasa może być również pomocne w tej sprawie. Można po prostu objaśnień (kasa) te konkretne pliki z innego oddziału:

# switch to the branch you want to be your merge destination 
git checkout master 

# checkout specific files from specific branch 
git checkout bugfix login.php register.php 

# check the status 
git status 

# merge them in 
git commit -m "your merge comment" 
+0

Nie łączy gałęzi w 'master'. – axiac

+1

@axiac, jeśli przeczytasz dokładnie to pytanie, uświadomisz sobie, że pytanie nie dotyczy scalania gałęzi, chodzi o scalenie pliku (co jest niewłaściwą terminologią do przenoszenia określonego pliku z innej gałęzi do pożądanej gałęzi). Rozwiązanie powyżej działa –

0

można symulować zachowanie chcesz, ale to, co dzieje się ze zmianami robiłeś na trzecim pliku?

Zmiany w trzecim pliku pozostają w zatwierdzeniach w oddziale, ale nie będą obecne w scalonym zatwierdzeniu, tak jak plik nie został zmodyfikowany w ogóle w oddziale.

ten sposób można to zrobić:

git checkout master 
git merge bugfix --no-commit 

Opcja --no-commit mówi git scalić pliki, ale powstrzymać przed ich popełnieniem. Możesz teraz sprawdzać pliki, zmieniać je, robić, co chcesz. Aby anulować zmiany, które robiłeś na index.php można uruchomić:

git checkout master -- index.php 

Running git status widać, że index.php nie pojawia się jako zmodyfikowana więcej (ani w indeksie lub w drzewie roboczy). Teraz możesz git commit i to wszystko.

+0

To rozwiązanie jest jak zmiana wszystkich plików, a następnie spróbuj ręcznie poprawić bałagan !! przeczytaj [ten post] (http://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/), aby dowiedzieć się, o czym jest ten stos i dlaczego twoje rozwiązanie to strata czasu i pracy. –