2012-02-04 12 views
45

To jest potok na oddziale frontend w ciągu ostatnich dwóch tygodni.Jak łączyć wiele skrytek w git

| [email protected]{3} to kod od [email protected]{1} (bez dwóch drobnych poprawek)
| Tiny Commit
| Tiny commit
| Ogromne zgłoszenie zbiorcze dwa tygodnie temu, teraz zostało ponownie utworzone i przeniesione do: [email protected]{1}

Moje działające drzewo jest obecnie czyste.
[email protected]{1} to zawartość zbiorczego zatwierdzenia generalnego kodu rozwojowego sprzed dwóch tygodni (powinno to być przede wszystkim ukryte). To zatwierdzenie zostało cofnięte i przeniesione do schowka.
[email protected]{3} to najnowsza praca na tym drzewie od [email protected]{1} (minus kilka zmian, które zostały zatwierdzone).

Muszę połączyć te dwa skrytki ze sobą w moim drzewie roboczym, aby móc wykonać szereg zobowiązań z tej ogromnej puli prac.

Pobiegłem git stash apply [email protected]{1} następnie próbowałem:

git stash apply [email protected]{3}
git stash show -p | git stash apply [email protected]{3}

ale mam 'Dirty drzewo roboczy' w obu przypadkach. Jak mogę połączyć tę pracę razem? Ponieważ [email protected]{3} jest nowszy, chcę go zastąpić [email protected]{1} wszędzie tam, gdzie występują konflikty.

Odpowiedz

35

Skarbonę można zastosować tylko wtedy, gdy nie ma konfliktów ze zmodyfikowanymi plikami w drzewie roboczym, więc najpierw upewnij się, że nie ma żadnych zmodyfikowanych plików w git status, jeśli istnieją, zatwierdź je. Następnie wykonaj:

git stash apply [email protected]{1} 
git commit -a 
# Enter your commit message 
git stash apply [email protected]{3} 

Następnie możesz dokonać nowego zatwierdzenia lub zmienić poprzednią, aby je połączyć. Konieczne może być rozwiązanie konfliktów scalania po każdym zastosowaniu.

Ponadto, jeśli kiedykolwiek zdecyduje się użyć git stash pop zamiast apply pamiętać, że [email protected]{3} staną [email protected]{2} ponieważ pierwsza była zdejmowana.

+0

Dwa stashes są duże i zawierają wiele nakładających pracy, dlatego chciałem uniknąć zobowiązuje. Czy można je po prostu połączyć w drzewie roboczym, czy też muszę je zatwierdzić, a następnie połączyć 2 fałszywe zatwierdzenia i podzielić je na ~ 10 dobrych commitów w vimie? – sscirrus

+0

Inna sprawa to: _Nie chcę zatwierdzać całego tego kodu. Jego znaczące fragmenty są nadal przeznaczone wyłącznie na rozwój. – sscirrus

+7

Jaka jest różnica między łączeniem ich w drzewie roboczym a wprowadzaniem zmian? Lub wykonując 'git reset HEAD ^' po zastosowaniu drugiej skrytki? Nie możesz zastosować skrytki na brudnym drzewie roboczym, więc * musisz * zatwierdzić przed zastosowaniem, ale to nie znaczy, że nie możesz cofnąć tego zatwierdzenia po złożeniu wniosku. –

2

Miałem podobny problem i rozwiązałem go w ten sposób.

Użyj git stash pop, aby zastosować jedną ze skrytek. Następnie utwórz poprawkę tego skrytka pod numerem git diff -p > ../stash.diff. Możesz następnie zresetować swoje drzewo robocze (lub zapisać zmiany ponownie), a następnie przesłać inną skrytkę pod numer git stash pop [email protected]{1}. Jeśli zastosujesz łatę w tym momencie, możesz "scalić" dwie różne skrytki.

Prawdopodobnie będzie kilka konfliktów do rozwiązania. Jeśli wszystko pójdzie dobrze, możesz upuścić ukryte zmiany.

+0

Albo po prostu wyciągnij ze schowka @ {1} jako różnicę i zastosuj to lokalnie (na przykład odpowiedź i komentarze siride), ale to też działa, dziękuję! – rogerdpack

9

Lepszym sposobem jest po prostu użycie git stash show -p [email protected]{whatever} > stash-{whatever}.diff, a następnie użycie git apply dla każdego z nich.

+0

Jest to zdecydowanie najbardziej proste, jeśli zmiany się nie nakładają. Czuję się głupio, że muszę popełniać błędy tylko po to, by scalić treść. –

+1

@MarceloDiniz: zawsze musi być zatwierdzenie, jeśli zawartość ulegnie zmianie. Wcale nie głupie. – siride

+0

Zastosowanie skrytki jako poprawki będzie działało, jeśli skrytka jest dość banalna, ale nie będzie działać, jeśli wystąpiły pośrednie, niebanalne zmiany w białych znakach lub zmiany w ścieżkach plików. – Kirby

74

To trochę zaangażowania, ale prawie zawsze działa:

  1. Pop pierwszy zapas

    $ git stash pop 
    
  2. tymczasowo zatwierdzić zmiany od pierwszego zapas

    $ git add . && git commit -am 'WIP' 
    
  3. Pop druga skrytka

    $ git stash pop 
    
  4. Cofnij tymczasowy popełnić, zachowując zmiany wprowadził

    $ git reset --soft HEAD^ 
    
+4

Zajęło mi chwilę, aby docenić piękno tego. Działa znacznie lepiej niż próba zastosowania łaty, która często kończy się niepowodzeniem z powodu białych znaków lub zmian ścieżki pliku. – Kirby

+0

Nie zapomnij zresetować pliku po nim, aby zobaczyć ujednoliconą zmianę w 'git diff', ponieważ obecnie zresetowana zmiana jest wystawiona i widziane osobno jako 'git diff --stare". – Nakilon

+0

To wydaje się być najlepszym rozwiązaniem, ale nadal nie rozumiem, dlaczego nie możemy po prostu otworzyć istniejącej skrytki, gdy mamy zmiany nieopublikowane. Na przykład dobrze byłoby po prostu uruchomić 'git stash pop', a następnie' git stash pop'. Być może brakuje mi czegoś o wewnętrznych elementach git. – modulitos

Powiązane problemy