✅ Git 저장소 만들기
Git 저장소를 만드는 방법은 아래와 같이 두 가지 방법이 있습니다.
- 로컬 디렉토리 하나를 선택해서 Git 저장소를 적용하는 방법
- Remote Git 저장소를 Clone 하는 방법
➡️ 사용된 명령어는 다음과 같습니다.
git init | 새로운 Git 로컬 저장소 생성 |
---|---|
git status | git의 현재 상태를 확인, Staging Area, UnStage Area, Untracked, Modified 등 파일의 상태를 보여줌 |
git add | Working directory에 파일을 Staging Area에 등록 |
git commit | Staging Area에 등록된 파일들의 변경 사항을 확정하여 저장함 |
git rm | Git에서 파일을 삭제 |
git mv | Git에서 파일의 이름을 변경하거나 파일을 이동 |
🔹기존 디렉토리(폴더)에 Git 저장소 만들기
- .git 폴더를 생성할 곳으로 이동
cd /c/user/my_project
버전관리를 하지 않던 기존 프로젝트를 Git으로 관리하고 싶은 경우 우선 프로젝트의 디렉토리로 이동합니다. 자신의 프로젝트 폴더로 이동할 때는 cd 명령어를 사용합니다. 우선은 빈 프로젝트 폴더로 이동하여 명령어를 학습해보겠습니다.
- 폴더 생성 -mkdir
mkdir gitTest cd gitTest
mkdir 명령어를 사용해서 새로운 폴더를 생성해 보겠습니다. 폴더를 생성하고 난 뒤에는 다시 생성한 폴더로( cd 명령어 사용 ) 이동해서 작업하겠습니다.
- git이 관리할 디렉토리 지정 -git init
git init
해당 폴더에 .git 폴더를 생성하겠습니다. 이제 해당 디렉토리는 git이 관리하는 폴더가 됩니다.
git init
명령어를 사용합니다.
- README.md 파일 추가 -touch
touch README.md
현재는 해당 디렉토리에 어떠한 파일도 존재하지 않습니다. git이 관리할 수 있는 READEME.md 파일을 하나 생성하겠습니다. 이때 touch 명령어를 사용했습니다.
touch
명령어는 주어진 파일명으로 새로운 빈 파일을 생성합니다.
- git이 관리하는 파일의 상태 확인하기 -git status
git status
git status
명령어는 git이 추적(관리)하고 있는 파일들의 현재 상태를 알려줍니다.README.md 파일은 현재 Untracked 파일입니다. 즉, git이 관리되고 있지 않는 파일입니다.
- Untracked 상태를 Tracked 상태로 만들고, Statging Area에 등록하기 -git add
git add [파일명]
앞에서 확인해본바 README.md 파일은 Untracked 상태입니다. 이를 add 명령어를 통해서 Tracked 상태로 만들고 Statging Area에 등록하여 Commit이 가능한 상태로 만들 수 있습니다. Untracked 파일에 add 명령어를 사용하면 Tracked( 관리하는 파일 ), Statging Area( Commit 가능한 상태)에 등록된다는 것을 기억해야 합니다.
- git Repository에 저장 -git commit
git commit #기본 에디터를 사용해서 커밋 메세지 저장 git commit -m "message" # git bash로 커밋 메세지 저장
commit은 Statging Area에 있는 모든 요소를 Git Repository에 저장합니다. 이는 변경 사항에 대한 스냅샷을 영구적으로 저장하는 것입니다. .git 폴더에 저장되게 됩니다.
이때 커밋 메세지를 저장하기 위해서 위와 같이 두 가지 명령어를 사용할 수 있습니다.
git commit
명령어만 사용할 경우 기본 에디터 창이 열리며 커밋 명령어를 젤 상단에 입력하고 저장하면 됩니다.
git commit -m “message”
명령어를 사용할 경우, 따옴표 안에 ( “ “ ) 커밋 명령어를 입력하면 commit 상태가 저장이 됩니다.
- modified 상태로 만들어 보기
echo “Hello Korea” >> README.md
echo "Hello Korea" >>
README.md
는 Git Bash에서 사용되는 명령어입니다. 이 명령어는 "Hello Korea"라는 텍스트를README.md
라는 파일에 추가(Append)하는 역할을 합니다. 해당 명령어를 사용하고 git status를 통해서 상태를 확인하면 README.md 파일이 modified 상태가 된 것을 확인할 수 있습니다. 이는 기존에 Statging Area에 있던 README.md 파일의 상태가 변경되어 Statging Area에 등록되지 않았음을 의미합니다.
- modified 상태를 Statging Area에 등록하기
git add README.md
동일하게 add 명령어를 사용해서 Statging Area에 등록하면 됩니다. Statging Area에 등록되어야지만 Commit이 가능합니다.
👉 추가로 gitk
명령어는 지금까지 Commit한 내역을 GUI 환경으로 보여줍니다.
✅ Tracked, Untracked
워킹 디렉토리의 모든 파일은 크게 Tracked(관리대상임)와 Untracked(관리대상이 아님)로 나눕니다. Tracked 파일은 이미 스냅샷에 포함돼 있던 파일입니다. Tracked 파일은 또 Unmodified(수정하지 않음)와 Modified(수정함) 그리고 Staged(커밋으로 저장소에 기록할) 상태 중 하나입니다. 간단히 말하자면 Tracked 상태는 Git이 관리하고 있는 파일이라는 것입니다.
그리고 나머지 파일은 모두 Untracked 파일입니다. Untracked 파일은 워킹 디렉토리에 있는 파일 중 스냅샷에도 Staging Area에도 포함되지 않은 파일입니다. 마치 아래 그림과 같이 대개는 처음 생성한 파일에 해당됩니다. Untracked 상태는 Git이 관리하고 있지 않은 파일임을 뜻합니다.
처음 저장소를 Clone(GitHub에서 Clone) 하면 모든 파일은 Tracked(관리 대상)이면서 Unmodified(수정 되지 않은) 상태입니다. 파일을 Checkout(GitHub에서 Clone) 하고 나서 아무것도 수정하지 않았기 때문에 그렇습니다.
마지막 커밋 이후 아직 아무것도 수정하지 않은 상태에서 어떤 파일을 수정하면 Git은 그 파일을 "Modified" 상태로 인식합니다. 실제로 커밋을 하기 위해서는 이 수정한 파일을 "Staged" 상태로 만들고, "Staged" 상태의 파일을 커밋합니다. 이런 라이프사이클을 계속 반복합니다.
최초 파일이 생성되면 Untracked 상태입니다. 이때 add 명령어를 사용하게 되면 Tracked 상태가 되며 바로 Staging Area에 등록됩니다. 이때 파일을 수정하면 Modified 상태가 되고 다시 add 명령어를 사용하여 Staging Area에 저장합니다. 즉, Staged 상태에 도달해야지만 commit을 할 수 있는 상태가 된 것입니다. 위의 그림은 파일의 상태가 어떻게 변화되는지 보여주고 있습니다.
🔹Staged와 Unstaged(=modified)
today.txt 파일이 Staged 상태와 동시에 Unstaged 상태로 나온다는 것은 어떻게 가능할까요? 이런 일은 Git의 동작 원리에 의해 발생할 수 있습니다.
일반적으로 git add
명령을 실행하면 Git은 해당 파일을 즉시 Staged 상태로 변경합니다. 즉, 파일의 현재 상태가 Staged 상태로 기록됩니다. 하지만 중요한 점은 Staged 상태의 파일을 커밋하려면 git commit
명령을 실행해야 한다는 것입니다. git commit
명령을 실행하는 시점의 버전이 커밋되는 것이 아니라, 마지막으로 git add
명령을 실행했을 때의 버전이 커밋됩니다.
따라서, 만약 git add
명령을 실행한 후에 파일을 다시 수정한다면 해당 파일은 Unstaged 상태로 변경됩니다. 수정된 내용이 Staged 상태에 반영되지 않은 상태이기 때문입니다. 이후 커밋하려면 최신 버전을 Staged 상태로 만들기 위해 다시 git add
명령을 실행해야 합니다.
현재는 add 명령어에 의해서 Statged 상태인 today.txt 이력과 Commit을 하지 않았기 때문에 Stated 상태인 today.txt를 수정하여 Unstaged(=modified) 상태가 된 두 가지 이력이 존재합니다. 이때 git commit 명령어를 수행하면 수정하기 전의 Staged 상태인 today.txt만 Commit되고 Unstatged 상태인 today.txt는 남게 됩니다.
- git status -s
git status -s
git status -s 명령어는 현재 git이 관리하고 있는 파일의 상태를 보여줍니다. 각 파일의 앞에 붙은 문자는 아래와 같은 의미를 가집니다.
MM Staged이면서 Unstaged 상태인 파일(add 후 modified) M Staged 상태의 파일을 수정한 상태(=Unstaged, =modified) A 새로 생성한 파일을 add 명령어로 Staged 상태(=Tracted) ?? 새 파일, UnTracted 상태
- git diff
git diff [파일명]
git diff
명령을 실행하면 수정했지만 아직 staged 상태가 아닌 파일(modified 상태인 파일)을 마지막으로 commit한 파일과 비교해 볼 수 있습니다.a : 마지막으로 commit 했던 파일의 상태
b : modified된 파일의 상태
- git diff —staged
git diff --staged [파일명]
마지막 commit과 staged 상태의 파일을 비교합니다. 즉, add 명령어를 사용해서 Staging Area에 등록된 파일과 마지막 commit 파일을 비교합니다.
👉 꼭 잊지 말아야 할 것이 있는데
git diff
명령은 마지막으로 커밋한 후에 수정한 것들 전부를 보여주지 않습니다.git diff
는 Unstaged 상태인 것들만 보여줍니다. 수정한 파일을 모두 Staging Area에 넣었다면git diff
명령은 아무것도 출력하지 않습니다. 이때 —staged 옵션을 사용해서 Staging Area에 있는 파일과 마지막으로 commit한 파일을 비교할 수 있습니다.
- rm , git rm
rm [파일명] #리눅스의 파일 제거 명령어 실제 파일이 삭제된다. git rm [파일명] #git의 파일 제거 명령어, commit만 삭제된다.
rm과 git rm은 큰 차이점으로 워킹 디렉토리(작업 공간)의 파일을 삭제하는지 나타납니다. 리눅스의 rm 명령어는 실제 파일을 삭제하고, commit까지 모두 삭제합니다.
git의 rm 명령어는 commit만 삭제하고, 워킹 디렉토리의 실제 파일은 삭제하지 않습니다.
🔹파일 이름 변경하기
Git은 다른 VCS 시스템과는 달리 파일 이름의 변경이나 파일의 이동을 명시적으로 관리하지 않습니다. 다시 말해서 파일 이름이 변경됐다는 별도의 정보를 저장하지 않습니다. Git은 똑똑해서 굳이 파일 이름이 변경되었다는 것을 추적하지 않아도 아는 방법이 있는데 파일의 이름이 변경된 것을 Git이 어떻게 알아내는지 살펴보겠습니다.
Git에 mv
명령어를 통해, 아래와 같이 파일 이름을 변경할 수 있습니다. 해당 명령어를 실행하고 git status
를 사용하여 Git의 상태를 확인해보면 Git은 이름이 바뀐 사실을 알고 있습니다.
$ git mv file_from file_to
사실 git mv
명령어는 아래 명령어를 수행한 것과 완전 똑같습니다.
$ mv README.md README
$ git rm README.md
$ git add README
git mv
명령은 일종의 단축 명령어입니다. 이 명령으로 파일 이름을 바꿔도 되고 리눅스의 mv
명령으로 파일 이름을 직접 바꿔도 됩니다. 단지 git mv
명령은 편리하게 명령을 세 번 실행해주는 것 뿐입니다. 중요한 것은 이름을 변경하고 나서 꼭 rm/add 명령을 실행해야 해서 Statged 상태로 만들어야 한다는 것 뿐입니다.
✅ 되돌리기
종종 완료한 커밋을 수정해야 할 때가 있습니다. 너무 일찍 커밋했거나 어떤 파일을 빼먹었을 때 그리고 커밋 메시지를 잘못 적었을 때 사용합니다. 다시 커밋하고 싶으면 파일 수정 작업을 하고 Staging Area에 추가한 다음 --amend
옵션을 사용하여 커밋을 재작성 할 수 있습니다.
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
여기서 실행한 명령어 3개는 모두 커밋 한 개로 기록됩니다. 두 번째 커밋은 첫 번째 커밋을 덮어씁니다.
이렇게 --amend
옵션으로 커밋을 고치는 작업은, 추가로 작업한 일이 작다고 하더라도 이전의 커밋을 완전히 새로 고쳐서 새 커밋으로 변경하는 것을 의미합니다. 이전의 커밋은 일어나지 않은 일이 되는 것이고 당연히 히스토리에도 남지 않습니다. -amend
옵션으로 커밋을 고치는 작업이 주는 장점은 마지막 커밋 작업에서 아주 살짝 뭔가 빠뜨린 것을 넣거나 변경하는 것을 새 커밋으로 분리하지 않고 하나의 커밋에서 처리하는 것입니다. “앗차, 빠진 파일 넣었음”, “이전 커밋에서 오타 살짝 고침” 등의 커밋을 만들지 않겠다는 말입니다.
🔹파일 상태를 Unstage로 변경하기
다음은 Staging Area와 워킹 디렉토리 사이를 넘나드는 방법을 설명한다. 두 영역의 상태를 확인할 때마다 변경된 상태를 되돌리는 방법을 알려주기 때문에 매우 편리하다. 예를 들어 파일을 두 개 수정하고서 따로따로 커밋하려고 했지만, 실수로 git add *
라고 실행해 버렸다. 두 파일 모두 Staging Area에 들어 있다. 이제 둘 중 하나를 어떻게 꺼낼까? 우선 git status
명령으로 확인해보자.
Changes to be commited
밑에 git reset HEAD <file>…
메시지가 보인다. 이 명령으로 Unstaged 상태로 변경할 수 있다. CONTRIBUTING.md
파일을 Unstaged 상태로 변경해보자.
🏷️이미지 출처 및 참고한 사이트
Uploaded by N2T