gałąź master i' origin/master 'zostały rozdzielone, jak "rozdzielić ' gałęzie'?

Jakoś moja master i moja origin/master gałąź się rozeszły.
Nie chcę, żeby się rozeszły.

Jak mogę zobaczyć te różnice i połączyć je ?

 1049
Author: Penny Liu, 2010-03-16

15 answers

Możesz przejrzeć różnice za pomocą:

git log HEAD..origin/master

Before pulling it (fetch + merge) (Zobacz także " Jak sprawić, by git zawsze ściągał z konkretnej gałęzi?")


Gdy masz wiadomość typu:

"twoja gałąź i' origin / master ' różnią się od siebie, # i mają odpowiednio 1 i 1 różne commity."

, sprawdź czy musisz zaktualizować origin. Jeśli {[7] } jest aktualne, to niektóre commity zostały zepchnięte do origin z innego repo, podczas gdy tworzyłeś własne commity lokalnie.

... o ---- o ---- A ---- B  origin/master (upstream work)
                   \
                    C  master (your work)

Oparłeś commit C na commicie A, ponieważ była to najnowsza praca, którą w tym czasie pobrałeś z źródła.

Jednak zanim próbowałeś wrócić do origin, ktoś inny popchnął commita B.]} Historia rozwoju rozeszła się po osobnych ścieżkach.

Można następnie scalić lub rebase. Zobacz Pro Git: Git Branching-Rebasing dla szczegóły.

Merge

Użyj polecenia git merge:

$ git merge origin/master

To mówi Gitowi, aby zintegrował zmiany z origin/master do twojej pracy i stworzył commit scalający.
Wykres historii wygląda teraz tak:

... o ---- o ---- A ---- B  origin/master (upstream work)
                   \      \
                    C ---- M  master (your work)

Nowe merge, commit M, ma dwoje rodziców, z których każdy reprezentuje jedną ścieżkę rozwoju, która doprowadziła do zawartości przechowywanej w tym commicie.

Zauważ, że historia ZA M jest teraz nieliniowa.

Rebase

Użyj polecenia git rebase:

$ git rebase origin/master

To mówi Gitowi, aby odtworzył commit C (Twoją pracę) tak, jakbyś oparł ją na commicie B zamiast A.
Użytkownicy CVS i Subversion rutynowo zmieniają swoje lokalne zmiany na początku pracy, gdy aktualizują je przed zatwierdzeniem.
Git po prostu dodaje wyraźne oddzielenie pomiędzy krokami commit i rebase.

Wykres historii wygląda teraz tak:

... o ---- o ---- A ---- B  origin/master (upstream work)
                          \
                           C'  master (your work)

Commit C ' jest nowym commit utworzony przez polecenie Git rebase.
Różni się od C na dwa sposoby:

  1. ma inną historię: B zamiast A.
  2. jego zawartość odpowiada zmianom zarówno w B, jak i C; jest taka sama jak M z przykładu merge.

Zauważ, że historia za C ' jest nadal liniowa.
Postanowiliśmy (na razie) zezwolić tylko na historię liniową w cmake.org/cmake.git.
Takie podejście zachowuje dotychczasowy przepływ pracy oparty na CVS i może ułatwić Przejście.
Próba wciśnięcia C' do naszego repozytorium będzie działać (zakładając, że masz uprawnienia i nikt nie pchnął podczas rebasingu).

Polecenie git pull zapewnia skrócony sposób pobierania z origin i rebase lokalnej pracy na nim:

$ git pull --rebase

Łączy powyższe kroki fetch i rebase w jedno polecenie.

 1077
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-16 03:57:00

Miałem to i jestem zdumiony, co spowodowało to, nawet po przeczytaniu powyższych odpowiedzi. Moim rozwiązaniem było zrobić

git reset --hard origin/master

To po prostu resetuje moją (lokalną) kopię master (która, jak zakładam, jest schrzaniona) do właściwego punktu, reprezentowanego przez (zdalny) origin/master.

Uwaga : stracisz wszystkie zmiany, które nie zostały jeszcze wprowadzone do origin/master.

 806
Author: skiphoppy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-22 17:59:11
git pull --rebase origin/master 

Jest pojedynczym poleceniem, które może Ci pomóc przez większość czasu.

