1. Git의 기초 - 되돌리기
작업 과정에서 잘못된 변경사항을 되돌리는 것은 필수적인 기능입니다. Git에서는 다양한 수준에서 작업을 되돌릴 수 있지만, 한 번 되돌린 것은 복구하기 어렵기 때문에 신중하게 사용해야 합니다.
1.1 커밋 수정하기
가장 흔한 되돌리기 작업은 너무 일찍 커밋했거나, 커밋 메시지가 잘못되었거나, 일부 파일을 빠뜨렸을 때 발생합니다. 이때 --amend 옵션을 사용하여 마지막 커밋을 수정할 수 있습니다.
$ git commit --amend
Shell
복사
이 명령은 스테이징 영역의 내용을 사용하여 커밋을 재작성합니다. 마지막 커밋 이후 변경사항이 없다면 커밋 메시지만 수정하게 됩니다.
--amend 옵션은 이전 커밋을 완전히 새로운 커밋으로 대체합니다. 이는 Git의 불변성(immutability) 원칙을 보여주는 좋은 예입니다. Git은 실제로 데이터를 변경하는 것이 아니라, 새로운 커밋을 생성하고 참조를 변경합니다. 이미 공개 저장소에 푸시한 커밋은 수정하지 않는 것이 좋습니다.
1.2 파일 상태를 Unstage로 변경하기
실수로 모든 파일을 스테이징 영역에 추가했을 때(git add *), 일부 파일만 커밋하고 싶다면 git reset HEAD <file> 명령을 사용합니다.
$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M CONTRIBUTING.md
Shell
복사
이 명령은 해당 파일을 스테이징 영역에서 워킹 디렉토리로 이동시킵니다.
git status 명령은 항상 현재 상황에 적합한 명령어를 제안해 줍니다. 복잡한 명령어를 기억하기 어렵다면, 먼저 git status를 실행하여 다음 단계에 필요한 명령어를 확인하는 습관을 들이는 것이 좋습니다.
1.3 Modified 파일 되돌리기
워킹 디렉토리에서 수정한 파일을 마지막 커밋 상태로 되돌리려면 git checkout -- <file> 명령을 사용합니다.
$ git checkout -- CONTRIBUTING.md
Shell
복사
주의: 이 명령은 워킹 디렉토리의 변경사항을 영구적으로 삭제합니다. Git에 커밋되지 않은 변경사항은 복구할 수 없으므로, 정말 필요한 경우에만 사용해야 합니다.
이 세 가지 되돌리기 명령은 Git의 세 가지 영역(커밋 히스토리, 스테이징 영역, 워킹 디렉토리)에 각각 대응합니다. 각 영역에서 작업을 되돌릴 수 있는 방법을 제공하지만, 되돌린 변경사항은 복구할 수 없으므로 신중하게 사용해야 합니다.
2. Git의 기초 - 리모트 저장소
리모트 저장소는 인터넷이나 네트워크 어딘가에 있는 Git 저장소를 말합니다. 다른 사람들과 협업하려면 리모트 저장소를 관리하고, 데이터를 주고받는 방법을 알아야 합니다.
2.1 리모트 저장소 확인하기
현재 프로젝트에 등록된 리모트 저장소를 확인하려면 git remote 명령을 사용합니다.
$ git remote
origin
Shell
복사
•
v 옵션을 추가하면 단축 이름과 URL을 함께 볼 수 있습니다.
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
Shell
복사
저장소를 클론하면 자동으로 원본 저장소가 'origin'이라는 이름으로 등록됩니다. 이는 단지 관례일 뿐이며, 원하는 다른 이름을 사용할 수도 있습니다. 여러 리모트 저장소와 협업할 때는 각 저장소의 역할을 명확히 하는 이름을 사용하는 것이 좋습니다.
2.2 리모트 저장소 추가하기
기존 워킹 디렉토리에 새 리모트 저장소를 추가하려면 git remote add <단축이름> <url> 명령을 사용합니다.
$ git remote add pb https://github.com/paulboone/ticgit
Shell
복사
이제 URL 대신 'pb'라는 단축 이름을 사용할 수 있습니다.
여러 개의 리모트 저장소를 추가하면 다양한 사람들의 기여를 쉽게 통합할 수 있습니다. 특히 오픈 소스 프로젝트에서는 흔한 워크플로입니다.
2.3 리모트 저장소를 Fetch하거나 Pull하기
리모트 저장소에서 데이터를 가져오려면 git fetch <remote> 명령을 사용합니다.
$ git fetch origin
Shell
복사
이 명령은 로컬에 없는 리모트 저장소의 데이터를 모두 가져오지만, 자동으로 병합하지는 않습니다.
반면 git pull 명령은 데이터를 가져온 후 자동으로 로컬 브랜치와 병합합니다.
fetch와 pull의 차이점을 이해하는 것은 중요합니다. fetch는 원격 변경사항을 로컬로 가져오기만 하고, 실제 병합은 사용자가 명시적으로 결정할 수 있게 합니다. 이는 변경사항을 검토한 후 병합하고 싶을 때 유용합니다. 반면 pull은 가져오기와 병합을 한 번에 수행하므로 빠르지만, 충돌이 발생할 위험이 있습니다.
2.4 리모트 저장소에 Push하기
로컬 변경사항을 리모트 저장소에 업로드하려면 git push <remote> <branch> 명령을 사용합니다.
$ git push origin master
Shell
복사
주의: 이 명령은 다른 사람이 먼저 푸시한 경우에는 실패합니다. 먼저 원격 변경사항을 가져와서(pull) 병합한 후에 푸시해야 합니다. 이는 Git의 분산 특성을 보여주는 중요한 측면입니다.
2.5 리모트 저장소 살펴보기
특정 리모트 저장소에 대한 자세한 정보를 보려면 git remote show <remote> 명령을 사용합니다.
$ git remote show origin
Shell
복사
이 명령은 URL, 추적 브랜치, push/pull 설정 등의 정보를 보여줍니다.
2.6 리모트 저장소 이름 변경 및 삭제하기
리모트 저장소의 이름을 변경하려면 git remote rename 명령을, 삭제하려면 git remote remove 또는 git remote rm 명령을 사용합니다.
$ git remote rename pb paul
$ git remote remove paul
Shell
복사
리모트 저장소를 삭제해도 실제 서버의 저장소는 삭제되지 않습니다. 단지 로컬 Git에서 해당 리모트에 대한 참조만 제거됩니다.
3. Git의 기초 - 태그
태그는 특정 커밋을 가리키는 포인터로, 주로 릴리스 버전을 표시할 때 사용합니다(v1.0, v2.0 등). Git은 두 가지 유형의 태그를 제공합니다.
3.1 태그 조회하기
git tag 명령으로 이미 있는 태그를 확인할 수 있습니다.
$ git tag
v0.1
v1.3
Shell
복사
특정 패턴의 태그만 검색하려면 -l 옵션을 사용합니다.
$ git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5.1
Shell
복사
3.2 태그 생성하기: Annotated vs. Lightweight
Git의 태그는 두 종류가 있습니다:
1.
Annotated 태그: 태그 생성자, 날짜, 메시지 등의 정보를 저장합니다.
2.
Lightweight 태그: 단순히 특정 커밋에 대한 포인터입니다.
Annotated 태그를 생성하려면 -a 옵션을 사용합니다:
$ git tag -a v1.4 -m "my version 1.4"
Shell
복사
Lightweight 태그는 옵션 없이 생성합니다:
$ git tag v1.4-lw
Shell
복사
일반적으로 Annotated 태그를 사용하는 것이 좋습니다. 특히 공개 릴리스에는 태그 생성자, 날짜, 메시지 등의 정보가 중요하기 때문입니다. 임시 태그나 개인 용도의 태그는 Lightweight 태그로 충분합니다.
태그 정보를 확인하려면 git show <tag-name> 명령을 사용합니다:
$ git show v1.4
Shell
복사
3.3 나중에 태그하기
이전 커밋에 태그를 붙이려면 명령 끝에 커밋 체크섬(또는 일부)을 지정합니다:
$ git tag -a v1.2 9fceb02
Shell
복사
3.4 태그 공유하기
git push 명령은 기본적으로 태그를 원격 저장소로 전송하지 않습니다. 태그를 명시적으로 푸시해야 합니다:
$ git push origin v1.5 # 특정 태그 푸시
$ git push origin --tags # 모든 태그 푸시
Shell
복사
태그는 특히 공개 릴리스나 중요한 마일스톤을 표시할 때 유용합니다. 시맨틱 버저닝(Semantic Versioning)과 같은 체계적인 버전 관리 방식을 따르면 프로젝트의 변경 이력을 더 명확하게 관리할 수 있습니다.
3.5 태그를 Checkout하기
특정 태그 버전의 코드를 확인하려면 git checkout <tag-name> 명령을 사용합니다:
$ git checkout v2.0.0
Shell
복사
주의: 태그를 체크아웃하면 "detached HEAD" 상태가 됩니다. 이 상태에서 변경 사항을 커밋하면 해당 커밋은 어떤 브랜치에도 속하지 않게 되어 나중에 찾기 어려울 수 있습니다. 태그 기반으로 작업하려면 새 브랜치를 만드는 것이 좋습니다:
$ git checkout -b version2 v2.0.0
Shell
복사
4. Git의 기초 - Git Alias
자주 사용하는 Git 명령어에 별칭(Alias)을 지정하여 더 빠르고 편리하게 사용할 수 있습니다.
4.1 기본 Alias 설정하기
git config를 사용하여 자주 사용하는 명령어의 단축 이름을 만들 수 있습니다:
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
Shell
복사
이제 git commit 대신 git ci만으로도 커밋할 수 있습니다.
4.2 고급 Alias 사용하기
복잡한 명령어도 Alias로 단순화할 수 있습니다:
$ git config --global alias.unstage 'reset HEAD --'
Shell
복사
이제 다음 두 명령은 동일한 효과를 갖습니다:
$ git unstage fileA
$ git reset HEAD -- fileA
Shell
복사
외부 명령어도 실행할 수 있습니다. 명령 앞에 !를 붙이면 외부 명령을 실행합니다:
$ git config --global alias.visual '!gitk'
Shell
복사
Alias는 단순히 타이핑을 줄이는 것 이상의 가치가 있습니다. 복잡한 워크플로를 단순화하고, 팀 내에서 일관된 명령어 사용을 장려하며, Git의 사용자 경험을 개인화할 수 있습니다. 예를 들어, 다음과 같은 Alias를 만들어 로그를 더 보기 쉽게 할 수 있습니다:
$ git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
Shell
복사
결론
Git의 되돌리기 기능, 리모트 저장소 관리, 태그 시스템, 그리고 Alias 설정은 일상적인 Git 워크플로를 더 효율적으로 만들어주는 핵심 기능입니다. 이러한 기능을 이해하고 활용함으로써, 단순히 기본적인 add, commit, push 명령어만 사용하는 수준을 넘어서 Git의 진정한 잠재력을 발휘할 수 있습니다.
특히 주목할 점은 Git의 변경 관리 철학입니다. Git은 기본적으로 데이터를 추가만 하는(append-only) 데이터베이스처럼 동작합니다. 변경사항을 '되돌린다'는 것은 실제로는 새로운 커밋을 생성하여 히스토리에 추가하는 것입니다. 이러한 불변성 원칙은 Git의 안정성과 신뢰성의 기반이 됩니다.
리모트 저장소 관리는 Git의 분산 특성을 활용하는 핵심이며, 태그 시스템은 프로젝트의 중요한 지점을 표시하여 관리하는 효과적인 방법입니다. 마지막으로, Alias를 통한 명령어 개인화는 Git 경험을 크게 향상시키는 간단하지만 강력한 방법입니다.