Git 버전 관리를 사용하여 파일의 변경 내역보기


3088

Git에서 개별 파일의 변경 히스토리를 어떻게 볼 수 있습니까?

나는 다음과 같이했습니다.

git log -- [filename]

파일의 커밋 기록을 보여 주지만 각 파일 변경 내용을 어떻게 알 수 있습니까?

나는 MS에서 SourceSafe 전환을 만들려고 노력하고 단순하게하는 데 사용 해요 right-clickshow history.


41
위의 링크는 더 이상 유효하지 않습니다. 이 링크는 현재 작동합니다 : Git 커뮤니티 북
chris

1
위의 링크 (Chris가 게시)는 더 이상 유효하지 않습니다. 이 링크는 오늘 작동합니다 : git-scm.com/book/en/v2
Cog

답변:


2370

이를 위해 다음을 사용합니다.

gitk [filename]

또는 이름을 변경 한 파일 이름을 따르려면

gitk --follow [filename]

28
그러나 나는 시간이지나면서 파일의 소스를 탐색 할 수있게 해주는 위의 'git blame'과 함께 위의 도구를 가지고있다.
Egon Willighagen

26
불행히도 이것은 파일 이름을 바꾼 과거 파일 기록을 따르지 않습니다.
Dan Molding

146
또한 이전에 이름이 바뀌고이 스레드를 먼저 찾은 파일의 기록을 찾고있었습니다. 해결책은 Phil이 여기서 지적한대로 "git log --follow <filename>"을 사용하는 입니다.
Florian Gutmann

115
저자는 명령 행 도구를 찾고있었습니다. gitk는 GIT와 함께 제공되지만 명령 줄 앱이나 특히 GUI는 아닙니다.
mikemaccana

72
그는 명령 행 도구를 찾고 있었습니까? "오른쪽 클릭-> 기록 표시"가 반드시이를 의미하지는 않습니다.
hdgarrood

2234

당신이 사용할 수있는

git log -p filename

git이 각 로그 항목에 대한 패치를 생성하도록합니다.

보다

git help log

더 많은 옵션-실제로 많은 좋은 일을 할 수 있습니다 :) 특정 커밋에 대한 차이점을 얻으려면

git show HEAD 

또는 식별자에 의한 다른 수정. 또는 사용

gitk

변경 사항을 시각적으로 찾아 볼 수 있습니다.


8
git show HEAD는 모든 파일을 보여줍니다 (Richard가 요청 한대로) 개별 파일을 추적하는 방법을 알고 있습니까?
Jonas Byström

5
git show <revision>-filename을 사용하면 해당 개정판의 diff가 존재하는 경우 diff가 표시됩니다.
Marcos Oliveira

4
--stat도 도움이됩니다. -p와 함께 사용할 수 있습니다.
Raffi Khatchadourian

5
대단하다. 더 이상 존재하지 않는 경로를 지정할 때는 gitk가 제대로 작동하지 않습니다. 나는 git log -p-path를 사용했다.
Paulo Casaretto

6
또한 gitk는 부기 몬스터가 만든 것처럼 보입니다. 이것은 훌륭한 답변이며 원래 질문에 가장 잘 맞습니다.
ghayes

1495

git log --follow -p -- path-to-file

파일 의 전체 히스토리 가 표시 됩니다 (이름 변경 이후의 히스토리 및 각 변경에 대한 차이점 포함).

다시 말해, 이름 bar이 지정된 파일의 이름 이 한 번만 지정된 foo경우 git log -p bar( --follow옵션 없이 ) 파일의 이름은 이름이 바뀐 지점까지만 파일의 기록을 표시합니다 foo. 를 사용 git log --follow -p bar하면 파일의 알려진 변경 사항을 포함하여 파일의 전체 기록이 표시됩니다 foo. 이 -p옵션을 사용하면 각 변경마다 diff가 포함됩니다.


18
--stat도 도움이됩니다. -p와 함께 사용할 수 있습니다.
Raffi Khatchadourian

23
이것이 실제 답변이라는 데 동의합니다. (1.)을 사용 --follow하면 파일 이름 바꾸기 (2.) -p를 확인할 수 있으며 파일이 어떻게 변경되는지 확인할 수 있습니다 (3.) 명령 줄 만 해당됩니다.
Trevor Boyd Smith

