Przechowuj tylko jeden plik


176

Chciałbym móc przechowywać tylko zmiany z jednego pliku:

git stash save -- just_my_file.txt

Powyższe jednak nie działa. Jakieś alternatywy?



w przypadku pojedynczego pliku, zamiast żonglować poleceniami skrytki, o wiele łatwiejszym sposobem jest skopiowanie pojedynczego pliku i przywrócenie go z powrotem, aby po prostu skopiować oryginał. na przykład. cp just_my_file.txt just_my_file.txt.manualstash teraz możesz wykonać wszystkie operacje pobierania i inne rzeczy, a ponieważ kopia jest „nieśledzonym plikiem”, możesz bez problemu przemieszczać się między gałęziami i zatwierdzeniami. Kiedy jesteś na właściwej gałęzi / zatwierdzeniu, w którym chcesz "scalić pojedynczy plik", po prostu zrób, mv just_my_file.txt.manualstash just_my_file.txta teraz możesz przejrzeć zmiany i zatwierdzić je w razie potrzeby
Dimitry K

Odpowiedzi:


173

Myślę stash -p jest to prawdopodobnie wybór, którego chcesz, ale na wypadek, gdybyś w przyszłości napotkał inne jeszcze bardziej skomplikowane rzeczy, pamiętaj, że:

Stashjest po prostu bardzo prostą alternatywą dla tylko nieco bardziej złożonych branchzestawów. Skrytka jest bardzo przydatna do szybkiego przenoszenia rzeczy, ale możesz wykonywać bardziej złożone rzeczy z gałęziami bez większego bólu głowy i pracy.

# git checkout -b tmpbranch
# git add the_file
# git commit -m "stashing the_file"
# git checkout master

idź i rób, co chcesz, a później po prostu rebasei / lub mergetmpbranch. To naprawdę nie jest tak dużo dodatkowej pracy, gdy musisz wykonać dokładniejsze śledzenie, niż pozwala na to skrytka.


2
Z drugiej strony możesz zamienić skrytki w prawdziwe gałęzie bez ogromnego bólu.
Wes Hardaker

90

Jeśli nie chcesz określać wiadomości ze swoimi ukrytymi zmianami, podaj nazwę pliku po podwójnym myślniku.

$ git stash -- filename.ext

Jeśli jest to nieśledzony / nowy plik, musisz go najpierw przygotować.

Jednakże, jeśli nie chcesz, aby określić wiadomość, używania push.

git stash push -m "describe changes to filename.ext" filename.ext

Obie metody działają w wersjach git 2.13+


1
Ta odpowiedź wydaje się najbardziej proste do mnie Dokonując zmiany zmiany: git stash -- filename.ext, git commit --amend, git stash pop
Brandon Dewey

1
Myślę, że musi to polegać na bardzo nowej funkcjonalności. Nie działa w git 2.1.4.
Richard Smith

Powoduje to dla mnie dziwne zachowanie, z zapisywaniem skrytki, ale te same pliki są dodawane do przemieszczania w tym samym czasie (git v2.20.1),
paradroid

58

Możesz interaktywnie ukrywać pojedyncze linie za pomocą git stash -p(analogicznie do git add -p).

Nie wymaga nazwy pliku, ale możesz po prostu pomijać inne pliki, ddopóki nie dotrzesz do pliku, który chcesz schować, a skrytka zmieni się tam a.


3
Jeśli masz dużo plików, których nie chcesz przechowywać, zajmuje to dużo czasu.
jjj

23
Nie wiem, kiedy to się zmieniło, ale na dzień dzisiejszy git 2.14.1mogę określić nazwę plikugit stash -p <filename>
muon

21

Najlepszą opcją jest umieszczenie wszystkiego oprócz tego pliku i polecenie stashowi, aby zachował indeks git stash save --keep-index, w ten sposób ukrywając plik niestabilizowany:

$ git add .
$ git reset thefiletostash
$ git stash save --keep-index

Jak zauważa Dan, thefiletostashjest jedynym, który ma zostać zresetowany przez skrytkę, ale przechowuje również inne pliki, więc nie jest to dokładnie to, czego chcesz.


2
Chociaż powoduje to zachowanie indeksu w tym samym stanie, czy nie powoduje to również ukrycia plików znajdujących się w indeksie? Innymi słowy, jeśli po wykonaniu tej czynności zatwierdzisz indeks do bieżącej gałęzi, a następnie przełączysz się na inną gałąź i zrobisz git stash popto, czy nie spowoduje to zastosowania wszystkich plików, a nie tylko jednego pliku, który chcieliśmy przechować?
Dan Molding,

@DanMoulding: masz całkowitą rację, nie myślałem o tym.
CharlesB,

16

Na wypadek, gdybyś naprawdę miał na myśli „odrzucaj zmiany” za każdym razem, gdy używasz „git stash” (i tak naprawdę nie używaj git stash do tymczasowego przechowywania), w takim przypadku możesz użyć

git checkout -- <file>

Pamiętaj, że git stash to po prostu szybsza i prostsza alternatywa dla rozgałęziania i robienia rzeczy.


Myślę, że to najlepsza odpowiedź, jeśli chcesz usunąć wszystkie zmodyfikowane zmiany w jednym pliku.
Mohamed Haseel

i chciałbym, żeby to była najlepsza odpowiedź na to szczególne zadanie
Zakir hussain

6
Pytanie było wystarczająco jasne i nie pytało, jak przywrócić zmiany w jednym pliku. Głosowano w dół.
Richard Smith

To dobra odpowiedź, z wyraźną alternatywą. Ale niektórzy ludzie będą na tyle uparci, aby użyć głosu przeciwnego jako nadużycia: +1
Mukul Jain

@MukulJain Właściwie potrzebowałem użyć skrytki na plik w bardzo tymczasowy sposób (w zasadzie oddzielając niektóre zmiany w dwóch zatwierdzeniach, które dotyczyły tych samych wierszy, dla jednego pliku). Nie będę głosować przeciw, po prostu stwierdzę, że jest to dla mnie bezużyteczne.
Paul Stelian
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.