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
Steven Penny
źródło

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
Stelterd
źródło
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
17
git log --oneline -- foo.js | tail -n 1
Seth Robertson
źródło
1
Byłoby miło mieć --follow.
Yasushi Shoji,
Przyjęte rozwiązanie nie działało dla mnie, ale tak się stało. Dzięki!
Stevie Howard
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
Reidel
źródło
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