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
?
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
?
Odpowiedzi:
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.
git diff --no-index tracked_file untracked_file
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że printf '\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ęka git 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:
d() {
if test "$#" = 0; then
(
git diff --color
git ls-files --others --exclude-standard |
while read -r i; do git diff --color -- /dev/null "$i"; done
) | `git config --get core.pager`
else
git diff "$@"
fi
}
Wpisywanie po prostu d
będzie zawierać niezrackowane pliki w diff (to jest to, na czym mi zależy w moim przepływie pracy) i d args...
będzie się zachowywać jak normalne git diff
.
Uwagi:
git diff
tak naprawdę są to tylko poszczególne różnice skonkatenowane, więc nie jest możliwe d
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śli git
w przyszłości zostanie dodana funkcja , zostaw tutaj notatkę!git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
obejście, które zasugerowałem dla starszych gitów , działa git 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 to git 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, ale test "$#" -eq 0
dokładniej jest zgodne z przeznaczeniem.
less
więc nie musisz naciskać q
dla każdego pliku i wydaje się dokładnie tak git 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
lub less -R
). Tak więc w sumie jest to:do git -P diff --color=always -- /dev/null "$i"; done | less -r
test -t 1
(np. Czy if [ -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. I xargs
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
i read
, 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ą:
less $(git ls-files --others --exclude-standard)
Nawiguj między nimi za pomocą :n
i, :p
aby przejść do następnego i poprzedniego
Aktualizacja z komentarzy: Jeśli potrzebujesz formatu łatki, możesz także połączyć go z git diff
:
git ls-files --others --exclude-standard | xargs -n 1 git --no-pager diff /dev/null | less
W tym przypadku możesz również przekierować dane wyjściowe do pliku lub użyć innego polecenia diff.
git diff /dev/null <untracked_tile>
i pobrać łatkę w formacie łatki zamiast „tylko” pliku
git add -A
git diff HEAD
W razie potrzeby wygeneruj poprawkę, a następnie:
git reset HEAD
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:
git add my_file.txt
git diff --cached my_file.txt
git reset my_file.txt
Ostatni krok jest opcjonalny, pozostawi plik w poprzednim stanie (bez śledzenia)
przydatne, jeśli tworzysz również łatkę:
git diff --cached my_file.txt > my_file-patch.patch
Zmiany działają podczas przemieszczania i przemieszczania za pomocą tego polecenia. Nowe pliki działają podczas przemieszczania:
$ git diff HEAD
Jeśli nie są one ustawione, widoczne będą tylko różnice plików.
git add
od każdego
git add
, najprostszym jest, jeśli twoim przypadkiem użycia jest sprawdzenie, co właśnie dodałeś / chcesz dodać
Dla jednego pliku:
git diff --no-index /dev/null new_file
Dla wszystkich nowych plików:
for next in $( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null $next; done;
Jako alias:
alias gdnew="for next in \$( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null \$next; done;"
Dla wszystkich zmodyfikowanych i nowych plików połączonych jako jedno polecenie:
{ git --no-pager diff; gdnew }
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
#set -x
branchname=`git branch | grep -F '*' | awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | grep "modified" | awk "{print $2}" `
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file
git difftool FETCH_HEAD $file ;
done
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.
Zakładając, że nie masz lokalnych zatwierdzeń,
git diff origin/master
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
, i git 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. :)