Czy można poprosić git diff o dołączenie nieśledzonych plików do wyjścia diff? A może najlepiej jest dodać nowe pliki, które utworzyłem, i istniejące pliki, które edytowałem i których używam
git diff --cached
?
Dzięki najnowszym wersjom git możesz utworzyć git add -N
plik (lub --intent-to-add
), który dodaje do indeksu w tym miejscu obiekt blob o zerowej długości. Wynikiem jest to, że plik „nieśledzony” staje się teraz modyfikacją dodającą całą zawartość do tego pliku o zerowej długości, co pojawia się na wyjściu „git diff”.
git diff
echo "this is a new file" > new.txt
git diff
git add -N new.txt
git diff
diff --git a/new.txt b/new.txt
index e69de29..3b2aed8 100644
--- a/new.txt
+++ b/new.txt
@@ -0,0 +1 @@
+this is a new file
Niestety, jak wskazano, nie można, git stash
dopóki --intent-to-add
plik jest w toku. Chociaż jeśli chcesz ukryć, po prostu dodajesz nowe pliki, a następnie przechowujesz je. Lub możesz użyć obejścia emulacji:
git update-index --add --cacheinfo \
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
(konfigurowanie aliasu jest tutaj Twoim przyjacielem).
git add -N .
Sądzę, że możesz różnicować pliki w indeksie i pliki nieśledzone, podając po prostu ścieżkę do obu plików.
źródło
git diff --no-index untracked_file_1 untracked_file_2
, aby uzyskaćgit diff
kolorowanie składni itp na dyferencjału ... piękne./dev/null
zamiast:git diff --no-index -- /dev/null <untracked_file>
.cat untracked_file_1
, a możeprintf '\e[1;32m%s\e[0m\n' "$(cat untracked_file_1)"
naprawdę potrzebujesz zielonej produkcji. :) (Chociaż bardziej poważnie, pamiętaj, że podstawienie polecenia usunie końcowe znaki nowego wiersza z pliku.)Moje interaktywne codzienne gitowanie (gdzie cały czas różnicuję działające drzewo w stosunku do HEAD i chciałbym mieć w pliku diff nieuwzględnione pliki),
add -N/--intent-to-add
jest bezużyteczne, ponieważ pękagit stash
.Oto mój
git diff
zamiennik. To nie jest szczególnie czyste rozwiązanie, ale ponieważ naprawdę używam go tylko interaktywnie, jestem w porządku z hackiem:Wpisywanie po prostu
d
będzie zawierać niezrackowane pliki w diff (to jest to, na czym mi zależy w moim przepływie pracy) id args...
będzie się zachowywać jak normalnegit diff
.Uwagi:
git diff
tak naprawdę są to tylko poszczególne różnice skonkatenowane, więc nie jest możliwed
odróżnienie wyniku od „prawdziwego porównania” - z wyjątkiem faktu, że wszystkie nieśledzone pliki są sortowane na końcu.git diff
. Jeśli ktoś wymyśli, jak to zrobić, lub jeśligit
w przyszłości zostanie dodana funkcja , zostaw tutaj notatkę!źródło
git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
obejście, które zasugerowałem dla starszych gitów , działagit stash
, zakładając, że masz już e69de29bb w db, np. Próbując użyćadd -N
wcześniej. Najwyraźniej więc nie jest togit add -N
w jakiś sposób równoważne: nie jestem pewien, jak to zrobić.test
mówiąc, wykonujesz porównanie ciągów zamiast numerycznej kontroli równości za pomocą polecenia. Nie powinno to wpływać na nic, aletest "$#" -eq 0
dokładniej jest zgodne z przeznaczeniem.less
więc nie musisz naciskaćq
dla każdego pliku i wydaje się dokładnie takgit diff
, usuwając paginację dla poszczególnych plików (-P
), dodając go później (| less
), zachowując kolor (--color=always
) i interpretując go jako kolor (less -r
lubless -R
). Tak więc w sumie jest to:do git -P diff --color=always -- /dev/null "$i"; done | less -r
test -t 1
(np. Czyif [ -t 1 ]; then color_arg=--color; fi
coś w tym rodzaju), to sposób, w jaki powłoka sprawdza, czy jej wyjściem jest terminal, co jest przydatnym sposobem na wybór koloru. Ixargs
może dać sposób na pozbycie się pętli while. Nadal będziesz tego potrzebować-n 1
, więc nadal będzie uruchamiał git kilka razy i nadal musi być w ten sposób parami, ale ... pozbywa sięwhile
iread
, więc może lepiej?!? Pozostawiam to czytelnikowi.Nie w 100% do rzeczy, ale jeśli z jakiegoś powodu nie chcesz dodawać plików do indeksu, jak sugeruje zaakceptowana odpowiedź, oto inna opcja:
Jeśli pliki nie są śledzone, oczywiście różnicą jest cały plik, więc możesz po prostu wyświetlić je z mniejszą liczbą:
Nawiguj między nimi za pomocą
:n
i,:p
aby przejść do następnego i poprzedniegoAktualizacja z komentarzy: Jeśli potrzebujesz formatu łatki, możesz także połączyć go z
git diff
:W tym przypadku możesz również przekierować dane wyjściowe do pliku lub użyć innego polecenia diff.
źródło
git diff /dev/null <untracked_tile>
i pobrać łatkę w formacie łatki zamiast „tylko” plikuW razie potrzeby wygeneruj poprawkę, a następnie:
źródło
git add -p
bardzo często (co zresztą ogólnie polecam) ... To daje sposób na zrobienie podstawowej rzeczy, po prostu ... należy zauważyć, że ma potencjał niepożądanej strony efekty.to działa dla mnie:
Ostatni krok jest opcjonalny, pozostawi plik w poprzednim stanie (bez śledzenia)
przydatne, jeśli tworzysz również łatkę:
źródło
Zmiany działają podczas przemieszczania i przemieszczania za pomocą tego polecenia. Nowe pliki działają podczas przemieszczania:
Jeśli nie są one ustawione, widoczne będą tylko różnice plików.
źródło
HEAD
jest wartością domyślną , więc jest to ta sama wartość ,git diff
która nie rozwiązuje problemu.git add
od każdegogit add
, najprostszym jest, jeśli twoim przypadkiem użycia jest sprawdzenie, co właśnie dodałeś / chcesz dodaćDla jednego pliku:
Dla wszystkich nowych plików:
Jako alias:
Dla wszystkich zmodyfikowanych i nowych plików połączonych jako jedno polecenie:
źródło
zwykle kiedy pracuję z zespołami zdalnymi, ważne jest dla mnie, aby mieć wcześniejszą wiedzę o zmianach dokonanych przez inne zespoły w tym samym pliku, zanim przejdę do etapów git bez śledzenia -> etapowe -> zatwierdzenie, napisałem skrypt bash, który pomóż mi uniknąć niepotrzebnego rozwiązania konfliktu scalania ze zdalnym zespołem lub załóż nowy oddział lokalny oraz porównaj i połącz w głównym oddziale
w powyższym skrypcie pobieram zdalną gałąź główną (niekoniecznie jej gałąź główną) do FETCH_HEAD, robią one listę tylko mojego zmodyfikowanego pliku i porównują zmodyfikowane pliki do git difftool
tutaj wiele difftooli obsługiwanych przez git, konfiguruję Meld Diff Viewer dla dobrego porównania GUI.
źródło
Zakładając, że nie masz lokalnych zatwierdzeń,
źródło
git diff
polecenia zawierającego nieśledzone pliki. To polecenie ich nie obejmuje. To, czy istnieją lokalne zatwierdzenia, nie ma absolutnie nic wspólnego z tym pytaniem.git merge --squash mybranch
, igit diff master
pokazałem mi zmiany w nieśledzonych plikach.git diff
nie pokazuje różnic w nieśledzonych plikach: ponieważ nie są śledzone, z definicji nigdy nie ma żadnych różnic do pokazania. Tak działa Git. :)