힘내 비난-사전 커밋?


390

지정된 행 대한 커밋 기록 git blame과 같이에 의해 커밋이보고 되기 전에 특정 라인을 편집 한 사람을 볼 수 있습니까?

예를 들어, 훌륭한 uncrustify프로젝트 에서 다음을 실행합니다 .

$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"

커밋 하기 전에 누가 그 줄을 편집했는지 어떻게 알 수 fe25b6d있습니까? 누가 전에 편집 한 커밋?


7
이전 커밋을 찾는 이유가 공백 변경 인 경우 -w옵션을 사용하십시오 . 또한이 -M이동 / 복사 코드
brita_

주어진 단어와 관련된 모든 커밋을 찾으려면 아래 스크립트를
VonC

여기 github의의에이 기능을 추가 할 수있는 유용한 스크립트입니다 greasyfork.org/en/scripts/...은
아론 호프만

3
@AaronHoffman이 게시했을 때 github의 모습이 확실하지 않지만 github에서 너무 쉽게 비난하고 이전 버전의 비난을 받을 수 있습니다 .
ruffin

답변:


389
git blame -L 10,+1 fe25b6d^ -- src/options.cpp

git blame의 개정판을 지정하여 (기본값이 아닌) 처음부터 되돌아 볼 수 있습니다 HEAD. fe25b6d^의 부모입니다 fe25b6d.


106
다른 해시로 명령을 여러 번 다시 입력하지 않고도 완전한 기록을 얻을 수 있습니까?
Anders Zommarin

13
나는 Git이 줄 번호를 건드린 모든 책임을 얻는 내장 된 방법을 가지고 있다고 생각하지 않는다. 라인).
Amber

17
@ Amber : 기능이 존재하지 않는다는 것이 옳다는 것을 확신하십시오. 그러나 인간이하는 일을 단순히 수행함으로써 순진하게 구현 될 수있는 것처럼 보입니다. 한 번만 비난하고보고 된 정보를 가져 와서 , 등등.
Cascabel

15
git gui를 사용하면 버전을 클릭 할 수 있으므로 행 기록을 쉽게 확인할 수 있습니다.
Zitrax

5
@shadyabhi --는 일반적으로 명령 줄 인수에서 구분자로 사용됩니다. Git의 경우 일반적으로 커밋 해시와 같은 것을 파일 이름 목록에서 분리하는 데 사용됩니다.
Amber

191

git log -L 을 사용 하여 다양한 라인의 진화를 볼 수 있습니다 .

예를 들면 다음과 같습니다.

git log -L 15,23:filename.txt

"filename.txt라는 파일에서 15 행에서 23 행의 진화를 추적"을 의미합니다.


12
이것은 확실한 대답이며 시간이 지남에 따라 특정 줄의 변경 사항을 보는 방법에 대한 Anders Zommarin의 질문을 해결합니다.
bigtex777

4
참고 : 자식 로그 -L <시작>, <끝> : <파일> 필요 힘내 1.8.4+ 참조 : git-scm.com/docs/git-log#git-log--Lltstartgtltendgtltfilegt를 구문 옵션
네온

30

앰버의 대답은 정확하지만 명확하지 않습니다. 구문은 다음과 같습니다.

git blame {commit_id} -- {path/to/file}

참고 :는 --트리 파일 sha1을 상대 파일 경로와 구분하는 데 사용됩니다. 1

예를 들면 다음과 같습니다.

git blame master -- index.html

모든 것을 아는 것에 대한 앰버의 완전한 신용 ! :)


1
나는 당신의 감정에 동의합니다. 그러나 의견 시스템은 모든 정보를 명확하게 제시하기에는 너무 제한적입니다. 이 답변의 내용을 의견에 추가했습니다. 그러나 나는이 대답을 남기는 것이 접근하기 쉬운 곳이라고 주장합니다.
ThorSummoner 2018 년

1
별도의 게시물이거나 수정 사항이어야합니다. 나는 이것을 별도의 대답으로 좋아한다.
Flimm

27

