Jak przeszukać repozytorium Git za pomocą komunikatu zatwierdzenia?


828

Sprawdziłem kod źródłowy w GIT za pomocą komunikatu zatwierdzenia „Kompilacja 0051”.

Wydaje mi się jednak, że nie mogę już znaleźć tego kodu źródłowego - jak wyodrębnić to źródło z repozytorium GIT przy użyciu wiersza polecenia?

Aktualizacja

  1. Sprawdzone w wersjach 0043, 0044, 0045 i 0046 za pomocą SmartGIT.
  2. Sprawdzono 0043 i sprawdzono w wersjach do 0051 w innym oddziale.
  3. Sprawdziłem ponownie 0043.
  4. Teraz 0051 zniknął.

Aktualizacja

Na pewno jest kod źródłowy, teraz należy go sprawdzić:

C:\Source>git log -g --grep="0052"
commit 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
Reflog: HEAD@{10} (unknown <Mike@.(none)>)
Reflog message: commit: 20110819 - 1724 - GL: Intermediate version. File version:  v0.5.0 build 0052.
Author: unknown <Mike@.(none)>
Date:   Fri Aug 19 17:24:51 2011 +0100

    20110819 - 1724 - GL: Intermediate version. File version: v0.5.0 build 0052.

C:\Source>




2
Odpowiedzi nie należą do pytań dotyczących przepełnienia stosu. Długo współpracujesz, więc powinieneś o tym wiedzieć. Jeśli chcesz udzielić odpowiedzi na swoje pytanie, z pewnością możesz to zrobić . Alternatywnie możesz edytować odpowiedź shelhamera, aby ją ulepszyć / rozwinąć.
Cody Gray

1
@Cody Od czasu do czasu odnoszę się do tego postu. Nie możesz po prostu losowo usunąć tekstu, to po prostu nie krykiet. Jeśli chcesz go usunąć, z pewnością możesz zmienić go na swoją własną odpowiedź (a możesz nawet uzyskać jakieś pozytywne opinie - byłeś współpracownikiem wystarczająco długo, aby wiedzieć, jak to działa).
Contango,

Odpowiedzi:


1280

Aby przeszukać dziennik zatwierdzeń (we wszystkich gałęziach) dla podanego tekstu:

git log --all --grep='Build 0051'

Aby przeszukać rzeczywistą treść zatwierdzeń w historii repozytorium, użyj:

git grep 'Build 0051' $(git rev-list --all)

aby wyświetlić wszystkie wystąpienia danego tekstu, zawierającą nazwę pliku i zatwierdzenie sha1.

