Jak interaktywnie wyłączyć scenę z określonego fragmentu w git?

106

W git, jeśli mam kilka porcji z tego samego pliku ustawionych w moim indeksie, jak mogę interaktywnie zdjąć jeden z nich?

Czy jest jakaś alternatywa dla usunięcia z poczekalni całego pliku, a następnie ponownego umieszczenia porcji, które chcę zachować, lub ręcznego cofnięcia zmian w kopii roboczej, a następnie interaktywnego dodania cofniętych zmian?

Andrew Grimm
źródło

Odpowiedzi:

137

Spróbuj git reset --patch filename; git add --patchzgodnie z dokumentacją powinno to działać odwrotnie . Krótka forma -pdziała również w przypadku obu poleceń.

Aasmund Eldhuset
źródło
Nie sądzę, że moja wersja to ma (to 1.6.3.3), ale wygląda na to, że jest to prawidłowa odpowiedź.
Andrew Grimm,
2
W takim przypadku (i zakładając, że z jakiegoś powodu nie możesz zaktualizować), sugeruję, abyś użył git stash save --keep-indexdo zapisania i zresetowania zmian w bieżącej kopii roboczej. Następnie możesz zresetować plik i cofnąć zmiany, których nie chcesz. Jeśli najpierw skopiujesz plik do jakiejś tymczasowej lokalizacji, możesz użyć diffdo zapisania cofniętych zmian. Następnie możesz ponownie dodać plik (nie ma potrzeby dodawania interaktywnego, ponieważ ukryłeś inne zmiany, którymi nie byłeś zainteresowany). Użyj, git stash popaby przywrócić stare zmiany i diffzastosować zmiany, które cofnąłeś. Dość uciążliwe ... :-(
Aasmund Eldhuset
The short form -p also works for both commands... Masz na myśli git reset -p filename?
Nawaz
1
@Nawaz: Zgadza się - git add -p filenameselektywnie etapuje zmiany z tego pliku i git reset -p filenameselektywnie cofa zmiany. Jest też git checkout -p -- filename, który pozwala selektywnie odrzucać zmiany z pliku. Ostrzeżenie: każdy z addi resetmoże być użyty do cofnięcia drugiego z dwóch, ale jeśli użyjesz tej formy checkoutdo odrzucenia zmiany, nie możesz jej odzyskać.
Aasmund Eldhuset
2

git guima przyzwoity GUI do interaktywnego wystawiania lub usuwania fragmentów sceny lub linii. Istnieją ładniejsze / lepsze klienty GUI, ale git guisą lekkie, wbudowane i wieloplatformowe (lin, win, mac).

https://git-scm.com/docs/git-gui

Po prostu kliknij prawym przyciskiem myszy kawałek, aby wystawić / zdjąć scenę. W przypadku linii najpierw zaznacz linie, a następnie kliknij prawym przyciskiem myszy.

wisbucky
źródło
-1

GitX ma ładny interfejs użytkownika do usuwania fragmentów pliku z poczekalni: wprowadź opis obrazu tutaj

Oficjalny klient nie był obsługiwany od jakiegoś czasu, ale w niektórych kręgach popularne jest rozwidlenie w GitHub z większą liczbą funkcji. ( wpis na blogu o tym )

John Douthat
źródło
1
Dla użytkowników systemu Windows, rozszerzenia Git mają podobnie przyjemny interfejs użytkownika.
Aasmund Eldhuset
4
Tak samo jest z wbudowanym git gui, ale nie jestem pewien, czy
użyłbym
1
SourceTree (Windows + Mac) również ma do tego ładny interfejs użytkownika.
chrnola
Powinienem teraz wspomnieć o nowszych graficznych klientach Git - GitKraken jest piękny i obsługuje to (chociaż teraz wiąże się z dużą opłatą za komercyjne wykorzystanie). GitHub Pulpit GitHub jest darmowy, piękny i obsługuje łatwe przemieszczanie i usuwanie porcji. GitKraken i GitHub Desktop są wieloplatformowe, ale żadna z nich nie jest open-source.
jdgregson