저번 시간에는 Git을 사용하기 위한 기본 개념과 레포지토리 생성, 커밋하는 방법에 대해 배웠습니다.

이번 시간에는 파일의 수정 사항을 Git에 반영하는 git add에 대해 더 자세히 알아보고 git 커맨드의 사용법을 익히는 방법에 대해서도 함께 배워보겠습니다.

📇 git add

지난 시간에 작성했던 calculator.py 파일 맨 윗줄에 '계산기'라는 주석을 하나 추가하겠습니다.

License 파일도 마찬가지로 '라이센스'라는 주석을 추가해줍니다.

파일 두 개를 수정했으므로 git add도 두번 진행해야 합니다. 하지만 이번에는 파일 하나(calculator.py)만 git add 해보겠습니다.

git add calculator.py

git add를 하는 이유는 변경 내용이 반영될 수 있도록 커밋할 대상을 지정해주기 위해서였죠? 또한, git add를 하면 staging area에 파일이 올라간다고도 배웠습니다.

이대로 커밋을 진행하면 어떻게 될까요? 앞서 배웠듯 staging area에 올라간 calculator.py 파일만이 변경된 모습으로 커밋에 반영되고 License는 주석이 추가되기 전 모습 그대로 커밋에 반영됩니다. 이를 확인할 수 있는 방법은 status라는 커맨드를 이용하면 됩니다.

git status

그럼 git의 현재 상태가 출력되는데요. status는 상태라는 뜻이죠? 말그대로 git이 인식하고 있는 프로젝트 디렉토리의 현재 상태를 보여줍니다.

결과를 자세히 살펴보면 크게 두 가지 부분으로 나뉩니다. 첫번째 부분(Changes to be committed)은 커밋에 반영될 변경 사항을 나타냅니다. git add를 했던 calculator.py 파일이 보이죠?

두번째 부분(Changes not staged for commit)에는 변경 사항이 staging area에 추가되지 않음으로써 커밋에 반영되지 않았다는 것을 나타냅니다. 이는 git add를 하지 않은 파일에 적용됩니다. 따라서, git add를 하지 않은 License 파일이 보이네요.

이제 License 파일도 staging area에 추가해봅시다. 그리고 status를 확인하면,

License 파일도 staging area에 잘 추가된 것을 확인할 수 있습니다.

파일을 수정했는데 그 내용이 반영되지 않으면 안되겠죠? 따라서, status를 사용해서 staging area에 수정한 파일들이 다 들어있는지 확인하는 것이 좋습니다.

이번에는 디렉토리도 한번 추가해볼 건데요. calculator 파일 코드에 관한 회의 내용이 담긴 디렉토리를 만들어볼 겁니다.

mkdir meeting-log

그리고 이 디렉토리 안으로 이동해서 day1과 day2라는 파일을 생성하겠습니다. 그런 다음 부모 디렉토리로 돌아오겠습니다.

방금 생성한 meeting-log 디렉토리도 커밋에 반영해볼까요? 파일과 마찬가지로 git add를 하면 됩니다.

git add meeting-log/

status로 확인해보니 디렉토리 안에 있는 모든 파일이 staging area에 추가되었네요.

git add에 대해서 한 가지만 더 배워보겠습니다. 만약 수정된 파일이 많은데 git add를 하려고 하면 일일히 해야 하니 번거롭겠죠? 따라서, 한번에 변경 사항을 staging area에 추가하는 방법이 있는데요.

먼저, calculator.py의 주석을 '기본 계산기'로 변경하겠습니다.

License의 주석도 수정하겠습니다.

이제 git add를 할 차례인데요. 수정된 내용을 한번에 git add하려면 .을 입력하면 됩니다. 이는 현재 프로젝트 디렉토리 내에서 변경 사항이 생긴 모든 파일들을 staging area에 추가하라는 뜻을 가지고 있습니다.

git add .

status를 확인하면 변경 사항이 있는 모든 파일이 staging area에 추가된 것을 알 수 있습니다. 사실 git add를 점과 함께 사용하는 경우가 많습니다. 대개는 수정된 모든 파일을 반영하고 싶으니까요. 물론 특정 파일들만 변경된 새 모습으로 반영하고 싶을 때는 해당 파일들만 git add하면 됩니다.

