Git - praca nad niewłaściwą gałęzią - jak skopiować zmiany do istniejącej gałęzi tematu

333

Pracowałem nad projektem, ale niestety zapomniałem przejść do mojego oddziału i jako taki pracowałem nad master

Jak mogę skopiować pracę (3 pliki), którą tutaj wykonałem, z głównego, do mojego oddziału (nazywanego na przykład branch123 ) bez angażowania się w master?

Alex
źródło

Odpowiedzi:

540

Wygląda na to, że wszystko czego potrzebujesz to:

git stash
git checkout branch123
git stash apply

Powinieneś wrócić do swojej gałęzi, nie dotykając gałęzi głównej.

gnab
źródło
6
ok - uruchomiłem to, ale kiedy przełączę się z powrotem na master (git checkout master) i uruchomię status git, te same pliki są nadal „modyfikowane” - czy jest to oczekiwane?
Alex
5
Być może nie będziesz musiał ukrywać, jeśli różnice między bieżącą gałęzią (master) a gałęzią tematyczną (branch123) nie znajdują się w żadnym pliku, który zmodyfikowałeś lokalnie. W tym przypadku Git pozwoli ci po prostu sprawdzić gałąź tematu.
Cascabel
3
@Alex: Tak, należy się tego spodziewać. Nie dotyczy to zobowiązań. stashzapisuje lokalne modyfikacje, a następnie stash applyprzywraca je.
Cascabel
6
jak mogę się ich „pozbyć” z gałęzi master… aby zostawić to czyste?
Alex
7
git reset --hard HEADi wróciłeś do ostatniego zatwierdzenia dokonanego w gałęzi master.
gnab
46

Przyjęta odpowiedź jest najdokładniejsza, ale istnieje szczególny przypadek, w którym można uprościć. Jeśli pliki, które zmodyfikowałeś w katalogu roboczym, są identyczne w obu masteri branch123możesz to zrobić po prostu

git checkout branch123

Nie trzeba niczego ukrywać, ponieważ domyślnym zachowaniem checkoutjest NIE zastępowanie zmodyfikowanych plików w katalogu roboczym, aby nic nie stracić. (Faktycznie zostało to wspomniane w pierwszych komentarzach Cascabel)

Jak wspomnieli inni w komentarzach, jeśli branch123jeszcze nie istnieje, możesz to zrobić

git checkout -b branch123

Na podstawie tego, co tu znalazłem .

Russel Dirks
źródło
3
Lub, jeśli chcesz utworzyć nowy oddział,git checkout -b newbranch
Phil Mitchell,
2
To działa dla mnie lepiej niż skrytka i jest o wiele łatwiejsze. Dzięki!
Matthias
31
Nie, to nie działa. Git wyświetli ci ten komunikat: „zatwierdź zmiany lub ukryj je, zanim będziesz mógł zmienić oddziały”.
dsharew
1
@DegenSharew: Tak, w niektórych przypadkach masz rację, mianowicie jeśli pliki, które zmodyfikowałeś w katalogu roboczym, nie są identyczne w masteri branch123. Zobacz moją zredagowaną odpowiedź.
Russel Dirks,
1
To zadziałało dla mnie świetnie. Nie utworzyłem jeszcze gałęzi, więc zrobiłem to: git checkout -b newbranchname. Moje zmiany pojawiły się w tej branży na własną rękę.
dex3703
0

Ponieważ możliwe jest utworzenie nowej gałęzi, ale nie jest możliwe wyewidencjonowanie istniejącej gałęzi podczas wyewidencjonowywania plików, znalazłem następującą sztuczkę przy użyciu gałęzi tymczasowej do pracy:

Ten scenariusz działa przynajmniej z wtyczką Git VS 2015, ale najprawdopodobniej działałby z dowolnym narzędziem git.

  1. kasa i dokonaj zmian w plikach w master (ups !, zły oddział)
  2. utwórz nową gałąź „temp” (lub dowolną nieużywaną nazwę, którą wybierzesz) od master. Wyewidencjonowane pliki będą teraz wyewidencjonowane w temp, a nie w systemie głównym.
  3. melduj zmiany w temp (master jest nietknięty)
  4. Wszystko jest teraz zameldowane i można sprawdzić istniejący oddział. Sprawdź poszukiwany oddział (gałąź, od której chciałem wprowadzić zmiany) 3.5 Git Rebase
  5. połączyć temp do poszukiwanej gałęzi. Teraz zmiany są we właściwej gałęzi.
  6. usuń gałąź temp, ponieważ nie jest już potrzebna

EDYCJA: Dowiedziałem się, że będziesz musiał wykonać rebase (git rebase --onto) oddziału temp przed wykonaniem scalenia. W przeciwnym razie zmiany w wzorcu zostaną uwzględnione podczas scalania. Dodatkowy krok 3.5 powyżej. Zobacz więcej na temat rebase tutaj: https://git-scm.com/book/en/v2/Git-Branching-Rebasing

Pasi
źródło
Czy mógłby Pan uściślić swoją odpowiedź, dodając nieco więcej opisu oferowanego rozwiązania?
abarisone
Dziękuję za twój komentarz. Rozwiązanie jest jednak dość proste i działa na tej samej zasadzie, co rozwiązanie „skrytki”, z tym wyjątkiem, że zamiast skrytki stosuje się gałąź tymczasową. Jest to wygodniejsze przynajmniej dla użytkowników programu Visual Studio, ponieważ wtyczka GIT nie obsługuje skrytki
Pasi