당신은 체크 아웃 할 수 있습니다 :

git gui blame <filename>

이전 커밋으로 이동하기 위해 "git blame"과 같은 변경 사항을 한 줄에 클릭 가능한 링크와 함께 멋진 그래픽으로 표시합니다. 커밋 세부 정보가 포함 된 팝업을 보려면 링크 위로 마우스를 가져갑니다. 내 크레딧이 아닙니다 ... 여기에서 찾았습니다.

http://zsoltfabok.com/blog/2012/02/git-blame-line-history/

git guigit에 대한 그래픽 Tcl / Tc 인터페이스입니다. 다른 매개 변수가 없으면 파일, 덩어리 또는 단일 행 및 수정, 되돌리기, 푸시와 같은 기타 유사한 명령을 커밋하기위한 매우 간단하지만 유용한 그래픽 응용 프로그램을 시작합니다 ... git stock suite의 일부입니다. Windows에서는 설치 프로그램에 포함되어 있습니다. 데비안에서는 다른 * nix 시스템에 대해 잘 모릅니다. 별도로 설치해야합니다.

apt-get install git-gui

문서에서 :

https://git-scm.com/docs/git-gui

기술

Git에 대한 Tcl / Tk 기반 그래픽 사용자 인터페이스. git gui는 새로운 커밋, 기존 커밋 수정, 브랜치 생성, 로컬 병합 수행, 원격 리포지토리 가져 오기 / 푸시 등을 통해 사용자가 리포지토리를 변경할 수 있도록하는 데 중점을 둡니다.

gitk와 달리 git gui는 커밋 생성 및 단일 파일 주석에 중점을두고 프로젝트 기록을 표시하지 않습니다. 그러나 git gui 내에서 gitk 세션을 시작하기위한 메뉴 조치를 제공합니다.

git gui는 널리 사용되는 모든 UNIX 시스템, Mac OS X 및 Windows (Cygwin 및 MSYS)에서 작동하는 것으로 알려져 있습니다. 가능한 OS 고유의 사용자 인터페이스 지침을 따르는 범위 내에서 git gui는 사용자에게 상당히 고유 한 인터페이스가됩니다.

명령

비난

지정된 버전 (또는 지정되지 않은 경우 작업 디렉토리)의 지정된 파일에서 Blame Viewer를 시작하십시오.

브라우저

지정된 커밋의 모든 파일을 보여주는 트리 브라우저를 시작하십시오. 브라우저를 통해 선택한 파일이 Blame Viewer에서 열립니다.

citool

git gui를 시작하고 종료하고 쉘로 돌아 가기 전에 정확히 하나의 커밋을 준비하십시오. 인터페이스는 커밋 작업으로 만 제한되어 응용 프로그램의 시작 시간을 약간 줄이고 메뉴 표시 줄을 단순화합니다.

버전

현재 실행중인 git gui 버전을 표시합니다.


그것은 나를 위해 작동하지 않습니다. 주어진 줄에서 변경 사항을 클릭 할 수는 있지만 해당 커밋에 대한보기를 변경하면 현재 줄은 다음과 같이 표시됩니다 this.
BeeOnRope

이것은 내가 자식 GUI가 가장 좋은 방법입니다 알고있는 하나의 유스 케이스입니다
cambunctious

17

이전 답변을 바탕 으로이 bash one-liner는 원하는 것을 제공해야합니다. 마지막 5 개 개정판을 통해 특정 파일의 특정 라인에 대한 git blame 이력을 표시합니다.

