Utworzono nowy oddział z master
, nazywamy go test
.
Istnieje kilku programistów, którzy albo zobowiązują się, master
albo tworzą inne gałęzie, a następnie łączą się z nimi master
.
Załóżmy, że praca test
trwa kilka dni i chcesz być na test
bieżąco z zatwierdzeniami w środku master
.
Zrobiłbym git pull origin master
z test
.
Pytanie 1: Czy to właściwe podejście? Inni programiści mogliby z łatwością pracować na tych samych plikach, co ja btw.
Moja praca test
jest zakończona i jestem gotowy, aby połączyć ją z powrotem master
. Oto dwa sposoby, o których mogę myśleć:
ZA:
git checkout test
git pull origin master
git push origin test
git checkout master
git pull origin test
B:
git checkout test
git pull origin master
git checkout master
git merge test
Nie używam, --rebase
ponieważ z mojego zrozumienia, rebase pobierze zmiany master
i ułoży moje na wierzchu, dzięki czemu może zastąpić zmiany dokonane przez innych ludzi.
Pytanie 2: Która z tych dwóch metod jest odpowiednia? Jaka jest tam różnica?
Wszystko to ma na celu informowanie mojej test
gałęzi o bieżących wydarzeniach, master
a później mógłbym połączyć je z powrotem w master
nadziei, że oś czasu będzie możliwie jak najbardziej liniowa.
Odpowiedzi:
Jak bym to zrobił
Jeśli mam oddział lokalny ze zdalnego, nie czuję się dobrze z połączeniem innych oddziałów niż ten ze zdalnym. Nie będę też naciskał na moje zmiany, dopóki nie będę zadowolony z tego, co chcę naciskać, a także nie będę w ogóle naciskał na rzeczy, które są tylko dla mnie i mojego lokalnego repozytorium. W twoim opisie wydaje się, że
test
to tylko dla ciebie? Więc nie ma powodu, aby go opublikować.git zawsze stara się szanować twoje i inne zmiany, i tak też będzie
--rebase
. Nie sądzę, że potrafię to odpowiednio wytłumaczyć, więc spójrz na książkę Git - Rebasing lub gotowa na git: wprowadzenie do rebasingu dla krótkiego opisu. To całkiem fajna funkcjaźródło
git merge test
daje mifatal: 'test' does not point to a commit
. Muszę poszukaćgit log
punktu zatwierdzenia na gałęzi testowej, przełączyć się z powrotem na gałąź master, a następnie zrobićgit merge 0f37d3154abbf52a4cbbbb5109f08af6a7567234
.test
musi istnieć. Oczywiście możesz zamiast tego użyć skrótu zatwierdzenia, ale zwykle łatwiej jest użyć nazwy gałęzi. Wewnętrznie po prostu pobiera skrótHEAD
gałęzi.To bardzo praktyczne pytanie, ale wszystkie powyższe odpowiedzi nie są praktyczne.
Lubić
Podejście to ma dwa problemy :
Jest to niebezpieczne, ponieważ nie wiemy, czy występują jakiekolwiek konflikty między gałęzią testową a gałęzią główną.
Spowodowałoby to „ściśnięcie” wszystkich zatwierdzeń testowych w jednym zatwierdzeniu scalania na wzorcu; to znaczy w gałęzi master, nie widzimy wszystkich dzienników zmian gałęzi testowej.
Kiedy więc podejrzewamy, że wystąpią jakieś konflikty, możemy wykonać następujące operacje git:
Testuj
merge
wcześniejcommit
, unikaj zatwierdzania szybkiego przewijania do przodu--no-ff
,Jeśli wystąpi konflikt, możemy uruchomić,
git status
aby sprawdzić szczegóły dotyczące konfliktów i spróbować je rozwiązaćKiedy rozwiążemy konflikty lub jeśli nie będzie konfliktu, my
commit
ipush
oniAle w ten sposób utracona zostanie historia zmian zalogowana w gałęzi testowej i utrudniłoby to gałęzi master zrozumienie historii projektu przez innych programistów.
Najlepszą metodą jest, aby
rebase
zamiast tego zastosowaćmerge
(załóżmy, że w tym czasie rozwiązaliśmy konflikty gałęzi).Poniżej znajduje się jeden prosty przykład, dla zaawansowanych operacji, patrz http://git-scm.com/book/en/v2/Git-Branching-Rebasing
Tak, kiedy skończysz cholewkę, wszystkie zatwierdzenia gałęzi Test zostaną przeniesione na głowę gałęzi Master. Główną zaletą bazowania jest to, że otrzymujesz liniową i znacznie czystszą historię projektu.
Jedyne, czego musisz unikać: nigdy nie używaj
rebase
w oddziale publicznym, takim jak oddział główny.Nigdy nie wykonuj takich operacji jak:
Szczegóły dotyczące https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing
dodatek:
źródło
Ani rebase, ani scalanie nie powinny nadpisywać niczyich zmian (chyba że zdecydujesz się to zrobić podczas rozwiązywania konfliktu).
Zwykłe podejście podczas opracowywania to
Kiedy będziesz gotowy ponownie połączyć się z mistrzem,
Jeśli martwisz się zerwaniem czegoś podczas scalania,
git merge --abort
jest do Twojej dyspozycji.Używanie push, a następnie pull jako sposobu łączenia jest głupie. Nie jestem również pewien, dlaczego przesuwasz test do pochodzenia.
źródło
git stash
to.Najpierw uczynię gałąź, która ma zostać połączona, tak czystą, jak to możliwe. Uruchom testy, upewnij się, że stan jest taki, jak chcesz. Oczyść nowe zatwierdzenia przez git squash .
Oprócz odpowiedzi KingCrunches , sugeruję użyć
Być może dokonałeś wielu zmian w drugiej gałęzi, która powinna być tylko jedną zmianą w gałęzi głównej. Aby zachować historię zatwierdzeń tak czystą, jak to możliwe, możesz chcieć zgnieść wszystkie swoje zatwierdzenia z gałęzi testowej do jednego zatwierdzenia w gałęzi głównej (zobacz także: Git: Zgnieść czy nie zgnieść? ). Następnie możesz również przepisać komunikat zatwierdzenia na coś bardzo ekspresyjnego. Coś, co jest łatwe do odczytania i zrozumienia, bez zagłębiania się w kod.
edytuj: Możesz być zainteresowany
Tak więc na GitHub kończę w następujący sposób dla gałęzi funkcji
mybranch
:Otrzymuj najnowsze informacje o pochodzeniu
Znajdź skrót bazowy scalania:
Teraz upewnij się, że tylko pierwsza jest
pick
, reszta tos
:Następnie wybierz bardzo dobry komunikat zatwierdzenia i prześlij na GitHub. Złóż wniosek ściągania.
Po scaleniu żądania ściągnięcia możesz je usunąć lokalnie:
i na GitHub
źródło
Stary wątek, ale nie znalazłem sposobu na zrobienie tego. Może to być cenne dla kogoś, kto pracuje z rebase i chce połączyć wszystkie zatwierdzenia z gałęzi (funkcji) na master. Jeśli na drodze jest konflikt, możesz go rozwiązać dla każdego zatwierdzenia. Zachowujesz pełną kontrolę podczas procesu i możesz przerwać w dowolnym momencie.
Otrzymuj aktualne informacje o Master i Branch:
Scal gałąź na Master:
Opcjonalne: Jeśli podczas Rebase napotkasz Konflikty:
Najpierw rozwiąż konflikt w pliku. Następnie:
Wciśnij swój rebased oddział:
Teraz masz dwie opcje:
Gotowy.
źródło
Jest to przepływ pracy, którego używam w pracy w zespole. Scenariusz jest taki, jak opisano. Po pierwsze, kiedy skończę pracę
test
, dokonuję zmian w bazie danych z master, aby pobrać wszystko, co zostało dodane do master w czasie, gdy pracowałem nadtest
gałęzią.git pull -r upstream master
Spowoduje to wyciągnięcie zmian do wzorca, ponieważ rozwidliłeś
test
gałąź i zastosujesz je, a następnie zastosujesz wprowadzone zmiany, aby przetestować „nad” bieżącym stanem wzorca. Mogą występować konflikty, jeśli inne osoby wprowadziły zmiany do tych samych plików, które edytowałeś w teście. Jeśli tak, musisz je naprawić ręcznie i zatwierdzić. Gdy to zrobisz, będziesz mógł przejść do gałęzi master i połączyćtest
się bez problemów.źródło
Po scaleniu, jeśli plik zostanie zmieniony, to po scaleniu wystąpi błąd „Rozwiąż konflikt”
Więc najpierw musisz rozwiązać wszystkie swoje konflikty, a następnie ponownie zatwierdzić wszystkie zmiany, a następnie pchnąć
Lepiej to zrobić, kto dokonał zmian w gałęzi testowej, ponieważ wiedział, jakie zmiany dokonał.
źródło
Użyłbym metody rebase. Głównie dlatego, że doskonale odzwierciedla twój przypadek semantycznie, tj. co chcesz zrobić, to odświeżyć stan twojego obecnego oddziału i „udawać”, jakby był oparty na najnowszym.
Tak więc, nawet nie sprawdzając
master
, chciałbym:Oczywiście samo pobieranie z miejsca początkowego nie odświeża lokalnego stanu twojego
master
(ponieważ nie wykonuje scalania), ale jest to całkowicie w porządku dla naszego celu - chcemy uniknąć przełączania się ze względu na oszczędność czasu.źródło
@ Odpowiedź KingCruncha powinna działać w wielu przypadkach. Jednym z problemów, które mogą się pojawić, jest to, że możesz być na innym komputerze, który musi pobrać najnowszą wersję z testu. Więc najpierw polecam test ciągnący. Wersja wygląda następująco:
źródło
Musisz pobrać gałąź do pobrania, ponieważ ciągnięcie oznacza scalenie się w master i potrzebujesz drzewa pracy, aby się połączyć.
Nie musisz najpierw sprawdzać; rebase robi właściwą rzecz z dwoma argumentami
git push domyślnie wypycha wszystkie gałęzie, które istnieją tutaj i na pilocie
źródło
Jak mówi tytuł „Najlepszy sposób”, myślę, że warto rozważyć strategię łączenia cierpliwości .
Od: https://git-scm.com/docs/merge-strategies
Stosowanie:
Alias Git
Zawsze używam do tego aliasu, np. Uruchamiam raz:
Teraz możesz zrobić:
źródło
To jest z GitLab: Postępuj zgodnie z instrukcjami:
źródło
Odpowiem według gałęzi deweloperskich i fabularnych,
jeśli jesteś w gałęzi funkcji i chcesz ją zaktualizować za pomocą rozwijania użyj poniższych poleceń: git checkout rozwijaj git pull git Checkout feature / xyz git merge develop
Teraz Twoja funkcja została zaktualizowana o programowanie, dzięki czemu możesz wprowadzać zmiany.
źródło