git - Znajdź zatwierdzenie, gdzie plik został dodany


208

Powiedzmy, że mam plik, foo.jsktóry został popełniony jakiś czas temu. Chciałbym po prostu znaleźć zatwierdzenie, w którym ten plik został dodany po raz pierwszy.

Po przeczytaniu odpowiedzi i moim majsterkowaniu to działa dla mnie

git log --follow --diff-filter=A --find-renames=40% foo.js

Odpowiedzi:


317

Oto prostszy, „czysty Git” sposób na zrobienie tego, bez potrzeby tworzenia potoków:

git log --diff-filter=A -- foo.js

Sprawdź dokumentację. Możesz zrobić to samo dla usuniętych, zmodyfikowanych itp.

https://git-scm.com/docs/git-log#Documentation/git-log.txt---diff-filterACDMRTUXB82308203

Mam do tego przydatny alias, ponieważ zawsze o tym zapominam:

git config --global alias.whatadded 'log --diff-filter=A'

To sprawia, że ​​jest to tak proste, jak:

git whatadded -- foo.js

Poniżej jeden liner będzie rekurencyjnie przeszukać katalogi Sub $PWDdla foo.jsbez konieczności dostarczania i bezwzględną lub względną ścieżkę do pliku, nie będzie potrzeba plik będzie w tym samym katalogu, co$PWD

git log --diff-filter=A -- **foo.js

27
+1! Jednak mój plik znajdował się w podfolderze, więc działał dopiero po dodaniu gwiazdki z przodugit log --diff-filter=A -- *subfolder/foo.js
— Geo

4
Jak to działa na plikach, które są scalane z innych gałęzi, ale które niekoniecznie zostały dodane do gałęzi scalanej przez użytkownika wykonującego scalanie?
— g33kz0r

Powyższy link do dokumentu nie przeskakuje do informacji o flagach. Może zmieniło się od czasu opublikowania. git-scm.com/docs/git-log#Documentation/…
— webbower

1
Tak, zmienili strukturę kotwicy w dokumentach. Zaktualizowano, dziękuję!
— stelterd

@geo, myślę, że rozumiem to, co mówisz, ale nie do końca, ale mam podobny przypadek użycia, w którym generalnie pozostaję w katalogu głównym projektu katalogu git i stamtąd wydaje polecenia, a użycie dostarczonej jednej linijki git log --diff-filter=A -- foo.jsnie wydrukowało zatwierdzam ID / skrót do STDOUT w moim terminalu, a raczej musiałem podać względną ścieżkę do pliku z katalogu głównego git repo, aby uzyskać pożądane wyniki
— ipatch


1

Poniższe może nie być interesujące, ale myślę, że pomoże ci to w przyszłości i jest częścią debugowania ekosystemu w Git:

Możesz użyć, git-blameaby pokazać, która wersja i autor ostatnio zmodyfikowali każdą linię pliku, zwłaszcza adnotację pliku. Odwiedź https://git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git

Na przykład,

git blame -L 174,190  xx.py

Czy możesz wyjaśnić, co robią poszczególne operandy? Zdaję sobie sprawę, że podałeś link do odpowiedniego RTFM, ale małe wyjaśnienie sprawiłoby, że twój post byłby jednym oknem.
— rossmcm

Jak mówi książka Pro-Git Jeśli wyśledzisz błąd w kodzie i chcesz wiedzieć, kiedy został wprowadzony i dlaczego, adnotacja pliku jest często najlepszym narzędziem. Pokazuje, jakie zmiany były ostatnio modyfikowane dla każdej linii dowolnego pliku, więc w tym przykładzie, który pokazałem, użyto opcji -L, aby ograniczyć dane wyjściowe do linii od 174 do 190, a ostatnią rzeczą jest tylko plik docelowy, który chcesz sprawdzić xx.py) w tym przypadku plik python @rossmcm
— Reidel
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.