마지막으로 커밋해 보겠습니다.

git commit -m "Add title comment and Create meeting-log"

성공적으로 커밋이 완료되었습니다.

📇 git이 보는 파일의 네 가지 상태

지난 시간에 Git의 세 가지 작업 영역에 대해 알아봤었죠? 작업 영역과 관련해서 한 가지 더 알아둘 것이 있습니다. 바로 Git으로 관리되는 파일이 일종의 상태(status)를 가진다는 사실입니다.

Git에서 파일들은 크게 두 가지 상태를 가집니다.

  1. Untracked 상태
  2. Tracked 상태

그리고 Tracked 상태는 다시 세 가지 상태로 나눠집니다.

  1. Staged 상태
  2. Unmodified 상태
  3. Modified 상태

그럼 각 상태에 대해 설명해 드리겠습니다.

Untracked란, 우리말로 '추척 되지 않는'이라는 뜻을 가집니다. 이 상태는 파일이 Git에 의해서 그 변동 사항이 추적되고 있지 않을 때를 말합니다. 예를 들어, 새로 생성한 파일을 git add하지 않으면 그 파일은 Untracked 상태입니다.

Tracked는 반대로 파일이 Git에 의해 그 변동 사항이 추적되고 있는 상태인데요.

그 중 Staged 상태는 파일의 내용이 수정되고 나서 staging area에 올라와있는 경우를 말합니다. 새로 생성한 파일에 내용을 쓰고 git add를 하거나 한 번이라도 커밋에 포함됐었던 파일일지라도 내용을 수정하고 git add를 하면 그 파일은 Staged 상태입니다.

Unmodified는 현재 파일의 내용이 최신 커밋의 모습과 비교했을 때 전혀 바뀐 게 없는 상태를 말합니다. 커밋을 하고 난 직후에는 working directory 안의 모든 파일이 이 상태가 됩니다.

반대로, Modified는 최신 커밋의 모습과 비교했을 때 조금이라도 바뀐 내용이 있는 상태를 말합니다.

마지막으로 상태 전환이 어떤 순간에 이루어지는지를 알려드리겠습니다.

먼저, Untracked 상태의 파일을 처음으로 git add 해주면(Add the file) Staged 상태가 됩니다. 최신 커밋과 비교했을 때 차이가 없는 Unmodified 상태의 파일 내용을 수정하면(Edit the file) Modified 상태가 됩니다. Modified 상태의 파일을 git add 해주면(Staged the file) Staged 상태가 됩니다. 파일을 삭제하면(Remove the file) Git에서 더이상 인식하지 않습니다. 커밋을 하면(Commit) staging area에 있던 파일들이 커밋에 반영되고 모든 파일들이 최신 커밋과 차이가 없게 되므로 Unmodified 상태가 됩니다.

Git의 세 가지 작업 영역과 함께 이 내용도 함께 기억해주세요.

📇 git add 취소하기

이번에는 calculator.py 파일에 함수 하나를 추가해보겠습니다.

그런 다음 git add까지 해보겠습니다.

status를 확인하면 staging area에 변경된 파일이 올라간 것을 확인할 수 있습니다.

그런데 생각해보니 say_hi라는 함수는 계산기 프로그램과는 어울리지 않는 것 같네요. 따라서, 이 함수를 지우고 calculator.py 파일을 원래 상태로 돌리고 싶은데요. 그러기 위해서는 staging area에서 변경된 파일을 다시 없애야 합니다. 그럼 git add의 반대인 git reset을 해주면 됩니다. 이 커맨드는 staging area에서 파일을 제거할 때 사용합니다.

git reset calculator.py

출력 결과를 자세히 보면 Unstaged changes after reset이라는 문구가 있는데 이는 staging area에서 제거된 변경 사항이 있다는 걸 나타냅니다. 그 아래 calculator.py가 있으니 제거된 변경 사항이 바로 이 파일이라는 것을 알 수 있습니다.

