programing

삭제된 회선을 "git"하려면 어떻게 해야 합니까?

subpage 2023. 4. 9. 21:29
반응형

삭제된 회선을 "git"하려면 어떻게 해야 합니까?

git blame는 변경 및 추가된 행에 적합합니다.단, 특정 이전 커밋에 존재하던 행이 최종적으로 삭제되었을 때는 어떻게 하면 찾을 수 있습니까?저는 생각해 봅니다.bisect좀 더 손쉬운 걸 원했어요

(물어보기 전에: 이 경우, 저는 그냥git log -p그리고 코드라인을 샅샅이 뒤졌는데 (a) 어떤 바보가 방금 전 커밋의 핵심라인을 삭제했고 (b) 나는 그 바보였다.)

이 행의 내용을 알고 있는 경우는, 다음의 용도에 최적입니다.

git log -S <string> path/to/file

이 명령어는 해당 문자열의 인스턴스를 도입 또는 삭제하는 커밋을 보여줍니다.그리고 또...-G<regex>정규 표현도 마찬가지야!man git-log를 검색합니다.-G그리고.-S옵션 또는 곡괭이(이러한 기능의 알기 쉬운 이름)를 참조하십시오.

-S옵션은 실제로 의 헤더에 기재되어 있습니다.git-blame설명 섹션에서도 manpage를 사용하여 예를 제시합니다.git log -S....

네가 정말 원하는 건

git blame --reverse START..END filename

manpage부터:

역사를 거꾸로 가는 것이 아니라 앞으로 걸어가라.선이 나타난 리비전을 표시하는 대신 선이 존재했던 마지막 리비전을 표시합니다.이를 위해서는 START와 같은 일련의 리비전이 필요합니다.START에 비난 경로가 존재하는 END.

와 함께git blame reverse이 행이 마지막으로 나타난 커밋을 찾을 수 있습니다.당신은 여전히 그 뒤에 오는 헌신을 받을 필요가 있습니다.

다음 명령을 사용하여 역방향 git 로그를 표시할 수 있습니다.표시되는 첫 번째 커밋은 해당 행이 마지막으로 표시되는 것이 되며, 다음 커밋은 변경 또는 삭제되었을 때입니다.

git log --reverse --ancestry-path COMMIT^..master

Cascabel의 답변을 완성합니다.

git log --full-history -S <string> path/to/file

여기서 말한 것과 같은 문제가 있었습니다만, 브랜치로부터의 Marge 커밋이 되돌아가서 다시 Marge 되어 문제의 회선을 효과적으로 삭제했기 때문에, 회선이 누락되어 있는 것이 판명되었습니다.--full-historyflag를 지정하면 이러한 커밋을 건너뛸 수 없습니다.

git prame --syslog를 사용하면 회선이 삭제되는 장소에 접근할 수 있습니다.그러나 실제로는 선이 삭제된 리비전을 가리키지는 않습니다.선이 있었던 마지막 리비전을 가리킵니다.다음 리비전이 일반 커밋인 경우 운이 좋아서 삭제 리비전을 얻을 수 있습니다.OTOH, 다음 리비전이 머지 커밋일 경우 상황이 좀 거칠어질 수 있습니다.

difflame을 만들기 위한 노력의 일환으로 저는 이 문제에 대처했습니다.만약 당신이 이미 Python을 당신의 박스에 설치했고, 그것을 시도해보고 싶다면, 더 이상 기다리지 말고 어떻게 되어가는지 알려주세요.

https://github.com/eantoranz/difflame

병합 커밋에 숨겨진 변경의 경우

병합 커밋은 Git 로그 출력에서 자동으로 변경 내용이 숨겨집니다.곡괭이리버스 플레임 모두 변경을 찾을 수 없었다.그래서 제가 원하는 라인이 추가되었다가 나중에 삭제되었고, 그것을 제거한 머지를 찾고 싶었습니다.파일git log -p -- path/file이치노하다

git log -p -U9999 -- path/file

변경 내용을 검색한 후 뒤로 "^commit"을 검색합니다. 첫 번째 "^commit"는 파일에 해당 행이 마지막으로 있는 커밋입니다.^commit'는 ^commit이다.두 번째 커밋은 삭제한 커밋일 수 있습니다.-U9999는 파일이 모두 최대 9999행이라고 가정하고 파일 내용 전체를 (파일이 변경될 때마다) 표시하기 위한 것입니다).

브루트 포스를 통해 관련된 모든 병합을 찾습니다(가능한 각 병합 커밋을 첫 번째 부모와의 차이, 몇 톤의 커밋에 대해 실행).

git log --merges --pretty=format:"git diff %h^...%h | grep target_text" HEAD ^$(git merge-base A B) | sh -v 2>&1 | less

(리비전 필터를 더 제한하려고 했지만 문제가 발생하여 권장하지 않습니다.제가 찾던 추가/삭제 변경은 다른 시간에 병합된 다른 브랜치에 있었습니다.A...B는 변경사항이 실제로 본선에 병합된 시기를 포함하지 않았다.)

다음의 커밋이 있는 Git 트리를 표시합니다(복잡한 Git 기록의 많은 부분이 제거됨).

git log --graph --oneline A B ^$(git merge-base A B)의 첫 , 의 두 번째 ) (A'는 상기의 두 번째 커밋) (B'는 상기의 커밋입니다)

A의 역사, B의 역사, A와 B의 역사 모두 빼주세요.

대체 버전(일반 Git 히스토리 트리보다 경로를 더 선형적으로 보여주는 것처럼 보이지만 일반 Git 히스토리 트리를 선호합니다):

git log --graph --oneline A...B

두 개가 아닌 세 개의 점 - 세 개의 점은 "r1 r2 --$(git merge-base --all r1 r2)"를 의미합니다.이는 r1(왼쪽) 또는 r2(오른쪽) 중 하나에서 도달 가능한 커밋 집합이지만 둘 다에서 도달 가능한 것은 아닙니다." - 소스: "man gitrevisions"

GUI를 원하는 경우 프리웨어 DeepGit을 사용하는 것이 좋습니다.이전 파일 리비전의 비난 보기에서 왼쪽 여백 위로 끌어서 관심 행을 선택합니다.맨 위에 있는 파일의 로그는 해당 행과 관련된 커밋만 표시하도록 필터링됩니다.첫 번째 커밋은 삭제입니다.

언급URL : https://stackoverflow.com/questions/4404444/how-do-i-git-blame-a-deleted-line

반응형