Git : 전체 git 히스토리에 대해 지정된 파일의 한 줄에 대한 다양한 변경 사항을 모두 표시합니다.


112

나는 주위를 둘러 보았고 이것이 가능한지 확실하지 않지만 여기에 있습니다.

다음과 같이 고유 식별자가 변수에 할당 된 (javascript) 파일 (예 : /lib/client.js)이 있습니다. var identifier = "SOME_IDENTIFIER";

식별자를 버전 번호처럼 생각할 수 있습니다. 주기적으로이 변수를 새 식별자로 변경합니다.

제가하고 싶은 것은 우리가 지금까지 사용한 모든 고유 식별자를 찾는 것입니다. git으로 어떻게 할 수 있습니까?

git 히스토리를 검색하고 일치하는 줄을 인쇄하는 방법이 있다고 생각합니다 "var identifier =". 이 목록의 중복을 수동으로 제거 할 수 있습니다.

어쨌든, 여기에 대한 통찰력을 고맙게 생각합니다. 감사.


답변:


106

git 1.8.4 이후로 질문에 답하는 더 직접적인 방법이 있습니다.

그 라인을 가정하면 110선은 말하고 var identifier = "SOME_IDENTIFIER";다음이 작업을 수행 :

git log -L110,110:/lib/client.js

이것은 해당 코드 줄에 닿은 모든 커밋을 반환합니다.

[ Git 문서 ( "-L"명령 줄 매개 변수 참조)]


49

git-log및에 대한 매뉴얼 페이지를 참조하십시오 gitdiffcore. 이 명령이 그렇게 할 것이라고 생각하지만 옳지 않을 수도 있습니다.

git log -G "var identifier =" file.js

편집 : 실제 줄을 표시하는 bash 스크립트에 대한 대략적인 시작이 있습니다. 이것은 당신이 찾고있는 것보다 더 많을 수 있습니다.

for c in $(git log -G "something" --format=%H -- file.js); do
    git --no-pager grep -e "something" $c -- file.js
done

git log -G흥미로운 커밋을 찾는 데 사용 하고 --format=%H커밋 해시 목록을 생성하는 데 사용 합니다. 그런 다음 각 흥미로운 커밋을 반복 git grep하여 커밋 해시로 시작하는 정규식을 포함하는 해당 커밋 및 파일의 줄을 표시하도록 요청 합니다.


수정 : 댓글에서 제안 하는 -G대신 사용하도록 변경되었습니다 -S.


@ 롭 - 이것에 대한 감사 - 작은 편집 스크립트에 불구하고 - 그냥 파일에 영향을 단지 파일 이름 만 보여주고 커밋 퍼팅 - A가 다른 파일을 참조하는 커밋 경우는 표시되지 않습니다
아드리안 콘월어

@AdrianCornish-다행 이네요. OP가 하나의 파일 만보고 싶었다고 생각하지만 파일 이름을 제거하는 것이 아마도 더 일반적으로 유용한 스크립트 일 것입니다.
rob

나는 더 어려운 상황이 있습니다. 문제의 파일이 paht_a / file에서 path_b / file로 이동했습니다. 이제 path_b에서 수행하면 파일이 path_a에서 path_b로 이동할 때까지만 변경 사항이 표시됩니다. path_a에서 수행하면 치명적이라고 알려줍니다. 모호한 인수 '파일': 알 수없는 개정 또는 작업 트리에없는 경로입니다.
Andy Song

@AndySong-검색중인 문자열이 충분히 고유 한 경우 파일 이름을 생략하고 원하는 내용을 얻을 수 있습니다.
rob

나에게 더 편리했습니다. 각 커밋 후에 빈 줄을 놓고 줄을 열거합니다.sfile=path/to/some_file; sfind='string_to_find'; for c in $(git log -G $sfind --format=%H -- $sfile); do git --no-pager grep -e $sfind -n $c -- $sfile; echo; done
John_West

14

gitk로도이 작업을 수행 할 수 있습니다.

gitk file.js

"커밋"드롭 다운에서 "문자열 추가 / 제거 :"를 선택하고 그 옆의 텍스트 상자에 "var identifier ="를 입력하면 해당 문자열을 포함하는 행을 추가하거나 제거하는 모든 커밋이 강조 표시됩니다.


이것은 "var identifier ="를 포함하는 라인이 추가 된 커밋을 정확히 찾아내는 데 도움이되었지만,이 라인을 수정 한 후속 커밋은 표시하지 않습니다.
findchris 2012 년

2
git blame file.js또는 시도 했습니까 git gui blame file.js?
Ethan Brown

1
나는 git blame이 무엇을하는지 압니다. 단일 차이점이 아닌 전체 개정 내역을 찾고 있습니다.
findchris 2012 년

1
git gui blame file.js그렇게 할 것입니다 ... 파일의 모든 개정판과 변경 한 사람을 보여줍니다. 기록을 뒤로 클릭하면됩니다.
Ethan Brown

나는 결국 gitk로 시각적으로 단계별로 진행했습니다. 나는 이것을 할 수있는 우아한 git 기술이 있다고 생각하지만 gitk는 충분했습니다. 감사.
findchris

9

@rob의 대답을 약간만 수정 git log하면 시각적 비교 만 있으면 기본적으로이 작업을 수행합니다.

git log -U0 -S "var identifier =" path/to/file

-U0패치 모드 ( -p)의 출력을 의미하며 패치 주변에 0 줄의 컨텍스트를 표시합니다.

지점 간에도이 작업을 수행 할 수 있습니다.

git log -U0 -S "var identifier =" branchname1 branchname2 -- path/to/file

diff 헤더를 억제하는 방법이있을 수 있지만 모르겠습니다.


나를 위해 일했습니다! 감사.
Roberto Bonini 2015

3

magit 에서는 다음 과 같이 할 수 있습니다.

l, =L

그런 다음 파일을 요청하고 시작, 끝 줄을 묻습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.