3
@ NHDaly 나는 --추가 된 것을 알지만 이것이 왜 이것이 최선인지 모르겠습니까? 그것이 무엇입니까?
Benjohn

40
@Benjohn이 --옵션은 Git에게 옵션의 끝에 도달했으며 다음에 오는 것은 --인수로 취급되어야한다고 지시 합니다. 이를 위해 git log경로 이름이 대시로 시작하는 경우에만 차이가 있습니다 . 불행한 이름이 "--follow"인 파일의 히스토리를 알고 싶다고 가정 해보십시오.git log --follow -p -- --follow
Dan Molding

10
@ Benjohn : 일반적으로 입력 한 파일 이름과 일치하는 이름을 막을 --수 있기 때문에 유용합니다 revision. 실제로 무섭습니다. 예를 들어 foo, 이름이 브랜치와 파일이 모두있는 경우 파일 git log -p foo히스토리가 foo아닌 git 로그 히스토리를 표시 합니다 foo . 그러나 @DanMoulding은 --follow명령이 하나의 파일 이름 만 인수로 사용 하므로이 파일이 인수 일 수 없으므로 덜 필요합니다 revision. 방금 배웠습니다. 아마도 당신은 그것을 당신의 대답에서 벗어나는 것이 옳았을 것입니다; 잘 모르겠습니다.
NHDaly

172

텍스트 기반을 유지하려면 tig 를 사용하십시오 .

빠른 설치:

  • apt-get :# apt-get install tig
  • 사제 (OS X) :$ brew install tig

단일 파일에서 히스토리를 보려면 다음을 사용하십시오. tig [filename]
또는 자세한 리포지토리 히스토리를 찾아보십시오.tig

gitk텍스트 기반과 유사합니다 . 터미널에서 색상을 지원합니다!


23
훌륭한 텍스트 기반 도구, 훌륭한 답변. 헤드리스 서버에 gitk 설치에 대한 종속성을 보았을 때 놀랐습니다. A +++를 다시지지 하시겠습니까
Tom McKenzie

tig를 사용하여 특정 파일을 볼 수도 있습니다.tig -- path/to/specific/file
gloriphobia

109

git whatchanged -p filenamegit log -p filename이 경우 에도 마찬가지입니다.

파일 내부의 특정 코드 줄이로 변경된시기도 확인할 수 있습니다 git blame filename. 파일의 모든 줄에 대해 짧은 커밋 ID, 작성자, 타임 스탬프 및 전체 코드 줄이 인쇄됩니다. 버그를 발견 한 후 버그가 발생한 시점 (또는 결함이 누구인지)을 알고 자 할 때 매우 유용합니다.


4
+1이지만 filenamecommand에서 선택 사항은 아닙니다 git blame filename.
rockXrock

7
"새로운 사용자는 대신 git-log를 사용하는 것이 좋습니다. (...) 명령은 주로 역사적 이유로 유지됩니다."
ciastek

104

SourceTree 사용자

SourceTree를 사용하여 리포지토리를 시각화하는 경우 (무료이며 상당히 좋음) 파일을 마우스 오른쪽 단추로 클릭하고 선택한 로그를 선택할 수 있습니다.

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

디스플레이 (아래)는 gitk 및 대부분의 다른 옵션보다 훨씬 친숙합니다. 불행히도 (현재) 커맨드 라인에서이 뷰를 쉽게 시작할 수있는 방법은 없습니다 – 현재 SourceTree의 CLI는 repos를 엽니 다.

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


1
특히 "이름이 바뀐 파일 따르기"옵션이 마음에 들어 파일 이름이 바뀌 었는지 또는 이동했는지 확인할 수 있습니다.
Chris

그러나 내가 실수하지 않으면 (알려주세요!), GUI에서 한 번에 두 가지 버전 만 비교할 수 있습니까? 한 번에 여러 가지 다른 버전을 비교할 수있는 우아한 인터페이스를 가진 클라이언트가 있습니까? Sublime Text와 같은 축소보기가 있습니까? 그렇게 생각하면 정말 유용 할 것입니다.
Sam Lewallen 2016 년

