지나갔던 주제들에서,
우리는 git repository를 초기화 하는 법,
commit이라 불리는 것으로 파일들의 스냅샷을 만드는 법,
Git에서 branch가 무엇인지 배웠습니다.
여기 고려해야 할 또 다른 것이 있습니다. : 파일, 브랜치, 커밋 간의 차이점.
이러한 차이점을 고려하는 것은 혼자서 프로젝트를 할 때에만 중요 한 것이 아니라,
디버깅과 같은 중대한 업무를 작업 할 때에도 중요합니다.
현재 버전과 이전 작업 버전을 비교함으로서, 버그가 어디 있는지 식별 할 수 있습니다.
게다가, 이는 팀으로서 작업 할 때 더 중요하게 되는데,
당신이 다른 팀 멤버로부터 받은 파일의 버전을 비교해야 할 때,
문제를 해결하고 결과를 병합해야 할 때, 비교는 더 중요해 집니다.
이번 주제에서는, 이러한 비교점들을 보게 해 주는 도구를 탐색 할 겁니다.
What is git diff - git diff 는 무엇인가?
git diff
는 두 파일의 버전들, 두 커밋, 혹은 두 브랜치 간의 차이점을 보여주는 명령어입니다.
git diff
명령어에 매개변수와 옵션들을 제외하면 기본적으로,
working tree에서 만들어진 파일의 변경사항을 당신의 staging area에 있는 파일들과 비교합니다.
이전의 commit은 파일의 변경사항은 working tree에 안착되었습니다.
해당 변경사항들과, 현재 commit으로 변경 사항을 추가 할 준비를 하고 있는 staging area :: index 가 있습니다.
이러한 것이 어떻게 작동되는지 봅시다.
처음에, repo를 만들고, 내부의 git을 초기화합니다.
그리고 나서 몇 개의 라인이 있는 파일을 생성하고, 해당 파일을 staging area에 추가합니다.
이후에, 우리는 working tree 내부 파일에 부가적인 텍스트 라인들을 추가함으로서 변경 할 겁니다.
그리고 git diff
명령어를 사용하여 이들 간의 차이점을 지켜 볼 겁니다.
당신의 기기에서 위의 단계들을 반복 할 수 있습니다.
$ git init our-repo # git을 초기화하고 repo를 생성합니다.
$ cd our-repo
$ echo "Now you are" > our-file # 파일을 생성함과 동시에 파일 내부에 라인을 추가합니다.
$ git add . # 디렉토리의 모든 파일을 staging area에 추가합니다.
$ echo "in JetBrains Academy" >> our-file # 파일을 변경합니다. ">>" 옵션을 통해 덮어쓰지 않고, 파일 내부 마지막에 연결하여 작성합니다.
$ git diff # staging area의 our-file과 working tree의 our-file 간의 차이점을 보여줍니다.
git diff
명령어에 매개변수가 없다면 staging area에 있는 모든 파일의 변경 사항들을 보여 줍니다.
당신이 가지고 있는 상세한 파일들이 생성 한 변경사항들을 보고자 한다면, 이러한 파일들의 이름을 치세요.
밑에서 출력에 관한 것을 보겠습니다.
Output of git diff - git diff 명령어의 결과물
git diff
명령어의 산출물은
이들의 라인 넘버와 컨텍스트에 따라 추가되었거나, 삭제되었거나, 조정된 라인들을 보여줍니다.
밑은 산출물이 어떻게 보일지에 대한 것 입니다. :
diff -git a/our-file b/our-file
index c703f5f..891ccac 100644
--- a/our-file
+++ b/our-file
@@ -1 +1,2 @@
Now you are
+in JetBrains Academy
~
~
(END)
위는 실제 명령어 실행 후의 디스플레이인데, 인덱스 해싱 결과가 hyperskill과 완전히 동일합니다.
아마 파일의 이름을 해싱하는 과정이 동일하여 오브젝트의 해싱이 똑같지 않나 예상 해 봅니다.
라인을 따라서 결과물을 봅시다.
diff --git a/our-file b/our-file
라인은 비교되고 있는 파일들의 이름을 보여줍니다.
파일 앞에 a
와 b
로 표시 된 것이 있습니다.
두 알파벳은 같은 파일에 있어 서로 다른 두 가지 버전을 의미합니다.
index c703f5f..891ccac 100644
라인은 Git에 의해 필요한 객체 해시 값을 담고 있는데,
이는 내부적으로 사용되거나, 파일의 모드를 위함입니다.
--- a/our-file +++ b/our-file
라인은 첫 번째 파일의 변경 사항을 -
사인으로 표시하고,
두 번째 파일의 변경 사항을 +
로 표시합니다.
마지막 줄들은 hunk 라고 부르는 것으로 함께 만들며 이들의 표식은 -
, +
을 사용하여 파일의 변경 사항을 보여줍니다.
@@ -1 +1,2 @@
Now you are
+in JetBrains Academy
@@ -1 +1,2 @@
라인은 산출물 내부에서
파일의 첫 번째 버전으로부터 1 번째 라인이 보여지고,
그리고 파일의 두 번째 버전에서 1번째 라인과 그 다음 2 개의 라인이 보여진다는 것을 말하고 있습니다.
그 다음은 이러한 줄들을 의미하는데,
하얀색 단어들은 변경되지 않은 텍스트이고,
다른 색상의 단어들은 변경 사항을 가르킵니다.
git diff
의 기본 버전 외에 당신이 어떻게 사용 할 수 있는지 봅시다.
More options of git diff - gif diff
의 옵션들
$ git diff --staged
git diff
와 옵션 --staged
이 있는 명령어는
마지막 커밋의 파일과 당신의 staging area 파일 간의 차이점을 보여줍니다.
git diff --cached
명령어와 git diff --staged
명령어는 같습니다.
$ git diff --name-only
이 명령어는 변경 되었던 파일들의 이름만 보여줍니다.
이는 당신이 리뷰해야 할 파일들을 식별하는 데 더 쉽게 만들어 줍니다.
또다른 옵션은 --stat
인데,
git diff
가 조정 된 파일을의 이름만 보여주는 것이 아니라,
추가되거나 제거 된 라인의 수, 몇 개의 파일이 변경되었는지 보여줍니다.
$ git diff --stat
result :
our-file | 1 +
1 file changed, 1 insertion(+)
~
~
~
(END)
git diff
를 사용하여 어떻게 commit과 branch 간의 차이점을 볼 수 있는지 봅시다.
$ git diff <commit1>..<commit2>
$ git diff <branch1>..<branch2>
<branch>
와 <commit>
을 대신하여 당신은 그냥 해당되는 브랜치 이름을 치거나,
각각 단축된 commit 해시를 치면 됩니다.
commit과 branch 이름들 간의 두 개의 점 ..
은 사실 선택적입니다.
당신은 이 두 점 대신 스페이스를 넣을 수 있습니다.
Patches - 패치
아마 이미 당신도 눈치 챘겠지만, git diff
명령어의 산출물은 일련의 지침처럼 보입니다.
그리고 사실, 우리는 이러한 지침들을 파일을 변경 하는 데 사용 할 수 있습니다.
이러한 지침들을 지닌 파일을 patch 라고 부릅니다.
이는 이메일로 전송하여 코드를 공유하는 주요 한 방식이었지만,
현재는 pull request로 가장 많이 바뀌었습니다.
그래서, 하나 간단한 patch를 만들어 봅시다.
첫 번째로, 하나의 텍스트 라인을 가진 파일을 만들고,
이를 staging area에 추가 해 봅시다.
그리고 나서 해당 파일에 두 번째 텍스트 라인을 추가합니다.
이후, git diff
명령어를 사용하여 우리의 "변경사항-지침" 을 out-patch.patch 파일에 작성 합니다.
최종적으로, 두 번째 라인을 제거하여 우리의 파일을 원래 상태로 돌려 놓습니다.
$ echo "Felis catus is your taxonomic nomenclature," > spot
$ git add .
$ echo "An endothermic quadruped, carnivorous by nature;" >> spot
$ git diff > out-patch.patch # 파일에 두 번째 라인을 추가한 패치를 만듭니다.
$ sed -i '2d' spot # 두 번째 라인을 삭제하면서 파일에 있어 원래 버전을 복원합니다.
이제 우리는 이 patch를 동료에게서 얻은 것 처럼 할 수 있습니다.
sed -i '2d' spot
을 통해 2번째 줄을 삭제하고 1번째 줄만 남겨 patch를 실험 할 수 있다는 말입니다.
그리고, 변경 사항으로 이러한 패치를 적용 하는데 사용 할 수 있습니다.
이를 위해 git apply
라는 명령어가 필요합니다 :
$ git apply our-patch.patch
spot 파일을 확인 해 본다면, 2 개의 줄을 다시 포함하고 있습니다.
Final word about /dev/null - 마지막 단어 /dev/null
만약 당신이 spot
파일을 staging area에 추가했고, 해당 파일을 작업 디렉토리에서 제거했다고 가정하겠습니다.
그리고 git diff
명령어를 사용한다면,
당신은 새로운 파일 출력 부분이 +++ /dev/null
인 것을 볼 수 있습니다 :
diff --git a/spot b/spot
deleted file mode 100644
index 9af82f5..0000000
--- a/spot
+++ /dev/null
...
이것이 git diff
명령어가 파일이 제거 된 경우 현재 버전을 표시하고,
이전에 파일이 존재하지 않았거나, 새 파일을 추가 한 경우, 파일의 이전 버전(---
)를 표시하는 방법입니다.
Conclusion - 결론
따라서, 우리는 오늘 git diff
명령어를 배웠는데,
이 명령어는 두 버전간의 파일, 브랜치, 처밋 간의 차이점을 보여 주는 데 사용됩니다.
기억 해야 할 주요 명령어들은 :
git diff
는 당신의 staging area와 working tree 에서 조정된 파일 간의 차이점을 보여줍니다.
git diff --staged
는 staging area 와 마지막 커밋의 파일 간에 차이점을 보여줍니다.
git diff <commit1>..<commit2>
그리고git diff <branch1>..<branch2>
명령어는
두 커밋과 브랜치 간의 차이점을 보여줍니다.
git diff --stat
은 변경사항의 수를 요약해서 보여주고,
이러한 변경사항이 일어난 파일의 이름들을 보여줍니다.
git apply <patch-name.patch>
는 patch로부터 변경사항을 적용합니다.
보통, 이 명령어들은 개발자들이 시간에 따라 만들어진 코드의 변경사항들을 추적 하는 데 도움을 줍니다.
그리고, 프로젝트에 있어 다른 사람들과 협력하기 쉽게 만들어 줍니다.
words to remember
along : ~을 따라, ~을 따라서, 데리고, 지나서, 계속 앞으로
abbreviated : 약칭, 단축된
instructions : 지침, 명령, 훈령
'Hyperskill - 컴퓨터 CS 및 영어 독해 > Introduction to Git' 카테고리의 다른 글
Cherry picking and checkout options - Cherry pick 명령어와 checkout 옵션 명령어의 기초 (1) | 2024.06.09 |
---|---|
Conventional Commits and commitlint - 관례적인 커밋 메세지와 이를 돕는 commitlint (1) | 2024.06.07 |
Git undo/reset - Git 취소 리셋 돌아가기 (1) | 2024.06.04 |
Git internal structure - Git의 내부 구조 (0) | 2024.06.03 |
Explore folders and files - 터미널로 폴더와 파일 탐색하기 (1) | 2024.06.02 |