2013-04-26 8 views
9

jestem trochę zaskoczony przez ten ...Dlaczego mam te same rewizje w dwóch oddziałów z różnych skrótów

Mam dwie gałęzie, które mają taką samą serię zatwierdzeń w obu z nich.

Prawdziwą historią jest to, że zostały one napisane przez mojego kolegę, popełnionego i popchniętego na github w oddziale A. Na pewnym etapie połączyłem gałąź A z moim odgałęzieniem B.

To, co teraz wydaje się pokazywać, to jego zeznania w oddziale A, z ich skrótami i tymi samymi zobowiązaniami w moim (rozbieżnym) oddziale, pokazującymi mnie jako autora i innym zestawem skrótów, zmieszanych z pracą, którą byłem robię na moim oddziale.

To wydaje się być pewnego rodzaju kwestią rebase, (obaj używamy GitHubForWindows przez pewien czas, który robi rebase jako część synchronizacji), ale nie jestem świadomy problemu zgłaszanego do któregokolwiek z nas.

Wszelkie pomysły na to, co spowodowało to, lub jak je wyprostować, zostałyby docenione.

+2

Czy użyto 'cherry-pick'? – GoZoner

+0

W przeszłości, tak, ale nie w tej historii. – Andiih

Odpowiedz

4

Powinieneś dostać jakieś elektronarzędzie (zwykły gitk powinno wystarczyć) i ściśle wglądu dopasowanie (ale różniących się mieszań) popełnia — spojrzenie na różnice w polach Author, Committer i Date. Porównaj również skróty nadrzędnych zatwierdzeń, ponieważ obiekty commit również zapisują skróty swoich nadrzędnych zatwierdzeń, więc w przeciwnym razie identyczne zatwierdzenia odnoszące się do różnych nadrzędnych nazw zatwierdzeń SHA-1 będą różne.

Czy mógłbyś także wyjaśnić, w jaki sposób dokładnie twoje przepowiednie są "wymieszane" z tymi, których autorem jest twój rówieśnik? Czy wszystkie te zatwierdzenia tworzą liniową historię lub są punkty scalenia?

To pierwsze oznaczałoby, że użyto przebrania.

Z informacji dostępnych do tej pory chciałbym to zrobić:

  1. Zatrzymaj używając „GitHub for Windows” do nie myślenia rozwiązania mają tendencję do tworzenia sytuacji jesteś stoi teraz: kiedy coś łamie nie masz pomysł, dlaczego się zepsuł i jak się rozbija.
  2. Uzyskaj "regularne" Git for Windows (i może być Git Extensions, jeśli chcesz fantazyjny GUI, który nie próbuje przechytrzyć użytkownika).
  3. Zapisz swoją obecną gałąź oddziału, oddzielając od niej inną gałąź.
  4. (Trudne-) zresetuj gałąź funkcji do gałęzi twojego partnera.
  5. Cherry-pick Twoje zmiany od najstarszego do najnowszego z oddziału, który zapisałeś.

    Może to powodować konflikty (ponieważ te zatwierdzenia zostaną zasiane na innym stanie kodu, który zostały pierwotnie utworzone).

W wyniku otrzymasz oddział, który nie ma "fałszywie tego samego" zatwierdzenia.

Następnie należy zarówno ty i twój wzajemnej przeczytać na scalanie i przebazowania przepływy pracy, przyjąć jedną z nich, a następnie, podczas pracy na oddziałach fabularnych, zrobić albo łączenie i/lub przebazowania rozsądnie, zrozumienia, dlaczego to robisz i co się dzieje w rezultacie. Radziłbym ci, abyś nie polegał na ślepo na narzędziu, aby zrobić Właściwy Rzecz: ™.

+0

Nie używam Githuba do okien - wszystkie odgałęzienia, łączenie naciśnięć i ciągnięć i większość zatwierdzeń robię przez powłokę poshgit. Przeważnie używam go do ustawienia uwierzytelniania na pierwszym miejscu, aby otworzyć powłokę w prawym folderze i wyświetlić historię podstawową. Jednak inni uczestnicy projektu bardziej polegają na tym projekcie. Zrobiliśmy pick cherry i twardy reset. Sortowane. Dzięki. – Andiih

4

Jeśli git rebase jest częścią twojego przepływu pracy, to to, co opisujesz, jest powszechne. Na przykład:

$ git log --graph --oneline --all 
* 76af430 fc   # branch: foo 
| * 7c495ad mb   # branch: bar, master 
|/ 
* 74cbb35 a 

$ git rebase foo  # while on branch master 
First, rewinding head to replay your work on top of it... 
Applying: mb 

$ git log --graph --oneline --all 
* 6810e67 mb   # branch: master 
* 76af430 fc   # branch: foo 
| * 7c495ad mb   # branch: bar 
|/ 
* 74cbb35 a 
+0

Dzięki, to właśnie spowodowało u nas scenariusz opisany powyżej. Tak więc jeśli zmienisz gałąź X na gałąź Y, a ma ona zatwierdzenia z innej gałęzi (nie X i Y, ale inna gałąź, X), utworzy różne skróty (od tych na X). Dlaczego to się dzieje? Czy istnieje sposób, aby temu zapobiec (co oznacza - rozpoznać, że nie są to "rodzime" zatwierdzenia) w hakowaniu przed zmianą? – Kemeia

2

Napotkano ten problem "diff diff diff" po ponownym utworzeniu dwóch rozgałęzionych gałęzi. To samo zatwierdzenie zastosowano do tego samego punktu rozwidlenia, więc zdziwiłem się, widząc, że gałęzie się rozchodzą. Nawet identyfikator patch-id był taki sam.

Patrząc na surowej diff ujawnił, że był „committer czas”, który był różnicę:

$ diff <(git show --format=raw $COMMIT1) \ 
     <(git show --format=raw $COMMIT2) 
1c1 
< commit $COMMIT1 
--- 
> commit $COMMIT2 
5c5 
< committer $ME <[email protected]> 1470128045 +0200 
--- 
> committer $ME <[email protected]> 1470129095 +0200 

ponawianie się rebase z --committer-date-is-author-date na stałym niektóre rozbieżności w rebase git, ale nie wszystkie. (nie jestem pewien, dlaczego .. Myślę, że rozbieżność się na pierwszym rerere seryjnej?)

I następnie wykorzystywane filter-branch jak młotem:

git filter-branch --env-filter \ 
'export GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE'\ 
origin/master..HEAD 

To wystarczyło, aby utrzymać serię w linii:

$ git show --format=raw HEAD | egrep 'author|committer' 
author $ME <[email protected]> 1470065063 +0200 
committer $ME <[email protected]> 1470065063 +0200 
+1

Lepsze polecenie porównania prawie identyczne zatwierdzenia: 'gitshow =" git show --color --format = fuller "; diff -u <($ gitshow $ commit1) <($ gitshow $ commit2) | less -R' Dzięki temu poleceniu mamy czytelny CommitDate (może być inny) i kolorowy diff. – ruvim

Powiązane problemy