Git diff를 사용하여 변경사항 비교

git diff

깃에서 변경 사항들을 보여주는 명령이다.

워킹 디렉토리들 간의 변경사항, 스테이지 영역, 워킹 디렉토리에서 변한사항들, 로컬과 깃허브에서 변경 사항 등에 적용될 수 있는 명령이다.

git status나 git log처럼 아무런 영향도 미치지 않는다. 그저 정보만

이런 파일 구조를 가지고 있는 디렉토리 안에서 몇가지 변경사항을 만들었다. 그렇지만 파일 양이 방대하고, 내용도 길어서 찾아내기가 힘들다. 

그럴 때 git diff 를 써서 다음 커밋을 위해 스테이지에 등록되지 않은 워킹 디렉토리의 변경사항을 모두 나열한다.

git status 를 사용해서 확인을 해보면 3개의 파일이 수정되었고, 스테이지에 등록되지 않았다.

 

git diff

git diff 명령을 하면 파일명과 변경된 라인이 표시가 된다.


git diff 실행 결과 읽기

첫번째 라인은 a/~~ b/~~ 로 비교할 파일들을 보여주는데 보통 동일한 파일이다. writeDB.js의 이전 버전과 새 버전이다.  

두번째 라인은 비교하는 파일에 대한 메타데이터인데, 해시값이다. 중요하지 않다.


파일 a가 변경되었음을 나타내고 -기호로 표시

파일 b는 +기호로 표시


 변경된 부분과, 변경된 부분이 있는 콘텍스트의 앞뒤를 표시해줌


@@ 안에 숫자 두 쌍이 있는데, 앞 숫자는 파일 a에 뒷 숫자는 파일 b에 상응한다. -는 a에 +는 b에 상응 

- 부호가 있는 파일 a의 첫번째 부분은 11번째 라인부터 7줄이 추출 되었다는 뜻

+ 부호가 있는 파일 b는 11번째 라인에서 시작해서 7줄이다.

 

git diff는 이 구성을 한 단위로 해서 파일들의 변경사항을 보여준다.


git diff 옵션들

git+diff_practice라는 이름의 디렉토리를 하나 만들고 git init을 한다.

anime.txt라는 텍스트 파일을 만들고 스테이지에 추가한 후 커밋을 한다.

anime.txt파일에 your lie in April이라고 입력한다음 git commit -am 'add new anime'메세지의 커밋을 남겼다. 

git commit 의 -am 옵션은 모든 파일을 한꺼번에 등록하고 메세지를 넣을 수 입는 옵션이다. 따로 등록하고 커밋할 필요가 없다.

anime.txt파일에 demon slayer라고 입력한 다음 git commit -am 'add new anime demon slayer'메세지의 커밋을 남겼다.

똑같은 방식으로 텍스트를 추가하고, 추가 커밋을 남겼다.


berserk 를 지우고 그 위치에 Re-life입력했다. 그리고 git status로 확인해보면 anime.txt가 수정된 것을 확인할 수 있다.

git diff로 확인해보면, 스테이지 영역에 있는 것과 우리가 변경했던 것들 사이에서 비교하여 구체적으로 어떻게 바꼈는지 알 수 있다. 

***git diff스테이지에 등록하지 않은 워킹 디렉토리 안에 있는 변경사항 목록을 나열한다.


git diff HEAD

마지막 커밋, 가장 나중에 실행된 커밋부터 워킹 디렉토리에 있는 모든 변경사항의 목록들을 나열해 준다.

HEAD가 어디에 있든, git HEAD를 실행하면, HEAD가 참조했던 그 이후에 변경했던 모든것을 보게 된다.

re-life를 넣은 anime.txt파일을 저장한 뒤 'add new anime RE-life'라는 메세지로 커밋을 한다.

그리고 brand.txt라는 새로운 파일을 만들고, Apple을 넣어서 저장한 뒤  git status로 추적되지 않는 파일 brand.txt를 확인한다.