@SamLewallen 올바르게 이해하면 세 가지 커밋을 비교하고 싶습니까? 이것은 3 방향 병합 (광산, 사용자, 기본)과 비슷하게 들립니다. 일반적으로이 전략은 3 개의 임의 커밋을 반드시 비교할 필요는없는 병합 충돌을 해결하는 데 사용됩니다. 이 지원 세 가지 방법 병합이 많은 도구 stackoverflow.com/questions/10998728/...~~V는 하지만 트릭은 특정 개정은 이러한 도구를 공급한다 gitready.com/intermediate/2009/02/27/...
마크 폭스

고마워 마크 폭스, 그게 내 뜻이야 그렇게 할 응용 프로그램에 대해 알고 있습니까?
Sam Lewallen 2016 년

1
@ MarnenLaibow-Koser 당시 SHA가 필요한 이유를 기억할 수 없습니다. 아하하
AechoLiu

63

파일의 각 행을 마지막으로 수정 한 개정 및 작성자를 표시하려면 다음을 수행하십시오.

git blame filename

또는 강력한 비난 GUI를 사용하려는 경우 :

git gui blame filename

49

다른 답변을 읽고 조금만 연주 한 후의 다른 답변 요약 :

일반적인 명령 줄 명령은

git log --follow --all -p dir/file.c

그러나 gitk (gui) 또는 tig (text-ui)를 사용하여 사람이 읽을 수있는 훨씬 더 읽기 쉬운 방법을 제공 할 수도 있습니다.

gitk --follow --all -p dir/file.c

tig --follow --all -p dir/file.c

debian / ubuntu에서이 멋진 도구에 대한 설치 명령은 다음과 같습니다.

sudo apt-get install gitk tig

그리고 나는 현재 다음을 사용하고 있습니다 :

alias gdf='gitk --follow --all -p'

gdf dir하위 디렉토리에있는 모든 것에 대한 집중된 역사를 얻기 위해 입력 할 수 있습니다 dir.


2
나는 이것이 큰 대답이라고 생각합니다. 어쩌면 git 외에도 gitk 및 tig를 통해 변경 사항을 볼 수있는 다른 방법 (IMHO 더 나은)에 대답하기 때문에 투표하지 않을 수도 있습니다.
PopcornKing

답변에 추가하기 만하면됩니다. 경로를 찾으십시오 (git 공간에서 저장소에 여전히 존재합니다). 그런 다음 위에서 언급 한 "git log --follow --all -p <folder_path / file_path>"명령을 사용하십시오. filde / 폴더가 히스토리에서 제거되었을 수 있으므로 여전히 존재하는 최대 경로를 찾고 히스토리를 가져 오려고 시도하십시오. 작동합니다!
parasrish

2
--all모든 지점에 대해, 나머지는 댄의 답변 @에 설명되어있다
cregox

1
오, 오랜만에 파일명을 넘어서서 파일을 추적 할 수있는 좋은 해결책을 찾다가 마침내 여기에서 찾았습니다. 매력처럼 작동합니다! 감사!
xZero

25

이 별칭을 .gitconfig에 추가하십시오.

[alias]
    lg = log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\n--abbrev-commit --date=relative

그리고 다음과 같은 명령을 사용하십시오.

> git lg
> git lg -- filename

출력은 gitk 출력과 거의 동일하게 보입니다. 즐겨.


그 바로 가기를 실행 한 후 "아름다움!"이라고 말했습니다. 그러나 "--graph"다음의 "\ n"은 오류입니다.
jmbeck

3
또한 사용할 수 있습니다 git lg -p filename-검색 된 파일의 아름다운 diff를 반환합니다.
Egel

22

최근에 나는 tig그것이 매우 유용하다는 것을 발견 하고 발견했다. A 또는 B를 원하지만 대부분의 경우 깔끔한 경우가 있습니다.

귀하의 경우, tig <filename>당신이 찾고있는 것일 수 있습니다.

http://jonas.nitro.dk/tig/


centos yum에 설치 tig
zzapper

17

당신은 함께 vscode을 사용할 수 있습니다 GitLens 그것은 매우 강력한 도구이다. GitLens를 설치 한 후 GitLens 탭으로 이동하여 선택 FILE HISTORY하면 찾아 볼 수 있습니다.

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


15

이 정확한 목적으로 git-playback 을 썼습니다.

pip install git-playback
git playback [filename]

이렇게하면 결과를 명령 줄 (예 git log -p:)에 표시하는 동시에 화살표 키 (예 :)를 사용하여 각 커밋을 단계별로 진행할 수 있습니다 gitk.