LINE=10 FILE=src/options.cpp REVS=5; for commit in $(git rev-list -n $REVS HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done

이 명령의 출력에서 ​​특정 커밋에 대해 행 변경 내용이 표시되거나 행 번호가 변경 될 수도 있습니다.

이것은 종종 특정 커밋 후에 행이 처음으로 추가되었음을 나타냅니다. 또한 파일의 다른 부분에서 행이 이동했음을 나타낼 수도 있습니다.


5
이것은 $ LINE이 변경된 마지막 $ REVS 개정이 아니라 $ FILE이 변경된 마지막 $ REVS 개정입니다.
Max Nanasy

어떤 대답을 하시겠습니까?
Flimm

더 이상 기억이 없습니다. 아마도 내 대답을 더 잘 증명할 수 있었을 것입니다.
윌 셰퍼드


11

이 문제에 대한 매우 독특한 해결책은 git log를 사용하는 것입니다.

git log -p -M --follow --stat-경로 / to / your / file

Andre가 여기에서 설명했듯이


1
이것을 사용하기 위해 별명을 만든 git config --global alias.changes 'log -p -M --follow --stat --'다음 간단히 입력 할 수 있습니다.git changes path/to/your/file
Tizio Fittizio

이것은 지금까지 가장 좋은 대답이며 정확히 내가 찾던 것입니다. 간단하고 우아합니다.
maesk

10

JetBrains Idea IDE (및 파생 상품)를 사용하는 경우 여러 줄을 선택할 수 있으며 상황에 맞는 메뉴를 마우스 오른쪽 버튼으로 클릭 한 다음 Git-> 내역 표시를 선택하십시오. 선택한 행에 영향을 준 커밋 목록이 표시됩니다.

여기에 이미지 설명을 입력하십시오


이것은 IntelliJ를 사용하는 다른 대답보다 더 효과적이었습니다. 모든 개정판을로드하는 데 시간이 걸렸지 만 기다릴만한 가치가 있습니다.
Steve Chambers

1

Will Shepard의 답변을 기반으로, 그의 출력에는 변경 사항이없는 커밋에 대한 중복 줄이 포함되므로 다음과 같이 필터링 할 수 있습니다 (이 답변 사용 )

LINE=1 FILE=a; for commit in $(git rev-list HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

REVS 인수를 제거하면 루트 커밋으로 돌아갑니다. 이것은 위의 Max Nanasy의 관찰 때문입니다.


1

DavidN의 답변을 바탕으로 이름이 바뀐 파일을 따르고 싶습니다.

LINE=8 FILE=Info.plist; for commit in $(git log --format='%h%%' --name-only --follow -- $FILE | xargs echo | perl -pe 's/\%\s/,/g'); do hash=$(echo $commit | cut -f1 -d ','); fileMayRenamed=$(echo $commit | cut -f2 -d ','); git blame -n -L$LINE,+1 $hash -- $fileMayRenamed; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

참조 : git log에 파일 이름 변경 내역을 멋지게 표시


1

Git 2.23부터 git blame --ignore-rev를 사용할 수 있습니다

질문에 주어진 예에서 이것은 다음과 같습니다.

git blame -L10,+1 src/options.cpp --ignore-rev fe25b6d

(그러나 fe25b6d가 파일의 첫 번째 개정판이기 때문에 까다로운 질문입니다!)


0

이 작은 bash 스크립트를 사용하여 비난 기록을 봅니다.

첫 번째 매개 변수 : 볼 파일

후속 매개 변수 : 자식 비난에 전달

#!/bin/bash
f=$1
shift
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    echo "--- $hash"
    git blame $@ $hash -- "$f" | sed 's/^/  /'
  done
}

-L 70, + 10 과 같은 비난 매개 변수를 제공 할 수 있지만 줄 번호는 일반적으로 시간이 지남에 따라 "변경"되므로 git blame의 정규식 검색을 사용하는 것이 좋습니다.


0

stangls답변바탕 으로이 스크립트를 PATH (Windows에서도)에 git-bh로 넣습니다.

이를 통해 단어가 관련된 모든 커밋을 찾을 수 있습니다.

git bh path/to/myfile myWord

스크립트:

#!/bin/bash
f=$1
shift
csha=""
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    res=$(git blame -L"/$1/",+1 $hash -- "$f" 2>/dev/null | sed 's/^/  /')
    sha=${res%% (*}
    if [[ "${res}" != "" && "${csha}" != "${sha}" ]]; then
      echo "--- ${hash}"
      echo "${res}"
      csha="${sha}"
    fi
  done
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.