Edit: pobiera commity z origin/master i stosuje twoje zmiany do nowo pobranej historii gałęzi.

 55
Author: asitmoharna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-21 12:58:08

Znalazłem się w tej sytuacji, kiedy próbowałemrebase gałęzi, która śledziła zdalną gałąź, i próbowałem rebase go na master. W tym scenariuszu, jeśli spróbujesz rebase, najprawdopodobniej znajdziesz swoją gałąź rozbieżną i może to spowodować bałagan, który nie jest dla Git nubees!

Powiedzmy, że jesteś na gałęzi my_remote_tracking_branch, która została rozgałęziona od master

$ git status

# na gałęzi my_remote_tracking_branch

Nothing to commit (working directory clean)

A teraz próbujesz rebase z master jako:

Git rebase master

Przestań i oszczędź sobie kłopotów! Zamiast tego użyj merge jako:

Git merge master

Tak, skończysz z dodatkowymi commitami na swojej gałęzi. Ale jeśli nie jesteś gotowy na" nierozróżniające się " gałęzie, będzie to znacznie płynniejszy przepływ pracy niż rebasing. Zobacz ten blog o wiele bardziej szczegółowe wyjaśnienie.

Na z drugiej strony, jeśli twoja gałąź jest tylko lokalną gałęzią (tzn. nie jest jeszcze wciśnięta do żadnego pilota), zdecydowanie powinieneś zrobić rebase (i twoja gałąź nie będzie rozbiegać się w tym przypadku).

Teraz jeśli czytasz to, ponieważ już Jesteś w" rozbieżnym "scenariuszu z powodu takiego rebase' u, możesz wrócić do ostatniego commita z origin (tj. w stanie nierozróżniającym się) używając:

Git reset --hard origin / my_remote_tracking_branch

 32
Author: paneer_tikka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

W moim przypadku oto, co zrobiłem, aby spowodować rozbieżne wiadomość: zrobiłem git push, ale potem zrobiłem git commit --amend, aby dodać coś do wiadomości commit. Potem zrobiłem jeszcze jedno zobowiązanie.

Więc w moim przypadku oznaczało to po prostu pochodzenie / master był Nieaktualny. Ponieważ wiedziałem, że nikt inny nie dotyka origin / master, poprawka była trywialna: git push -f (Gdzie -f oznacza siłę)

 26
Author: Darren Cook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-23 03:03:45

W moim przypadku przesunąłem zmiany na origin/master, a potem zdałem sobie sprawę, że nie powinienem był tego robić: - (skomplikował to fakt, że lokalne zmiany były w poddrzewie. Wróciłem więc do ostatniego dobrego commita przed" złymi " lokalnymi zmianami (używając SourceTree) i otrzymałem "komunikat dywergencji".

Po naprawieniu mojego bałaganu lokalnie (szczegóły nie są tutaj ważne) chciałem "cofnąć się w czasie" do zdalnej gałęzi origin/master tak, aby znów była zsynchronizowana z lokalną master. Na rozwiązanie w moim przypadku było:

git push origin master -f

Zwróć uwagę na przełącznik -f (force). To usunęło "złe zmiany", które zostały przez pomyłkę przesunięte do origin/master i teraz lokalne i zdalne gałęzie są zsynchronizowane.

Należy pamiętać, że jest to potencjalnie destrukcyjna operacja, więc wykonaj ją tylko wtedy, gdy jesteś w 100% pewien, że" cofnięcie " zdalnego mistrza w czasie jest OK.

 12
Author: Laryx Decidua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-27 08:58:44

Wiem, że jest tu wiele odpowiedzi, ale myślę, że git reset --soft HEAD~1 zasługuje na uwagę, ponieważ pozwala zachować zmiany w ostatnim lokalnym (nie pchanym) commicie podczas rozwiązywania rozbieżnego stanu. Myślę, że jest to bardziej wszechstronne rozwiązanie niż pull z rebase, ponieważ lokalny commit może zostać przejrzany, a nawet przeniesiony do innej gałęzi.

Kluczem jest użycie --soft, zamiast ostrego --hard. Jeśli jest więcej niż 1 commit, powinna zadziałać odmiana HEAD~x. Więc tutaj są wszystkie kroki, które rozwiązały moją sytuację (miałem 1 lokalny commit i 8 commitów w zdalnym):

1) git reset --soft HEAD~1 aby cofnąć lokalny commit. W następnych krokach użyłem interfejsu w SourceTree, ale myślę, że następujące polecenia również powinny działać:

2) git stash do ukrycia zmian od 1). Teraz wszystkie zmiany są bezpieczne i nie ma już rozbieżności.

3) git pull aby uzyskać zdalne zmiany.

4) git stash pop lub git stash apply, Aby zastosować ostatnią Ukryte zmiany, a następnie nowy commit, jeśli chcesz. Ten krok jest opcjonalny, wraz z 2), Kiedy chcesz kosza zmian w Local commit. Ponadto, jeśli chcesz przejść do innej gałęzi, ten krok powinien zostać wykonany po przejściu na żądaną.

 6
Author: Bianca Daniciuc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-22 13:54:48

Aby zobaczyć różnice:

git difftool --dir-diff master origin/master

Wyświetli zmiany lub różnice między dwoma gałęziami. W araxis (Mój ulubiony) wyświetla go w stylu diff folderu. Pokazanie każdego ze zmienionych plików. Następnie mogę kliknąć plik, aby zobaczyć szczegóły zmian w pliku.

 4
Author: C Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-28 17:42:03

W moim przypadku było to spowodowane brakiem rozwiązania konfliktu.

Problem był spowodowany uruchomieniem komendy git pull. Zmiany w pochodzeniu doprowadziły do konfliktów z moim lokalnym repo, które rozwiązałem. Nie popełniłem ich jednak. Rozwiązaniem w tym momencie jest zatwierdzenie zmian (git commit rozwiązany plik)

Jeśli zmodyfikowałeś również niektóre pliki od czasu rozwiązania konfliktu, polecenie git status wyświetli lokalne modyfikacje jako niestagowane lokalne modyfikacje i scalanie rozdzielczości jako modyfikacje lokalne. Można to właściwie rozwiązać, zatwierdzając zmiany od scalenia najpierw przez git commit, a następnie dodając i zatwierdzając nieakceptowane zmiany jak zwykle(np. przez git commit -a).

 3
Author: Mohammad Reza Esmaeilzadeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-27 18:19:53

Naprawiłem to przenosząc do commit_sha że ostatni jest oddany do origin/master.

git reset --hard commit_sha

WARNING : stracisz wszystko, co zostało popełnione po zatwierdzeniu 'commit_sha'.

 2
Author: Shohin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-28 11:41:26

Wolę robić to wygodniej i bezpieczniej.

# copying your commit(s) to separate branch
git checkout <last_sync_commit>
git checkout -b temp
git cherry-pick <last_local_commit>

git checkout master
git reset --soft HEAD~1 # or how many commits you have only on local machine
git stash               # safer, can be avoided using hard resetting on the above line
git pull
git cherry-pick <last_local_commit>

# deleting temporary branch
git branch -D temp
 1
Author: igronus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-01 12:42:12

Miałem ten sam komunikat, gdy próbowałem edytować ostatnią wiadomość commit, z już wypchniętego commita, używając: git commit --amend -m "New message" Kiedy wcisnąłem zmiany używając git push --force-with-lease repo_name branch_name nie było żadnych problemów.

 0
Author: LoveForDroid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-28 15:55:11

Spotkałem się z tym problemem, gdy stworzyłem gałąź opartą na gałęzi a przez

git checkout -b a

A potem ustawiłem strumień gałęzi a na początek gałęzi B przez

git branch -u origin/B

Potem dostałem komunikat o błędzie powyżej.

Jednym ze sposobów rozwiązania tego problemu było:]}
  • Usuń gałąź a
  • Utwórz nową gałąź b przez
git checkout -b b origin/B
 0
Author: Jeff Wong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-10 07:16:37

Zastąp 123 liczbą commitów, które Twoja gałąź oddzieliła się od origin.

git reset HEAD~123 && git reset && git checkout . && git clean -fd && git pull
 0
Author: dsmith63,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-02 15:46:58

Git reset --soft origin / my_remote_tracking_branch

This way you will not loose your local changes
 0
Author: GPopat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-25 15:08:32