다시 상태를 확인해보면 변경 사항은 있지만 staging area에 추가되지 않은 파일이 있다고 뜹니다. 그런데 calculator.py의 변경 사항은 staging area에서 제거 되었지만 여전히 working directory에는 남아있습니다. 그럼 결국 파일을 수정하고 git add를 하기 전 상태로 다시 돌아온 셈입니다.

calculator.py 파일로 돌아가 say_hi 함수를 지워주겠습니다.

그리고 Git Bash로 돌아가 status를 확인하면 커밋할 것이 없고 working tree 즉, working directory가 깨끗하다는 문구가 뜹니다. working tree가 깨끗하다는 뜻은 calculator.py가 바로 이전 커밋에 있던 모습과 똑같다는 뜻입니다. 다시 말해, 이전 커밋 이후로 변경 사항이 없다는 것이죠. 보통 커밋 직후에 이 문구가 뜹니다.

git reset은 staging area에서 파일을 제거하지만 변경된 새 모습은 그대로 working directory에 남아있으므로 작업 사항을 날렸다는 걱정은 안 하셔도 됩니다.

📇 git 커맨드 사용법 알아보기

git help라는 커맨드를 사용하면 커맨드의 의미와 사용법을 자세히 알 수 있습니다. git add로 예를 들어볼까요?

git help add

위 커맨드를 입력하니 add 커맨드의 메뉴얼이 담긴 웹사이트가 열렸습니다. 이 매뉴얼 안에는 해당 커맨드에 대한 설명이 자세히 나와있습니다.

만약 git bash 내에 메뉴얼이 출력된다면 매뉴얼에서 나가고 싶을 때 q를 입력하면 됩니다.

모든 커맨드를 다 자세히 배우긴 어렵습니다. 따라서, 특정 커맨드의 사용법을 알고 싶을 땐, help 커맨드를 통해 그때그때 확인하는 것이 더 효율적입니다.

📇 git 정리

지금까지 배운 커맨드들을 정리해보겠습니다.

git init현재 디렉토리를 Git이 관리하는 프로젝트 디렉토리(=working directory)로 설정하고 그 안에 레포지토리(.git 디렉토리)를 생성합니다.

git config user.name [이름]현재 사용자의 아이디를 [이름]으로 설정합니다. 이는 커밋할 때 필요한 정보입니다.

git config user.email [이메일 주소]현재 사용자의 이메일 주소를 [이메일 주소]로 설정합니다. 마찬가지로 커밋할 때 필요한 정보입니다.

git add [파일 이름]수정 사항이 있는 특정 파일을 staging area에 올립니다.

git add [디렉토리명]은 해당 디렉토리 내에서 수정 사항이 있는 모든 파일들을 staging area에 올립니다.

git add .working directory 내의 수정 사항이 있는 모든 파일들을 staging area에 올립니다.

git reset [파일 이름]은 staging area에 올렸던 파일을 다시 내립니다.

git status는 Git이 현재 인식하고 있는 프로젝트 관련 내용들을 출력합니다. 이 커맨드는 문제 상황이 발생했을 때, 현재 상태를 파악하기 위해 활용하면 좋습니다.

git commit -m [커밋 메시지]는 현재 staging area에 있는 것들을 커밋으로 남깁니다.

git help [커맨드 이름]은 사용법이 궁금한 Git 커맨드의 공식 메뉴얼 내용을 출력합니다.


이번 시간에는 git add에 관한 추가적인 설명과 git 파일의 네 가지 상태, git add를 취소하는 방법, 그리고 git 공식 매뉴얼 확인하는 방법을 배웠습니다. Git을 배울 때는 작업 영역과 파일 상태에 대한 이해가 매우 중요합니다. 이를 기반으로 해당하는 커맨드를 사용하기만 하면 되니까요. 따라서, 그 부분을 중점으로 학습하시길 바랍니다.

다음 시간에는 GitHub에 대해 알아보겠습니다.

* 이 자료는 CODEIT의 'Git으로 배우는 버전 관리' 강의를 기반으로 작성되었습니다.
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글