source

라인이 삭제/제거되었을 때 커밋을 찾는 방법은 무엇입니까?

ittop 2023. 9. 4. 20:41
반응형

라인이 삭제/제거되었을 때 커밋을 찾는 방법은 무엇입니까?

Git 저장소의 파일에 삭제된 줄이 있습니다.누락된 텍스트 중 일부와 파일을 알고 있었기 때문에git log -S'missingtext' /path/to/file.

하지만 돌아온 것은 누락된 텍스트가 포함된 줄을 추가한 커밋뿐입니다.HEAD에 텍스트가 없었고, 이 텍스트를 추가한 커밋이 브랜치에 있었기 때문에 브랜치 기록에 있는 커밋 중 하나가 이 텍스트를 제거했을 것이라는 것을 알고 있었지만 표시되지 않았습니다.

일부 수동 검색 후 병합을 위한 충돌을 해결하는 동안 실수로 라인이 제거된 것으로 나타났습니다.그래서 궁금한게 있어요.

  1. 이것이 곡괭이가 라인을 삭제한 커밋을 찾지 못한 이유입니까?
  2. 제가 어떻게 "누락된 텍스트"가 삭제된 곳을 찾을 수 있었을까요? 수동으로 역사를 파헤치지 않고 말입니다.

#1에 대한 통찰력은 매우 좋을 것입니다(저는 생각했습니다).git log -S제 대답을 듣고 싶습니다.) 하지만 제 진짜 질문은 2번입니다. 왜냐하면 저는 앞으로 이것을 피할 수 있기 때문입니다.

git log -c -S'missingtext' /path/to/file

git log기본적으로 병합 커밋에 대한 차이는 표시되지 않습니다.사용해 보십시오.-c또는--cc깃발

추가 토론/설명:
https://git-scm.com/docs/git-log
nabble.com

git-log 문서에서:

-c 이 옵션을 사용하면 병합 커밋에 대한 diff 출력은 부모와 결과 사이의 쌍별 차이를 한 번에 하나씩 표시하는 대신 각 부모의 차이를 동시에 표시합니다.또한 모든 부모로부터 수정된 파일만 나열됩니다.

--cc 이 플래그는 -c 옵션을 의미하며 부모의 내용이 두 개의 변형만 있고 병합 결과가 수정 없이 그 중 하나를 선택하는 흥미 없는 헝크를 생략하여 패치 출력을 추가로 압축합니다.

슈퍼 유저: Git: 어떤 커밋이 행을 삭제했는지 어떻게 찾을 수 있습니까?

git blame --reverse START.. file.ext

각 라인에 대해 라인이 있었던 마지막 커밋(예: hash 0123456789)이 표시됩니다.다음에 수행할 커밋은 해당 커밋을 제거한 커밋입니다. 사용git log해시 0123456789를 검색한 다음 후속 커밋을 검색합니다.

빠르고 더러운 방법 #2 - 루프에 a를 사용합니다.

for commit in $(git log --pretty='%H'); do
    git diff -U0 --ignore-space-change "$commit^" "$commit" | grep '^-.*missingtext' > /dev/null && echo "$commit"
done

여기에는 diff에 대한 기본 커밋을 명시적으로 지정하므로 모든 병합 변경사항이 포함됩니다.제가 이걸 생각해낸 이유는git log -c -S...저에게 많은 거짓 긍정을 주고 있었습니다.▁the에서 했을 때git log명령입니다. 제가 찾던 커밋을 건너뛰었습니다.

이 작업은 잠시 동안 실행될 수 있으므로 다음과 같이 지정할 수 있습니다.-n에서.git log명령 또는 배치&& break하나의 결과만 필요한 경우 루프의 끝에 있습니다.

언급URL : https://stackoverflow.com/questions/12591247/how-to-find-commit-when-line-was-deleted-removed

반응형