13

또는:

gitx -- <path/to/filename>

gitx를 사용하는 경우


1
어떤 이유로 든 내 gitx가 비어 있습니다.
IgorGanapolsky

@IgorGanapolsky 당신은 당신이 당신의 자식 저장소의 루트에 있는지 확인해야합니다
zdsbs

9

당신이 파일의 전체 역사를보고 싶다면 포함다른 모든 지점 사용

gitk --all <filename>

9

파일의 특정 부분을 변경 한 커밋을 나열하는 이것을 시도 할 수도 있습니다 (Git 1.8.4에서 구현 됨).

반환 된 결과는이 특정 부분을 수정 한 커밋 목록입니다. 사령부 :

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

여기서 upperLimit는 start_line_number이고 lowerLimit은 파일의 ending_line_number입니다.

자세한 내용은 https://www.techpurohit.com/list-some-useful-git-commands


7

뛰어난 Git Extensions 를 사용하면 파일이 여전히 존재하는 기록의 한 지점으로 이동하고 (삭제 된 경우 그렇지 않으면 HEAD로 이동) File tree탭으로 전환 하고 파일을 마우스 오른쪽 버튼으로 클릭하고을 선택하십시오 File history.

기본적으로 파일 이름 변경을 통해 파일을 따르며 Blame탭을 사용하면 지정된 개정판에서 이름을 볼 수 있습니다.

삭제 개정을 클릭 할 때 탭에 표시 fatal: Not a valid object name되는 것과 같은 사소한 문제가 View있지만 그와 함께 살 수 있습니다. :-)


이것이 Windows 전용이라는 점에 주목할 가치가 있습니다.
Evan Hahn

3
@EvanHahn은 정확하지 않지만 모노를 통해 Linux에서도 GitExtension을 사용할 수 있습니다. 우리는 우분투에서 사용하고 아주 행복합니다. git-extensions-documentation.readthedocs.org/en/latest/…
Shmil The Cat

7

리포지토리 메뉴에서 git GUI (Windows의 경우)를 사용하는 경우 "마스터 히스토리 시각화"를 사용할 수 있습니다. 상단 창에서 커밋을 강조 표시하고 오른쪽 아래에서 파일을 강조 표시하면 왼쪽 하단에 커밋에 대한 차이점이 표시됩니다.


이 질문에 어떻게 대답합니까?
jmbeck

3
음, OP는 명령 줄을 지정하지 않았으며 SourceSafe (GUI 인)에서 이동하면 Windows의 Git GUI에서 VSS에서 할 수있는 것과 거의 동일한 작업을 수행 할 수 있음을 지적하는 것이 적절했습니다.
cori

6

SmartGit :

  1. 메뉴에서 변경되지 않은 파일을 표시 할 수 있습니다. 변경되지 않은 파일보기 / 표시
  2. 파일을 마우스 오른쪽 버튼으로 클릭하고 '로그'를 선택하거나 'Ctrl-L'을 누르십시오

4

이 스레드에서 없었던 것으로 찾은 대답은 커밋을 위해 준비된 파일의 변경 사항을 보는 것입니다. 즉

git diff --cached

1
로컬 (unstaged) 변경을 포함 할 경우, 나는 종종 실행 git diff origin/master해당 지역의 지점 및 (을 통해 원격에서 업데이트 할 수 있습니다 마스터 지점 사이의 완전한 차이를 보여주기 위해 git fetch)
ghayes

4

TortoiseGit을 사용하는 경우 파일을 마우스 오른쪽 버튼으로 클릭하고 수행 할 수 TortoiseGit --> Show Log있습니다. 팝업 창에서 다음을 확인하십시오.

  • ' Show Whole Project'옵션이 선택되지 않았습니다.

  • ' All Branches'옵션이 선택되었습니다.


TortoiseGit (및 Eclipse Git도)은 선택한 파일의 개정판을 놓치므로 믿을 수 없습니다!
노암 마 노스

@NoamManos, 나는 그 문제를 겪지 않았으므로 진술이 올바른지 확인할 수 없습니다.
user3885927

내 실수는 Eclipse에서만 발생하지만 TortoiseGit에서는 "모든 프로젝트 표시"를 선택 취소하고 "모든 분기"를 확인하면 파일이 모든 분기를 확인할 수 있습니다 (파일이 다른 분기에서 커밋 된 경우 main에 병합되기 전에) 분기). 답변을 업데이트하겠습니다.
Noam Manos

