2012-01-16 8 views
15

Mam plik, który ma dwa zobowiązuje interesów, zarówno na Master branży, zarówno tylko modyfikując jeden plik foo: poprzednia popełnić AA i aktualną wersję w HEAD. Chciałbym scalić dwie wersje pliku, zachowując bity obu, w HEAD na Master.GIT: Scalanie stary zobowiązać do obecnego szefa wersji

zrobiłem najprostszą rzeczą, że myślałem, że będzie działać:

git checkout -b merge-purgatory AA 
git commit -m "pulled foo back from previous commit for merging into HEAD." 
git checkout master 
git merge merge-purgatory 

który po prostu nadpisuje aktualną HEAD wersję foo z AA wersji. Wypróbowałem także bardziej gadatliwy git checkout -m, ten sam wynik: głupie nadpisanie.

Jak wymusić na git wersję AA wersja foo jako sprzeczne scalenie z bieżącą wersją HEAD?

Odpowiedz

14

Jeśli seryjnej Git nie robi tego, co chcesz, możesz wykonać następujące czynności zamiast:

  1. Upewnij się, że nie istnieją żadne niezatwierdzone zmiany w pliku, np foo upewniając się, że git status jest czyste.
  2. Zastąp foo z wersją z AA używając: git show AA:foo > foo
  3. sceniczne Selektywnie tylko zmiany od foo, które chcesz z: git add -p foo
  4. odrzucenie wszystkich pozostałych zmian foo z git checkout -- foo
  5. popełnienia inscenizowanych zmian: git commit

Alternatywnie, jeśli wolisz używać narzędzia graficznego do porównywania (np. meld), Można po prostu zrobić:

git show AA:foo > old-foo 
meld old-foo foo 
+2

W zasadzie, po prostu pomiń git wiedzę o poprzednim zatwierdzeniu i użyj ręcznego scalania/mergetool. Miałem nadzieję na bardziej klekoczące zachowanie z Git, ale jest to tak proste, że użyłem go z powodzeniem i po prostu zrobiłem trochę sprzątania później. Dzięki! – Noel

1
git merge --no-commit merge-purgatory 

da Ci przynajmniej możliwość sprawdzenia: zmień scalenie przed jego zatwierdzeniem.
Zobacz także techniki zaproponowane w "How do you merge selective files with git-merge?", na podstawie wyboru wiśni lub zamówienia.


chodzi zmuszając ręczne scalanie, można zadeklarować w .gitatributes file, dla tego konkretnego pliku, politykę scalania włączonego na wyłączony.

Wykonywanie trójdrożny scalić

seryjnej

The attribute merge affects how three versions of a file is merged when a file-level merge is necessary during git merge, and other commands such as git revert and git cherry-pick. 
Unset 

Take wersję z obecnego oddziału jako niepewnego wyniku scalania i deklarują, że scalanie ma konflikty. Jest to odpowiednie dla plików binarnych, które nie mają dobrze zdefiniowanej semantyki scalania.

+0

Czy "recenzja: zmień" przełącznik polecenia lub opcji? – Noel

+0

I, w każdym razie, "Automatyczne scalanie poszło dobrze, zatrzymane przed zgłoszeniem żądania" nie odpowiada na moje pytanie: jak zapobiec "automatycznemu scaleniu" i zamiast tego traktować obie wersje jako sprzeczne (są one, nadpisując nawzajem wiersze) i wymagając ręcznego scalenia? – Noel

+0

@Noel: Przepraszam, zaatakowałem część ręcznego scalania. Edytowałem swoją odpowiedź. – VonC

3

Dotychczasowe odpowiedzi nie przechowuje historię zmian, więc fakt, że użyty poprzedni popełnić wygenerować nowy popełnić. Poniższa procedura pozwoli zachować tę historię.

git checkout -b merge-purgatory AA 

tutaj należy nieznacznie zmodyfikować plik, na przykład można dodać pustą linię. Następnie w ten sposób połączenie nie powiedzie się, a następnie wystarczy rozwiązać konflikt. To działało dla mnie.

Powiązane problemy