Wreszcie, w ostateczności, jeśli twoje zatwierdzenie jest wiszące i w ogóle nie ma związku z historią, możesz przeszukać sam dziennik refraktu za pomocą -gflagi (skrót od --walk-reflogs:

git log -g --grep='Build 0051'

EDYCJA: jeśli wydaje się, że straciłeś historię, sprawdź reflogjako swoją siatkę bezpieczeństwa. Poszukaj kompilacji 0051 w jednym z zatwierdzeń wymienionych przez

git reflog

Być może po prostu ustawiłeś swoją HEADna część historii, w której zatwierdzenie „Kompilacja 0051” nie jest widoczne, lub mogło być faktycznie wysadzone w powietrze. Git-ready reflog artykuł może być pomocne.

Aby odzyskać swoje zatwierdzenie z rejestru : wykonaj polecenie git znalezionego zatwierdzenia (i opcjonalnie utwórz nowy oddział lub znacznik dla odniesienia)

git checkout 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
# alternative, using reflog (see git-ready link provided)
# git checkout HEAD@{10}
git checkout -b build_0051 # make a new branch with the build_0051 as the tip

2
z git grep 'Build 0051' $ (git rev-list --all) I get sh.exe ": / bin / git: zły numer pliku może to zmienić?
Jens Schauder

7
git log -i -grep
jhvaras

@JensSchauder Jeśli napotkasz błąd git grep 'search' $(git rev-list --all), spróbujgit rev-list --all | xargs git grep 'search'
afilina

83

Umieszczam to w moim ~ / .gitconfig:

[alias]
    find = log --pretty=\"format:%Cgreen%H %Cblue%s\" --name-status --grep

Następnie mogę wpisać „git find string” i otrzymam listę wszystkich zatwierdzeń zawierających ten ciąg w wiadomości. Na przykład, aby znaleźć wszystkie zatwierdzenia dotyczące biletu nr 33:

029a641667d6d92e16deccae7ebdeef792d8336b Added isAttachmentEditable() and isAttachmentViewable() methods. (references #33)
M       library/Dbs/Db/Row/Login.php

a1bccdcd29ed29573d2fb799e2a564b5419af2e2 Add permissions checks for attachments of custom strategies. (references #33).
M       application/controllers/AttachmentController.php

38c8db557e5ec0963a7292aef0220ad1088f518d Fix permissions. (references #33)
M       application/views/scripts/attachment/_row.phtml

041db110859e7259caeffd3fed7a3d7b18a3d564 Fix permissions. (references #33)
M       application/views/scripts/attachment/index.phtml

388df3b4faae50f8a8d8beb85750dd0aa67736ed Added getStrategy() method. (references #33)
M       library/Dbs/Db/Row/Attachment.php

1
Fajnie, ale może brakuje resetowania kolorów? --pretty=\"format:%Cgreen%H %Cblue%s%Creset\"
Ashley Coolman

4
Wolę, aby wydrukować całą wiadomość git (grep można się tam, a nie w tytule), więc skończyło się z: find = log --all --pretty=\"format:%Cgreen%H %Cblue%s\n%b%Creset\" --name-status --grep. Uwaga znaki --alli %b. Dzięki za @ShleyCoolman za resetwskazówkę.
arcol

Dzięki. Uważam, że alias jest bardzo przydatny. Nie podobało mi się kolorowanie i znalazłem idealny do tego format oneline. Pomocne było także dodanie -i, aby rozróżnić wielkość liter. np.find = log --oneline --name-status -i --grep
robbp

39

Chociaż jest nieco spóźniony, istnieje :/dedykowana notacja do określenia zatwierdzenia (lub zmiany) na podstawie komunikatu zatwierdzenia, wystarczy poprzedzić szukany ciąg :/, np .:

git show :/message

Tutaj <message>może być złożony wzór regex składający się z białych znaków, więc upewnij się, żeby zacytować / ucieczki, gdy jest to konieczne, na przykład:

git log -1 -p ":/a few words"

Alternatywnie można określić punkt początkowy, aby znaleźć najbliższe zatwierdzenie osiągalne z określonego punktu, np .:

git show 'HEAD^{/fix nasty bug}'

Zobacz: instrukcja wersji git .


23
git log --grep=<pattern>
            Limit the commits output to ones with log message that matches the
            specified pattern (regular expression).

19
git log --grep="Build 0051"

powinien załatwić sprawę


1
Muszę używać podwójnych cudzysłowów („) zamiast pojedynczych cudzysłowów (').
Frage

9

Spróbuj tego!

git log | grep -b3 "Build 0051"

Dzięki - ale go nie znalazłem. Jak wyszukiwać we wszystkich możliwych oddziałach?
Contango,

6
Chcesz użyć git grepzamiast normalnego grep i podać --allflagę do przeszukiwania wielu gałęzi.
shelhamer,

Hmm - czy inne odpowiedzi też to znajdują? Jeśli nie, możesz mieć większy problem. Spróbowałbym git log --all --grep='Build 0051'(odpowiedź @ shelhamera)
Nic

Próbowałem „git log --all” i wyświetla tylko wersje do 0046. Wersja 0051 była w innej gałęzi. Przywróciłem do 0043, a 0051 zniknął.
Contango,

3
@Gravitas, spróbuj mój przykład, który używa reflog: ten z git log -g. Być może straciłeś historię podczas resetowania, ale nadal możesz sprawdzić dziennik, jeśli nie został on wyrzucony.
shelhamer,

4

najpierw użyj, git log --onelineaby znaleźć SHA zatwierdzenia (Wiadomość), a następnie użyłem git log --stat 8zad24dz SHA (przykład pierwszej pary sha char (8zad24d)), aby znaleźć właściwe informacje


1

To:

git log --oneline --grep='Searched phrase'

albo to:

git log --oneline --name-status --grep='Searched phrase'

polecenia działają dla mnie najlepiej.


1

Aby przeszukać wszystkie gałęzie

git log --all --grep='Build 0051'

Kiedy już wiesz, do którego zatwierdzenia chcesz się dostać

git checkout <the commit hash>

1

Jeśli zmiana nie jest zbyt stara, możesz to zrobić,

git reflog

a następnie sprawdź identyfikator zatwierdzenia

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.