Mam gałąź git (na przykład główną linię) i chcę połączyć się z inną gałęzią programistyczną. A może ja?
Aby zdecydować, czy naprawdę chcę scalić tę gałąź, chciałbym zobaczyć podgląd tego, co zrobi scalenie. Najlepiej z możliwością zobaczenia listy stosowanych zmian.
Jak dotąd najlepiej wymyślić merge --no-ff --no-commit
, a potem diff HEAD
.
git merge
igit reset --keep HEAD@{1}
jeśli nie podoba mi się wynik.git reset --keep HEAD@{1}
zwróconejfatal: Cannot do a keep reset in the middle of a merge.
pomocy?--preview
opcji git-merge?Odpowiedzi:
Przekonałem się, że najlepszym rozwiązaniem dla mnie jest po prostu scalenie i przerwanie go, jeśli wystąpią konflikty . Ta szczególna składnia jest dla mnie czysta i prosta. To jest strategia 2 poniżej.
Jeśli jednak chcesz mieć pewność, że nie zepsujesz swojej bieżącej gałęzi lub po prostu nie jesteś gotowy do scalenia niezależnie od istnienia konfliktów, po prostu stwórz z niej nową pod-gałąź i scal:
Strategia 1: Bezpieczny sposób - połącz oddział tymczasowy:
W ten sposób możesz po prostu wyrzucić gałąź tymczasową, jeśli chcesz zobaczyć, jakie są konflikty. Nie musisz zawracać sobie głowy „przerywaniem” scalania i możesz wrócić do swojej pracy - po prostu ponownie zaznacz „mybranch” i nie będziesz mieć żadnego scalonego kodu ani scalania konfliktów w swoim oddziale.
Jest to zasadniczo sucha próba.
Strategia 2: Kiedy zdecydowanie chcesz się połączyć, ale tylko wtedy, gdy nie ma konfliktów
Jeśli git zgłasza konflikty (i TYLKO JEŚLI SĄ konflikty), możesz wtedy:
Jeśli scalenie się powiedzie, nie możesz go przerwać (tylko zresetuj).
Jeśli nie jesteś gotowy do scalenia, użyj bezpieczniejszego sposobu powyżej.
[EDYCJA: 2016-lis - Zamieniłem strategię 1 na 2, ponieważ wydaje się, że większość ludzi szuka „bezpiecznej drogi”. Strategia 2 jest teraz bardziej notatką, że możesz po prostu przerwać scalanie, jeśli scalenie ma konflikty, z którymi nie jesteś gotowy poradzić sobie. Pamiętaj, jeśli czytasz komentarze!]
źródło
git merge --no-ff --no-commit
jeśli nie chcesz bezpośrednio zatwierdzać zmian. Eliminuje to „potrzebę” innej gałęzi i ułatwia przeglądanie zmian, imo.git merge --no-ff --no-commit
? Myślę, że nadal możesz to zrobićgit merge --abort
, jeśli nie podoba ci się to, co widzisz? Nawet jeśli scalenie nie powoduje konfliktów?git reset --hard HEAD
a następnie wypisania innego oddziaługit checkout <different branch name>
i usunięcia tymczasowego oddziaługit delete -b <name of temporary branch>
.git log ..otherbranch
git diff ...otherbranch
gitk ...otherbranch
Pusty ciąg oznacza
HEAD
, więc właśnie dlatego..otherbranch
zamiastHEAD..otherbranch
.Dwie vs. trzy kropki mają nieco inne znaczenie dla diff niż dla poleceń wyświetlających wersje (log, gitk itp.). Dla log i innych dwie kropki (
a..b
) oznaczają wszystko, co jest w środku,b
ale niea
trzy, a trzy kropki (a...b
) oznaczają wszystko, co jest tylko w jednyma
lubb
. Ale diff działa z dwiema wersjami i tam prostszy przypadek reprezentowany przez dwie kropki (a..b
) jest prostą różnicą oda
do,b
a trzy kropki (a...b
) oznaczają różnicę między wspólnym przodkiem ib
(git diff $(git merge-base a b)..b
).źródło
git checkout master
zanim spróbowałam tego. Zastanawiałem się, dlaczego to mówi, że wszystkie moje zmiany zostanągit show ..otherbranch
pokaże listę zmian i różnic, które zostaną połączone w bieżącym oddziale.Jeśli jesteś podobny do mnie, szukasz odpowiednika
svn update -n
. Wygląda na to, że można to zrobić. Pamiętaj, aby zrobićgit fetch
pierwszy, aby lokalne repozytorium zawierało odpowiednie aktualizacje do porównania.lub jeśli chcesz różnicę między głową a pilotem:
IMO to rozwiązanie jest znacznie łatwiejsze i mniej podatne na błędy (a przez to znacznie mniej ryzykowne) niż najlepsze rozwiązanie, które proponuje „scalenie, a następnie przerwanie”.
źródło
$ git checkout target-branch
i wtedy$ git diff --name-status ...branch-to-be-merged
(trzy kropki są niezbędne, więc wpisz je bezWiększość odpowiedzi tutaj albo wymaga czystego katalogu roboczego i wielu interaktywnych kroków (źle dla skryptów), albo nie działa we wszystkich przypadkach, np. Przeszłe scalenia, które już wprowadzają niektóre z zaległych zmian w gałęzi docelowej, lub wybieranie wiśni podobnie.
Aby naprawdę zobaczyć, co zmieni się w
master
oddziale, jeśli połączyszdevelop
się z nim, teraz:- https://git.seveas.net/previewing-a-merge-result.html
(dzięki Davidowi Normingtonowi za link)
PS:
Jeśli wystąpią konflikty scalania, pojawią się one ze zwykłymi znacznikami konfliktu w danych wyjściowych, np .:
Użytkownik @dreftymac ma dobrą rację: sprawia, że nie nadaje się do skryptów, ponieważ nie można tego łatwo odczytać z kodu stanu. Znaczniki konfliktu mogą być bardzo różne w zależności od okoliczności (usunięte vs zmodyfikowane itp.), Co również utrudnia grepowanie. Strzec się.
źródło
true
jeśli występują konflikty ifalse
jeśli nie ma konfliktów (np. Wartość logiczna, która nie wymaga testu „gałki ocznej” ani jakiejkolwiek interwencji człowieka)?git merge-tree ... | grep -q '^[a-z].*in both$' && echo conflict || echo safe to merge
ale jest drobny; Prawdopodobnie zapominam o sprawie. może zamiast tego chcesz sprawdzić znaczniki konfliktu? np. to prawdopodobnie nie łapie konfliktów stylów „ich usunięte, nasze zmienione”. (Właśnie sprawdziłem, a to nawet nie pokazuje znaczników konfliktu, więc potrzebujesz skrupulatnego wyrażenia regularnego, aby być tutaj bezpiecznym)less -R
do obsługi kolorowych wydruków bez zmiany konfiguracji.Jeśli zmiany zostały już pobrane, moim ulubionym jest:
To chyba wymaga git 1.7.x.
@{u}
Notacja jest „skrótem” do górnej gałęzi, więc jest to trochę bardziej wszechstronny niżgit log ...origin/master
.Uwaga: jeśli używasz zsh i rozszerzonego glogu, prawdopodobnie będziesz musiał zrobić coś takiego:
źródło
Dodając do istniejących odpowiedzi, można utworzyć alias pokazujący różnicę i / lub log przed scaleniem. Wiele odpowiedzi pomija czynności
fetch
do wykonania przed „podglądem” scalenia; jest to alias, który łączy te dwa kroki w jeden (emulując coś podobnego do mercurial'shg incoming
/outgoing
)Opierając się na „
git log ..otherbranch
”, możesz dodać następujące elementy do~/.gitconfig
:W przypadku symetrii można użyć następującego aliasu, aby pokazać, co zostało zatwierdzone i zostanie wypchnięte przed wypchnięciem:
Następnie możesz uruchomić „
git incoming
”, aby wyświetlić wiele zmian, lub „git incoming -p
”, aby wyświetlić poprawkę (tj. „Diff”), „git incoming --pretty=oneline
”, aby uzyskać krótkie podsumowanie itp. Następnie możesz (opcjonalnie) uruchomić „git pull
”, aby faktycznie się łączą. (Chociaż, ponieważ już pobrałeś, scalanie można wykonać bezpośrednio.)Podobnie „
git outgoing
” pokazuje, co byś popchnął, gdybyś miał uruchomić „git push
”.źródło
git log currentbranch..otherbranch
da ci listę zatwierdzeń, które przejdą do bieżącego oddziału, jeśli wykonasz scalenie. Zwykłe argumenty do zalogowania, które zawierają szczegółowe informacje na temat zatwierdzeń, dostarczą więcej informacji.git diff currentbranch otherbranch
da ci różnicę między dwoma zatwierdzeniami, które staną się jednym. To będzie różnica, która da ci wszystko, co zostanie scalone.Czy te pomogłyby?
źródło
git log otherbranch..currentbranch
podaje listę zatwierdzeń w currentbranch .git diff otherbranch currentbranch
Daje diff z wersji do-połączyły bieżącym cynk, który jest tak bezużyteczne, jak to może być, bo to, co chcesz, jest diff od podstawy seryjnej do głowy seryjnej.Polecenie ściągnięcia - korzystałem z większości już przesłanych pomysłów, ale często z niego korzystam (zwłaszcza jeśli pochodzi od innego dewelopera), wykonując polecenie ściągnięcia, które daje wygodny sposób na przejrzenie wszystkich zmian w scaleniu przed jego pobraniem miejsce. Wiem, że GitHub nie jest gitem, ale z pewnością jest przydatny.
źródło
Poza faktycznym wykonaniem scalenia w sposób wyrzucany (patrz odpowiedź Kasapo), wydaje się, że nie ma wiarygodnego sposobu, aby to zobaczyć.
Powiedziawszy to, oto metoda, która jest marginalnie bliska:
Daje to uczciwe wskazanie, które zatwierdzenia doprowadzą do scalenia. Aby zobaczyć różnice, dodaj
-p
. Aby zobaczyć nazwy plików, dodać jeden z--raw
,--stat
,--name-only
,--name-status
.Problem z tym
git diff TARGET_BRANCH...SOURCE_BRANCH
podejściem (patrz odpowiedź Jana Hudeca) polega na tym, że różnice w zmianach już znajdują się w gałęzi docelowej, jeśli gałąź źródłowa zawiera scalenia krzyżowe.źródło
Może to może ci pomóc? git-diff-tree - porównuje zawartość i tryb obiektów blob znalezionych przez dwa obiekty drzewa
źródło
Nie chcę używać polecenia git merge jako prekursora do przeglądania plików w konflikcie. Nie chcę wykonywać scalania, chcę zidentyfikować potencjalne problemy przed scaleniem - problemy, które automatyczne scalanie mogą przede mną ukryć. Rozwiązaniem, którego szukałem, jest to, jak git wypluł listę plików, które zostały zmienione w obu gałęziach, które zostaną scalone w przyszłości, w odniesieniu do jakiegoś wspólnego przodka. Po uzyskaniu tej listy mogę użyć innych narzędzi do porównywania plików, aby dalej badać sprawy. Szukałem wiele razy i nadal nie znalazłem tego, czego chcę w natywnym poleceniu git.
Oto moje obejście na wypadek, gdyby to pomogło komukolwiek innemu:
W tym scenariuszu mam oddział o nazwie QA, który ma wiele zmian w stosunku do ostatniej wersji produkcyjnej. Nasze ostatnie wydanie produkcyjne jest oznaczone tagiem „15.20.1”. Mam inną gałąź programistyczną o nazwie new_stuff, którą chcę scalić z gałęzią kontroli jakości. Zarówno QA, jak i new_stuff wskazują na zatwierdzenia, które „podążają” (jak donosi gitk) znacznik 15.20.1.
Oto kilka dyskusji na temat tego, dlaczego jestem zainteresowany kierowaniem na te konkretne pliki:
Jak mogę zaufać scaleniu Git?
/software/199780/how-far-do-you-trust-automerge
źródło