Chciałbym wykonać następujący przepływ pracy:
- Dodaj zmiany do stołu montażowego.
- Ukryj wszystkie inne zmiany, które nie zostały wprowadzone.
- Wykonuj niektóre czynności na etapach (np. Buduj, uruchamiaj testy itp.)
- Zastosuj skrytkę.
Czy istnieje sposób na wykonanie kroku 2?
Przykład
echo "123" > foo
git add foo # Assumes this is a git directory
echo "456" >> foo
git stash
cat foo # Should yield 123
man git stash
jest znacznie lepszy.Odpowiedzi:
git stash save
ma opcję,--keep-index
która robi dokładnie to, czego potrzebujesz.Więc biegnij
git stash save --keep-index
.źródło
save
zgit stash
. Być może to programista we mnie nalega na uhonorowanie symetrii aplikacją / popem. :)git stash save
jest to, że pozostawia już wprowadzone zmiany również w kopii roboczej. W powyższym przepływie pracy działałoby to dobrze, ponieważ po prostu nakładasz ukrytą kopię na lokalną kopię, która ma już połowę zmian ukrytych (który git jest wystarczająco inteligentny, aby zignorować). Ale jeśli edytujesz kod przed ponownym zastosowaniem skrytki, możesz potencjalnie zobaczyć konflikty scalania po przejściu do zastosowania. Fyi.git commit --ammend
jeśli są problemy z tym, co popełniłem.--amend
(raczej niż--ammend
)Można to zrobić w 3 krokach: zapisz zmiany etapowe, ukryj wszystko inne, przywróć indeks ze zmianami stopniowymi. Co jest w zasadzie:
To zrobi dokładnie to, co chcesz.
źródło
-u
ukrywa także nieśledzone pliki.git stash save --keep-index
przy znacznie większej ilości pracy. Nie widzę żadnych korzyści.Ponadto Re:
Odp .: Ponieważ zawsze powinieneś sprawdzać testowany kod :) Oznacza to, że musisz uruchamiać testy tylko ze zmianami, które zamierzasz zatwierdzić
Wszystko to poza tym, że jako doświadczony programista masz wrodzoną potrzebę testowania i przeglądu tylko tych zmian - tylko częściowo żartuje
źródło
Z
git version 2.7.4
tobą możesz zrobić:git
Poprosi, aby dodać lub nie zmiany w zapasach.I wtedy po prostu odpowiadasz
y
lubn
Możesz przywrócić katalog roboczy, jak zawsze to robisz:
lub, jeśli chcesz zachować zapisane zmiany w skrytce:
źródło
Rozszerzając poprzednie odpowiedzi, czasami mam złożony zestaw zmian, ale najpierw chcę wprowadzić osobną zmianę. Na przykład mogłem zauważyć błąd lub inny niepoprawny kod, który chciałbym naprawić przed wprowadzonymi zmianami. Jedną z możliwych tras jest:
najpierw przechowuj wszystko, ale pozostaw zmiany bez zmian
teraz osobno przechowuj zmiany etapowe
wprowadź zmiany w celu naprawy; i test; popełnij je:
teraz przywróć wcześniej wprowadzone zmiany:
rozwiąż wszelkie konflikty i zwróć uwagę, że jeśli wystąpiły konflikty, git zastosuje, ale nie upuści tego górnego wpisu.
(... Następnie zatwierdź zmiany etapowe, przywróć skrytkę wszystkich pozostałych zmian i kontynuuj ...)
źródło
Aby dodać nieoznaczone (nie dodane do zatwierdzenia) pliki do ukrycia, uruchom następującą komendę:
Następnie możesz zatwierdzić pliki etapowe. Następnie możesz odzyskać ostatnio przechowywane pliki za pomocą polecenia:
źródło
Przechowywanie tylko działającego drzewa (zmiany nieetapowane) w Git jest trudniejsze niż powinno. Zaakceptowana odpowiedź ukrywa zmiany etapowe , ale także ukrywa zmiany etapowe (i pozostawia je również etapowe), co rzadko jest tym, czego chcesz.
Ten alias działa dobrze:
To dopuszcza się tymczasowo wystawił zmian, tworzy zapas z pozostałych zmian (i pozwala na dodatkowe argumenty jak
--include-untracked
i--message
być przekazywane jako argumenty alias), a następnie resetuje tymczasowy popełnić odzyskać wystawił zmian.Jest ona podobna do @Simon Knapp za odpowiedź , ale z kilkoma różnicami drobne - korzysta
--quiet
na tymczasowych podjętych działań i przyjmuje dowolną liczbę parametrów na zapaspush
, zamiast ciężko kodowania-m
, a nie dodawać--soft
do finału zresetować, aby indeks pozostał na początku.W przypadku odwrotnego problemu ukrywania tylko zmian etapowych (alias
stash-index
) zobacz tę odpowiedź .źródło
Kolejna wskazówka związana z pytaniem:
Kiedy skutecznie ukrywasz swoje nieetapowane zmiany za pomocą
możesz chcieć przekazać skrytce wiadomość, aby kiedy zrobiłaś
git stash list
, bardziej oczywiste jest to, co ukryłeś wcześniej, szczególnie jeśli wykonasz tę operację skrytki przez kolejne zapisy. Na przykład(chociaż tak naprawdę zawiera wszystkie zmiany, jak wspomniano w innych odpowiedziach).
Na przykład po powyższym można natychmiast wprowadzić:
Uważaj jednak, że nie możesz wtedy użyć
aby przywrócić tylko niestabilne zmiany.
źródło
Git nie ma polecenia, które skrywa tylko twoje niesceniczne zmiany.
Git pozwala jednak określić, które pliki chcesz ukryć.
Jeśli chcesz ukryć tylko określone zmiany w tych plikach, dodaj
--patch
opcję.Ta
--include-untracked
opcja umożliwia przechowywanie nieśledzonych plików.Uruchom
git help stash
(lubman git-stash
), aby uzyskać więcej informacji.Uwaga: jeśli twoje zmiany niestacjonarne są raczej zdezoganizowane, odpowiedź @ alesguzik jest prawdopodobnie łatwiejsza.
źródło
Współczesna forma tego polecenia jest
git stash push [--] [<pathspec>...]
, ponieważ Git 2.16+ (git stash save
jest przestarzały )Możesz to połączyć z formularzem wieloznacznym, na przykład:
Ale to nie działa dobrze z Git dla Windows, dopóki Git 2.22 (Q2 2019), patrz problem 2037 , biorąc pod uwagę, że
git stash
został ponownie zaimplementowany w C (zamiast skryptu powłoki)Zobacz commit 7db9302 (11 marca 2019 r.) Autor: Thomas Gummerer (
tgummerer
) .Zobacz zatwierdzenie 1366c78 , zatwierdzenie 7b556aa (07 marca 2019) przez Johannes Schindelin (
dscho
) .(Połączone przez Junio C Hamano -
gitster
- w commit 0ba1ba4 , 22 kwietnia 2019)źródło
Używam aliasu, który akceptuje ciąg znaków jako wiadomość do wpisu ukrytego.
Który:
-u
lub-a
),--soft
aby zachować go w indeksie).źródło