Czy w git można utworzyć skrytkę, przepchnąć skrytkę do zdalnego repozytorium, pobrać skrytkę na innym komputerze i zastosować skrytkę?
Lub są moje opcje:
- Utwórz poprawkę i skopiuj ją na inny komputer lub
- Utworzyć mniejszy oddział i przekazać niepełną pracę do tego oddziału?
git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
git stash apply some-remote/stash
Uwaga: Właśnie przepisałem tę odpowiedź z 24 godzinami więcej git-fu pod moim pasem :) W mojej historii muszli cały shebang ma teraz trzy jednoliniowe. Jednak dla waszej wygody odłączyłem je.
W ten sposób mam nadzieję, że będziesz mógł zobaczyć, jak to zrobiłem, zamiast po prostu ślepo kopiować / wklejać rzeczy.
Oto krok po kroku.
Załóżmy, że jest źródłem w ~ / OLDREPO zawierającym skrytki. Utwórz klon TESTOWY bez żadnych skrytek:
Wciśnij wszystkie skrytki jako gałęzie tymczasowe:
Pętla na końcu odbiorczym przekształca się z powrotem w skrytki:
Oczyść swoje tymczasowe oddziały, jeśli chcesz
Zrób listę skrytek git, a będziesz coś takiego:
W oryginalnym repozytorium wyglądało to samo
źródło
git add .
wcześniej,git stash save ...
ponieważgit stash
odmawia przechowywania nowych plików, chyba że zostały one ustawione. Ponadto, przesyłanie wynikówgit rev-list ...
przeztac
przelot odwraca kolejność skrytek, aby wychodziły w tej samej kolejności.for
pętlę za pomocągit branch -D stash_$a
(posprzątaj, gdy tworzone są skrytki), aby jeśli coś poszło nie tak i spróbujemy ponownie, nie przetwarzamy ponownie zatwierdzeń, które zostały pomyślnie zablokowane.git stash save "$(git log --format='%s' -1 HEAD@{1})"
gogit update-ref --create-reflog -m "$(git show -s --format=%B $rev)" refs/stash $rev
, otrzymasz oryginalną wiadomość skrytki (update-ref
jest togit stash save
za kulisami).Jestem trochę spóźniony na imprezę, ale wydaje mi się, że znalazłem coś, co dla mnie działa w tej sprawie i może również dla ciebie, jeśli twoje okoliczności są takie same lub podobne.
Pracuję nad funkcją w jej własnym oddziale. Oddział nie jest połączony w master i nie jest wysyłany, dopóki nie zostanie ukończony lub nie wykonam zobowiązań, które czuję się komfortowo, pokazując je publicznie. Tak więc, co robię, gdy chcę przenieść zmiany niestacjonarne na inny komputer:
[non-commit] FOR TRANSFER ONLY
”, zawierającego treść, którą chcesz przenieść.Następnie wykonaj:
git pull ssh+git://<username>@<domain>/path/to/project/ rb:lb
Adres URL może się dla Ciebie różnić, jeśli uzyskasz dostęp do swojego repozytorium w inny sposób. Spowoduje to pobranie zmian z tego adresu URL ze zdalnej gałęzi „rb” do lokalnej gałęzi „lb”. Zauważ, że mam serwer ssh działający na moim komputerze i mogę w ten sposób uzyskać dostęp do repozytorium.
git reset HEAD^
(implikuje--mixed
)Spowoduje to zresetowanie HEAD, aby wskazywał stan przed zatwierdzeniem „[brak zatwierdzenia]”.
Z git-reset (1): „
--mixed
: Resetuje indeks, ale nie działające drzewo (tzn. Zmienione pliki są zachowane, ale nie są oznaczone do zatwierdzenia) [...]”Więc na końcu będziesz mieć zmiany w plikach, ale żadne masteringi nie zostaną zatwierdzone i nie będziesz potrzebował skrytki.
Będzie to jednak wymagać od ciebie
git reset --hard HEAD^
w repozytorium, w którym dokonałeś „[non-commit]”, ponieważ to zatwierdzenie jest śmieciem.źródło
Jest trochę późno, ale ta odpowiedź może komuś pomóc. Chciałem to wiedzieć, ponieważ chciałem móc przesyłać trwającą funkcję / błąd / cokolwiek i pracować z tego samego miejsca na innym komputerze.
To, co działa dla mnie, to zatwierdzenie mojego kodu w toku (w gałęzi, nad którą pracuję sam). Kiedy dojdę do drugiego komputera, pociągnij, a następnie cofnij zatwierdzenie za pomocą:
Kontynuuj pracę tak, jak byłeś, ze wszystkimi wprowadzanymi zmianami, niezaangażowanymi i nieopartymi na scenach.
Mam nadzieję, że to pomoże.
źródło
Wydaje się, że istnieje bardzo fajna sztuczka, aby rozwiązać ten problem. możesz użyć
git diff > file.diff
(i zatwierdzić plik), a następnie przywrócić zmiany za pomocągit apply file.diff
(z dowolnego miejsca), aby osiągnąć ten sam wynik.Wyjaśniono to również tutaj .
źródło
Postawiłbym na drugie podejście, chociaż nie mam pojęcia, dlaczego nie można przypisać go do gałęzi master / featured. Można również zbierać wiśnie.
źródło
AFAIK cała idea skrytki polega na ukryciu czegoś nie tak ważnego pod lokalnym dywanem. Nikt nie powinien wiedzieć o twoim ulubionym gównie ;-) Jedyne „ale” to: Ale czy rozwijam się na kilku stacjach roboczych? To
scp
jest o wiele lepsze.źródło
Obecnie akceptowane odpowiedź jest technicznie poprawne, nie można bezpośrednio powiedzieć Git naciskać wszystkie stashes na pilocie, a następnie wyciągnąć wszystko do lokalnych stashes na innym komputerze.
I chociaż aktualnie głosowana odpowiedź powinna działać, nie podobało mi się, że tworzy ona kilka tymczasowych gałęzi i że wymaga ręcznego sprawdzenia zatwierdzenia skrytki i zapisania jej jako skrytki, co może prowadzić do problemów takich jak ten komentarz wspomniane i prowadzi do duplikatu
On (no branch): On testing:
. Z pewnością musi być lepszy sposób!Tak więc, chociaż nie możesz bezpośrednio wypychać skrytek, skrytka jest tylko zatwierdzeniem (w rzeczywistości dwa zatwierdzenia), a na
git push
stronie podręcznika możesz wypychać zatwierdzenia:Zdecydowałem się popchnąć skrytki, aby
refs/stashes/*
nie zaśmiecać pilota dodatkowymi gałęziami. Więc mogę to zrobić za pomocą:(
rev-parse
Polecenie pobiera krótki skrót skrytki, który będzie unikalny dla repozytorium).Następnie muszę pobrać skrytkę z drugiego komputera. Git domyślnie pobiera tylko gałęzie, więc muszę pobrać skrytki konkretnie:
Teraz, aby przekonwertować zatwierdzenie skrytki z powrotem na rzeczywistą skrytkę. Jak już wspomniano, chociaż mógłbym po prostu sprawdzić, jak zwykle zatwierdzić, zresetować i ukryć skrytkę, nie podoba mi się, że wymaga dodatkowych kroków lub że może nie utrzymywać stanu indeksu dla skrytki. Szukałem w Internecie sposobu na zrobienie tego automatycznie, ale zawiodło mnie moje wyszukiwanie. W końcu przejrzałem stronę man
git stash
, gdzie znalazłem to:Ponieważ mam już zatwierdzenie,
store
brzmi jak to, czego chcę. Więc mogę zrobić:Zastąpienie
<SHA>
skrytką, która właśnie została pobrana.(
git show
Polecenie pobiera komunikat zatwierdzenia z zatwierdzenia ukrytego, aby użyć go jako komunikatu do dziennika ukrytego.)Skrytka pokazuje się teraz normalnie w moim lokalnym repozytorium:
Aby wyczyścić pilota, skrytki można usunąć z pilota w następujący sposób:
Ta metoda ma tę zaletę, że jest idempotentna: jeśli
push
ponownie uruchomisz polecenie, zgłosi toEverything up-to-date
.fetch
Komenda może być również bezpiecznie uruchamiać wielokrotnie. Chociażstash store
pominie przechowywanie skrytki, jeśli jest taka sama jak najnowsza skrytka, nie zapobiega duplikatom starszych skrytek. Można to obejść, tak jak w moimgit-rstash
skrypcie, patrz poniżej.Aby zakończyć, możesz również z łatwością wepchnąć wszystkie skrytki (za pomocą grzmotnąć):
lub zaimportuj wszystkie pobrane skrytki:
Stworzyłem grzmotnąćskrypt, który można wywołać jako podkomendę (np.
git rstash push 0
), więc nie muszę pamiętać tego wszystkiego.git-rstash
można znaleźć tutaj.źródło
Poniższe nie działa z ukrytą skrzynką, ale z niezatwierdzonymi zmianami w reż. Tworzy gałąź, automatycznie zatwierdza wszystkie bieżące zmiany i przesyła do pilota:
Użyj jak:
źródło
Chciałbym po prostu utworzyć nową gałąź ukryć i usunąć, gdy gałąź ta nie jest wymagana.
źródło
Po prostu użyj Dropboksa tak jak ten facet. W ten sposób nie musisz się martwić o wypychanie skrytek, ponieważ utworzono kopię zapasową całego kodu.
http://blog.sapegin.me/all/github-vs-dropbox
źródło