git 커밋하기 전에 파일에서 변경된 내용을 어떻게 알 수 있습니까?


351

한두 장의 티켓으로 작업하는 동안 물러 나면 내가 무엇을했는지, 무엇이 바뀌 었는지 등이 확실하지 않습니다.

git add 및 git commit 전에 주어진 파일에 대한 변경 사항을 볼 수있는 방법이 있습니까?

답변:


525

찾고 있습니다 git diff. 정확한 상황에 따라 세 가지 유용한 방법이 있습니다.

# show differences between index and working tree
# that is, changes you haven't staged to commit
git diff [filename]
# show differences between current commit and index
# that is, what you're about to commit
# --staged does exactly the same thing, use what you like
git diff --cached [filename]
# show differences between current commit and working tree
git diff HEAD [filename]

디렉토리에서 재귀 적으로 작동하며 경로가 제공되지 않으면 모든 변경 사항이 표시됩니다.


1
@ sveilleux2 아니요, 그냥 인수없이 git diff를 실행하십시오. 답의 마지막 문장에서 알 수 있듯이 경로가 제공되지 않으면 모든 변경 사항이 표시됩니다. (괄호 [filename]는 선택적 인수 를 나타냅니다.) *셸을 사용하면 모든 파일을 셸에 표시 할 수 있으므로 하위 디렉토리에있는 경우 전체 저장소가 아닌 해당 하위 디렉토리의 항목 만 가져옵니다. 숨겨진 파일의 변경 사항이 누락됩니다.
Cascabel

# 현재 커밋과 인덱스 #의 차이점, 즉 커밋하려는 내용 git diff --cached [filename] 다음을 의미하지는 않습니다. # 현재 커밋과 인덱스의 차이점을 보여줍니다. 하는 밀어 ? git diff --cached [파일 이름]
ofarooq

3
파일을 추가 한 후 (예 : "git add"뒤에) 차이점을 보려면 "git diff --staged [filename]"
Sidtharthan

아, 왜 그렇게 복잡해?! 우리가 수십 개의 파일을 가지고 있다면 어떨까요? git interface에 대해 불평하는 것 ... 그래, git add -p모든 파일을 검사하는 대안 인 것 같습니다 .
커비

@Jefromi- git diff --staged [filename]더 자주 필요한 상황이므로 기본 답변을 추가 하십시오.
나사로 서 스턴



8

나에게 git add -p모든 단계 화되지 않은 변경 사항 (각 파일의 차이점을 보여줍니다)을 검토하고 커밋과 함께해야 할 변경 사항을 선택하는 가장 유용한 방법입니다 (git 개발자가 생각한 것입니까?) 이들을 모두 준비한 다음을 사용 git commit하고 다음 커밋에 대해 반복하십시오. 그런 다음 각 커밋이 다양한 파일에서 발생하더라도 유용하거나 의미있는 변경 집합을 만들 수 있습니다. 또한 각 티켓 또는 유사한 활동에 대해 새 브랜치를 작성하고 checkout(아마도 git stash전환하기 전에 커밋하지 않으려는 경우 사용)을 사용하여 이들 사이를 전환하는 것이 좋습니다 .하지만 많은 빠른 변경을 수행하는 경우 어려움이 있습니다. 자주 병합하는 것을 잊지 마십시오.


따라서 git add 파일 이름 대신 git add -p?
Timothy T.

1
git add -p는 스테이징의 조합으로, 스테이징 가능한 변경 사항을보고 대화식 방식으로 하나씩 변경 사항을 선택합니다. git add -p에 대한 자세한 내용 은 Git에서 파일의 일부만 커밋을 참조하십시오 .
Angelos Asonitis

5

git diff

작업 트리와 인덱스 또는 트리 간 변경 사항, 인덱스와 트리 간 변경 사항, 두 트리 간 변경 사항 또는 디스크의 두 파일 간 변경 사항을 표시합니다.


따옴표가 너무 큽니다. 기본적으로 작업 트리와 인덱스 사이의 첫 번째 비교를 수행합니다.
Cascabel

4

변경 사항을 커밋하고 있음을 기억하십시오파일이 아닌 .

이러한 이유로 git add -p변경 사항을 추가하는 데 사용하지 않는 경우는 매우 드 rare니다 .


2
git은 변화를 다루지 않습니다. 마치 혼란과 실수의 주요 원인 인 것처럼 생각하려고합니다. git은 스냅 샷을 처리합니다.
Chris Dodd

3
git diff <path>/filename

경로는 파일까지의 완전한 시스템 경로
일 수 있거나 프로젝트에있는 경우
경로를 사용 하여 수정 된 파일의 수정 된 파일 경로를 붙여 넣습니다 .git status


2

글쎄, 당신이 파일 목록에 관심이없는 내 경우. 그들 모두를 보여주십시오.

git add파일 목록으로 이미 실행 한 경우 :

$ git diff --cached $(git diff --cached --name-only)

의 최신 버전에서는 다음과 같은 동의어를 git사용할 --staged수도 있습니다.--cached .

--cached옵션을 추가하지 않고 파일을 추가하지 않은 경우에도 마찬가지 입니다.

$ git diff $(git diff --name-only)

"캐시 된"옵션에 대한 Git 명령 별명 :

$ git config --global alias.diff-cached '!git diff --cached $(git diff --cached --name-only)'

3
세부 사항에 감사드립니다 git diff --cached --name-only는 내가 찾던 명령이었습니다 ....
Doogle

1

해당 git repo로 이동 한 다음 아래 명령을 실행하십시오.

git diff 파일 이름

변경 사항이 표시된 파일을 열고 return / enter 키를 눌러 파일을 아래로 스크롤하십시오.

PS 파일 이름에는 파일의 전체 경로가 포함되어야합니다. 그렇지 않으면 파일의 해당 디렉토리 / 폴더로 이동하여 전체 파일 경로없이 실행할 수 있습니다.


0

git-friendly 텍스트 편집기를 사용할 수도 있습니다. 수정 된 라인의 색상, 추가 된 라인의 다른 색상, 삭제 된 라인의 다른 색상 등을 표시합니다.

이를 수행하는 좋은 텍스트 편집기는 GitHub의 Atom 1.0 입니다.

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