2012-06-07 21 views
55

Mam dwa odgałęzienia z dokładnie tym samym plikiem (należy się zastanowić, że jest to plik .sql) i chcę je interaktywnie scalić.Git Interactive Merge?

Prawie chcę otworzyć program typu diff, tak jak robię to w przypadku konfliktu (lub wiersza poleceń) i wybrać dokładnie, które wiersze przechodzą.

Czy jest to w ogóle możliwe?

Odpowiedz

52

Tak, ale najczęściej będzie to wykonywane ręcznie. Powiesz Gitowi, że scalasz dwie odpowiednie gałęzie, ale to nie powinno próbować zatwierdzić wyniku samodzielnie, (zredagowany, aby dodać:, ani nie przewinąć do przodu, jeśli sądzi, że scalanie jest trywialne):

git merge --no-commit --no-ff branch-to-merge 

Potem pytasz git do pliku, ponieważ pojawiła się w dwóch oddziałach:

git show HEAD:filename >filename.HEAD 
git show branch-to-merge:filename >filename.branch 

i ich podstawy seryjnej,

git show `git merge-base HEAD branch-to-merge`:filename >filename.base 

będziesz połączyć je USI Narzędzie ng cokolwiek chcesz (np)

meld filename.{HEAD,branch,base} 

będziesz etapie, że (git add filename), a następnie popełnić scalanie (git commit).

+4

I robisz to wszystko jak ...? –

+1

Zastanawiasz się nad tym samym Graham ... Próbowałem zrobić 'git merge --no-commit branch' i to się połączyło ... Chciałbym mieć 3 pliki lub 2 pliki. Że mogę użyć diff i przenieść wszystko, co chcę do tego pliku. – Steven

+0

Jeśli chcesz, aby oryginalne polecenie scalania pozostawiło * wszystko * w spokoju, do zrobienia ręcznie, możesz nazwać je 'git merge -s ours', aby zachować wszystko, co jest w aktualnej gałęzi, ale to od Ciebie zależy, czy upewnij się, że zmiany w innych plikach przejmują kontrolę. – Novelocrat

1

Można po prostu użyć WinMerge, DiffMerge lub dowolnego dostępnego narzędzia interfejsu do porównywania/scalania, aby wykonać pracę ręcznie. Jeśli chcesz podłączyć go do "git difftool", możesz przeszukiwać online, aby znaleźć sposoby, aby te narzędzia działały z git.

35

Najprostszym sposobem jest zrobienie git merge <other_branch, a następnie git mergetool, aby graficznie rozwiązać konflikty. Zobacz # 10935226, jak skonfigurować mergetool.

Zaczep jest taki, że zmieniony plik może szybko przewinąć do przodu w połączeniu ze starszym. Następnie musisz stać się bardziej sprytny.

Novelcrat daje świetny sposób na głębsze kopanie, ale często będziesz musiał zmienić początkowe polecenie na git merge --no-commit --no-ff <other_branch>, ponieważ --no-commit naprawdę oznacza "Nie dokonuj scalenia ... chyba że jest to szybkie forwardować. " To trochę żądło dla wielu ludzi, którzy próbują robić dokładnie to, co chcesz.

Czasami najmniej mylący sposób nie jest zbyt stylowy: sprawdź inny oddział w innej kopii roboczej, użyj ulubionego narzędzia scalania, aby uzyskać żądaną wersję w wybranym katalogu, a następnie ją zatwierdz.

+1

10935226 to numer tego pytania. Co miałeś zamiar tam napisać? –

21

W tym sensie, gdzie temp może być istniejącą gałęzią.

https://gist.github.com/katylava/564416


Na Master:

git checkout -b temp 

Na temp:

git merge --no-commit --no-ff refactor 

... które etapy wszystko, więc:

git reset HEAD 

Następnie rozpocząć dodawanie elementów chcesz:

git add --interactive 
+1

To działało, ale musiałem zostawić "głowę" w "git reset head", ale reset git działał dobrze. – Micah

+0

Ostateczne 'git commit' nie robi scalenia! - Jak zakończyć połączenie w końcu? –

+0

@RobertSiemer Być może domyślam się, że możesz wykonać normalne scalanie w następnych krokach: git co master; git merge temp –

13

z gałęzi, które chcesz scalić:

git checkout -p branch_to_merge -- 

To nie będzie kasy na branch_to_merge, ale pozwoli Ci interaktywnie dodać kromkami z łatka (diff).

http://git-scm.com/docs/git-checkout

0

Najlepszym sposobem znalazłem to zrobić:

  1. Zamówienie oddział ze zmianami
  2. Utwórz nowy oddział z tego punktu
  3. Wyczyść swój nowy oddział zatwierdzenie, które chcesz porównać i zbudować. Reset będzie domyślnie "mieszanym" resetowaniem, co oznacza, że ​​nie zmieni "drzewa roboczego", czyli rzeczywistych plików kodu
  4. W tym momencie mój edytor tekstu (VSCode) pokazuje mi, co różni się moim obecnym pliki i zatwierdzenie, do którego zresetowałem. Mogę edytować kod, aby wybrać linie, które chcę zatwierdzić. To, co się robi, pozwala mi zobaczyć wszystko, co zmieniła moja gałąź, i potwierdzić każdą linię kodu, którą złożę. Jest to przydatne, na przykład przed scaleniem moich zmian z powrotem do produkcji.
Powiązane problemy