두 개의 Git 커밋간에 변경된 모든 파일 목록을 얻는 방법은 무엇입니까?


178

관료주의로 인해 보고서를 위해 저장소에 변경된 모든 파일 목록을 가져와야합니다 (기존 소스 코드로 시작).

이 목록을 얻으려면 어떻게해야합니까?


34
"때문에 관료"의 xD
ptim

답변:


238

지정된 SHA와 현재 커밋간에 변경된 파일의 경우 :

git diff --name-only <starting SHA> HEAD

또는 아직 커밋되지 않은 변경 파일을 포함하려는 경우 :

git diff --name-only <starting SHA>

보다 일반적으로 다음 구문은 두 커밋간에 변경된 파일 (SHA 또는 다른 이름으로 지정)을 항상 알려줍니다.

git diff --name-only <commit1> <commit2>

2
특정 커밋을 위해 수정 된 파일을 알고 싶다면 다음을 수행하십시오.git diff --name-only <SHA> <SHA>^
thebugfinder

3
--name-status대신 플래그를 사용하면 --name-only파일 목록을 가져와 추가 또는 수정과 같은 수정 상태를 볼 수 있습니다.
Thane Plummer

@Amber는 @Thane 플러머의 메모를 언급해야하는 --name-status그들에게 무슨 일이 있었는지 쇼
졸탄 술레

64

마지막 커밋 이후 수정 된 모든 파일의 이름을 찾으려면

git diff --name-only

또는 (추적되지 않은 파일을 포함하여 조금 더 자세한 정보를 위해) :

git status

48
  • 스테이지되지 않은 추적 된 변경된 파일을 모두 나열하려면 다음을 수행 하십시오.

    git diff --name-only
    
  • 준비된 모든 추적 된 변경된 파일 을 나열하려면

    git diff --name-only --staged
    
  • 모든 스테이지 및 스테이지되지 않은 추적 된 변경된 파일 을 나열하려면 다음을 수행 하십시오.

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
  • 추적되지 않은 모든 파일 (에 의해 나열된 파일 git status이므로 무시 된 파일은 포함하지 않음)을 나열 하려면 다음을 수행하십시오 .

    git ls-files --other --exclude-standard
    

쉘 스크립트에서 이것을 사용하고 있고 이러한 명령이 무엇이든 반환했는지 프로그래밍 방식으로 확인하려면 git diff--exit-code옵션에 관심이 있습니다 .


16

많은 파일을 추가 / 수정 / 삭제하면 (마지막 커밋 이후) 해당 수정 사항을 시간 순으로보고 싶습니다.

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

  • 스테이지되지 않은 모든 파일을 나열하려면 다음을 수행하십시오.

    git ls-files --other --modified --exclude-standard
    
  • 각 파일의 마지막 수정 날짜를 얻으려면

    while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done
    

ruvim 이 의견에서 제안 하지만 :

xargs -0 stat -c '%y %n' -- 
  • 가장 오래된 것부터 최신 것까지 정렬하려면 :

    sort
    

별칭을 사용하면보다 쉽게 ​​사용할 수 있습니다.

alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done|sort'

또는 ( ruvim 덕분에 더 짧고 효율적 )

alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'

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

username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd

이제 가장 오래된 것부터 가장 최근에 이르는 수정 사항을 검토 할 수 있습니다.


xargs단일 호출을 사용하지 않는 이유는 무엇 stat입니까? 전체 원 라이너 :git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
ruvim

@ruvim 감사합니다. 아주 좋은 제안입니다. 더 많은 정보를 제공하기 위해 귀하의 의견을 포함하도록 답변을 수정했습니다.
VonC

4

두 커밋 사이에 내용이 변경된 파일 목록이 필요하므로 (추가 또는 수정 만) 다음과 같이 사용했습니다.

git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>

git diff 문서 와 다른 diff-filter 옵션 :

diff-filter = [(A | C | D | M | R | T | U | X | B)… [[]]

추가 된 파일 (A), 복사 된 파일 (C), 삭제 된 파일 (D), 수정 된 파일 (M), 이름이 변경된 파일 (R) 만 유형 (예 : 일반 파일, 심볼릭 링크, 하위 모듈 등)이 변경된 파일 (T)을 선택하십시오. 병합되지 않음 (U), 알 수 없음 (X) 또는 페어링 끊어짐 (B)이 있습니다. 필터 문자의 조합 (없음 포함)을 사용할 수 있습니다. * (모두 또는 없음)이 조합에 추가되면 비교에서 다른 기준과 일치하는 파일이 있으면 모든 경로가 선택됩니다. 다른 기준과 일치하는 파일이 없으면 아무것도 선택되지 않습니다.

또한이 대문자는 소문자로 제외 할 수 있습니다. 예를 들어 --diff-filter = ad는 추가 및 삭제 된 경로를 제외합니다.

상태 (예 : A / M)도 나열하려면로 변경 --name-only하십시오 --name-status.


3

다음 git status과 같은 grep명령을 사용하여 비 단계적 수정 목록을 얻을 수 있습니다 . 같은 것 git status -s | grep M:

root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
 M src/.../file1.js
 M src/.../file2.js
 M src/.../file3.js
 ....

이것은 스테이지되지 않은 변경에만 사용할 수 있으므로 '두 Git 커밋 사이에서 변경된 파일'에는 유용하지 않습니다.
John Vandenberg

2

함께 git show사용하면 비슷한 결과를 얻을 수 있습니다. git log포함 된 파일 목록이 있는 커밋 ( 보기에 보이는 것처럼)을 보려면 다음을 사용하십시오.

git show --name-only [commit-id_A]^..[commit-id_B]

[commit-id_A]초기 커밋은 어디에 있고 [commit-id_B]표시하려는 것보다 마지막 커밋입니다.

특별한주의^기호. 이를 넣지 않으면 commit-id_A 정보가 배포되지 않습니다.


1

변경된 파일을 확인하려면 변경 한 파일 중 어떤 것이 변경되었는지 확인하려는 경우와 같이 사용하기 가장 좋은 작은 것들을 처리해야합니다.

자식 상태-변경 사항이있는 파일을 표시합니다

변경 사항을 확인하려면 여러 가지 방법으로 확인할 수 있습니다.

git diff-모든 파일의 모든 변경 사항을 표시합니다

하나의 파일 만 수정 된 경우에만 좋습니다

특정 파일을 확인하려면 다음을 사용하십시오.

자식 차이

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