3

git diff -U <filename> 당신에게 통일 된 diff를 제공하십시오.

빨간색과 초록색으로 표시되어야합니다. 그렇지 않은 경우 git config color.ui auto먼저 실행하십시오 .


2

git 플러그인과 함께 이클립스를 사용하는 경우 히스토리와 우수한 비교보기가 있습니다. 파일을 마우스 오른쪽 버튼으로 클릭하고 "compare with"=> "history"를 선택하십시오.


그러나 삭제 된 파일을 찾을 수는 없습니다.
avgvstvs

두 버전의 파일을 비교하는 것은 파일의 변경 기록을 보는 것과 다릅니다
golimar

0

나는이 날 사용하게 할 뭔가 간단한 찾고, 시작했을 때 영업 이익이 어디에 있는지에 대해 아마 해요 자식 difftoolvimdiff 특정 커밋을부터 내의 repo에서 파일을 검토 변화. 나는 내가 찾은 답변에 너무 만족하지 않았 으므로이 git inc remental rep orter (gitincrep) 스크립트를 함께 던졌고 나에게 유용했습니다.

#!/usr/bin/env bash

STARTWITH="${1:-}"
shift 1

DFILES=( "$@" )

RunDiff()
{
        GIT1=$1
        GIT2=$2
        shift 2

        if [ "$(git diff $GIT1 $GIT2 "$@")" ]
        then
                git log ${GIT1}..${GIT2}
                git difftool --tool=vimdiff $GIT1 $GIT2 "$@"
        fi
}

OLDVERS=""
RUNDIFF=""

for NEWVERS in $(git log --format=format:%h  --reverse)
do
        if [ "$RUNDIFF" ]
        then
                RunDiff $OLDVERS $NEWVERS "${DFILES[@]}"
        elif [ "$OLDVERS" ]
        then
                if [ "$NEWVERS" = "${STARTWITH:=${NEWVERS}}" ]
                then
                        RUNDIFF=true
                        RunDiff $OLDVERS $NEWVERS "${DFILES[@]}"
                fi
        fi
        OLDVERS=$NEWVERS
done

인수없이 호출하면 리포지토리 기록의 시작 부분부터 시작합니다. 그렇지 않으면 제공하는 약식 커밋 해시로 시작하여 현재로 진행합니다. 언제든지 Ctrl-C를 눌러 종료 할 수 있습니다. 첫 번째 이후의 인수는 차이 보고서에 해당 인수 사이에 나열된 파일 만 포함하도록 제한합니다 (OP가 원했던 것으로 생각하고 작은 프로젝트를 제외한 모든 프로젝트에 권장합니다). 특정 파일의 변경 사항을 확인하는 경우 처음부터 시작하려면, 당신은 ARG1에 대해 빈 문자열을 제공해야합니다. vim 사용자가 아닌 경우 vimdiff 를 자주 사용하는 diff 도구로 바꿀 수 있습니다 .

동작은 관련 변경 사항이 발견되면 커밋 주석을 출력하고 변경된 각 파일에 대해 vimdiff 실행 제공을 시작하는 것입니다 ( git difftool 동작이지만 여기서 작동합니다).

이 접근 방식은 아마도 순진하지만, 여기 및 관련 게시물에서 많은 솔루션을 살펴보면 관리자 액세스 권한이없는 시스템에 자체 학습 곡선이있는 인터페이스로 새로운 도구를 설치하는 것과 관련이 있습니다. 위의 스크립트는 내가 다루지 않고 원하는 것을했습니다. 좀 더 정교한 무언가가 필요할 때 여기에 많은 훌륭한 제안을 살펴볼 것입니다. 그러나 이것이 OP에 직접 반응한다고 생각합니다.


0

파일 기록을 빠르게 찾을 수있는 매우 간단한 솔루션을 찾았습니다.

  1. 파일을 임의로 변경하십시오.
  2. 소스 트리에서 커밋되지 않은 변경 사항으로 표시됩니다.
  3. 파일을 마우스 오른쪽 버튼으로 클릭하고 '로그 선택'을 선택하십시오.

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

그것은 모든 커밋의 역사를 보여줄 것입니다.


이 GUI는 어디에서 왔습니까?
colidyre

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