git diff
git diff HEAD

이 상황에서는 git diff git diff HEAD를 하면 아무것도 안보인다.

git add brand.txt를 하고 커밋을 하고 git diff를 하면 또 아무것도 안나온다. 

Dell을 한번 더 넣어서 저장했다. 

git add brand.txt를 하고 git diff HEAD를 명령했다.

git diff HEAD

이렇게 마지막으로 커밋한 이후에 새로운 것이 생긴 것을 볼 수 있다.

'

git diff

git diff를 실행하면 스테이지에 등록되지 않은 변경사항만 보여지기에 다시 아무것도 안 뜨는 것을 알 수 있다. 지금은 등록하지 않는 변경사항은 하나도 없기 때문이다.


brand.txt에 LG를 추가한 다음 git add 나 git commit을 하지 않고, git diff 를 실행해보면 변경사항이 보인다. 

git diff HEAD를 실행하면, 변경 사항이 스테이지에 등록되었든, 아니든 상관없이 마지막으로 실행된 커밋 이후에 워킹 디렉토리에 있는 어떤 새로운 변경 사항을 볼 수 있다.

git log로 확인해본 지금의 HEAD는 이것이고 , 이 커밋 이후에 워킹 디렉토리에 있는 어떤 새로운 변경사항을 볼 수 있다.

 

정리하자면, git diff는 등록되지 않은 모든 변경사항을, git diff HEAD는 마지막 커밋이 실행된 이후의 모든 변경사항을 보여준다.


git diff --staged

git diff --cached

 

앞에서 했던 스테이지에 등록되지 않은 것들을 보여주는 git diff git diff HEAD와 달리,  두 옵션 모두 스테이지에 등록된 변경사항만을 보여준다.

그렇다면 마지막 커밋과, 스테이지 영역의 차이는?

git diff --staged

brand.txt에 Line이라는 텍스트를 추가하고 저장한 뒤 git diff --staged 명령으로 확인한 결과는 LG와 Line을 반영하지 않는다.

깃 크라켄으로 확인해보면, 지금 Staged File에 올라와있는 brand.txt파일의 내용은 Apple과 Dell의 내용만 담고있기 때문이다.

그래서 git add 로 brand.txt를 스테이지에 추가하고, git diff --staged를 실행하면

변경사항들이 모두 스테이지에 등록되었기 때문에, 모두 볼 수 있다.

git diff --cached를 해도 같은 결과를 얻을 수 있다.


범위를 한정해서 git diff 하기

git diff HEAD [파일 이름]

git diff --staged [파일 이름]


다시, 이런 파일 구조를 가진 프로젝트 폴더가 있다.

몇가지 파일에 조금씩 수정을 해서 변화를 줬다.

git status로 확인 할 수 있다.

git diff HEAD를 하면 커밋되지않은 변한 모든 파일들의 부분들을 보여준다.

git diff HEAD app/models/writeDB.js를 하면 이렇게 위에서와 같이 writeDB.js에 대한 변경사항만 나타나게 된다.

git diff --staged도 같은 원리로 사용가능하다.


git diff [비교하려는 브랜치]..[현재 브랜치] 

git checkout -b 커맨드를 사용해서, crow 브랜치를 새로 만들고, anime.txt 파일에 claymore 텍스트를 넣어서 저장 후

'add new anime claymore' 메세지를 넣어서 커밋을 했다. 그리고 

 

git diff master..crow

crow 브랜치에서 비교하려는 브랜치를 앞에 그리고 구분자로, ..을 넣어서 현재 브랜치를 넣으면 비교를 해주는 화면이 출력이 된다.

그런데 사실 ..가 아니라 공백을 넣어도 구분이 되긴 한다.


git diff commit1..commit2

JUNE .

20'S LIFE IN SYDNEY and BUSAN

    이미지 맵

    DevOps Study/Git and Github 다른 글

    이전 글

    다음 글