저장소 (Repository)
git 은 변경 이력을 관리하는 툴로서, 저장소(Repository)를 사용하여 변경 이력을 관리합니다.
파일들이 변경 이력별로 저장되는데, 두 개의 저장소로 구분되어 저장됩니다.
하나는 원격 저장소 (Remote Repository)로서, 여러 사람이 함께 공유하기 위한 저장소입니다.
다른 하나는 지역 저장소 (Local Repository)로서, 개인 전용입니다.
일반적으로, 개인의 로컬 저장소에서 작업하다가, 공개하고 싶을때 원격 저장소에 업로드하게 됩니다.git commit
명령은 변경 이력이 기록된 인덱스를 로컬 저장소에 저장할 때 사용하고,git push
명령은 로컬 저장소에 저장된 변경 이력을 원격 저장소로 올릴 때 사용합니다.
반대로 git pull
명령은 원격 저장소의 변경사항을 로컬 저장소로 가져옵니다.
커밋 (Commit)
커밋이란, 현재까지의 변경 사항을 저장하는 것입니다.
커밋은 시간순으로 기록되고, 영문 + 숫자로된 40 자리 고유이름이 붙게 됩니다.git commit
명령은 모아진 인덱스를 로컬 저장소에 등록합니다.
git commit -m <commit message
> 명령은 커밋하면서 해당 커밋에 해당 메시지를 남깁니다.
인덱스 (Index)
인덱스란 저장소에 올릴 (Commit) 변경사항을 등록하는 곳입니다.
인덱스를 로컬 저장소에 기록하는 것을 커밋이라고 하면,
인덱스에 변경 사항을 등록하는 것을 스테이징 (staging)이라고 합니다.
쉽게 말해, 로컬 저장소에 commit하기 전에 변경사항들을 모아놓은 곳입니다.
10개 파일을 수정했지만, 7개만 인덱스에 등록하고 싶을 수 있습니다.
이때, git add
명령은 원하는 파일의 변경사항을 인덱스에 추가할 때 사용하고,git checkout --
명령은 등록된 파일을 제거할 때 사용합니다.
git add .
명령은 working directory내의 수정사항이 있는 모든 파일들을 인덱스에 추가합니다.git add <filename>
명령은 해당 파일의 변경 사항만 인덱스에 추가합니다.git add <directpry name>
명령은 해당 디렉토리내의 수정사항이 있는 모든 파일들의 변경 사항들을 인덱스에 추가합니다.
git status
명령은 현재 변경사항과 인덱스를 비교해서 보여줍니다.
크게 3개의 영역으로 나오는데,
Changes to be commited
: 인덱스에 추가되어 커밋할 내용이고,Changes not staged for commit
: 변경되었지만, 인덱스에 추가되지 않아서, 커밋되지 않는 내용들이며,Untracked files
: git에서 한번도 관리한 적 없는 파일들입니다.
$ git status
On branch daddy
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: generators/ygens
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
(commit or discard the untracked or modified content in submodules)
modified: build.sbt
modified: generators/example/src/main/scala/GCD.scala
modified: generators/rocket-chip (modified content, untracked content)
modified: toolchains/riscv-tools/riscv-openocd (modified content)
modified: tools/barstools (modified content)
modified: variables-unittest.mk
Untracked files:
(use "git add <file>..." to include in what will be committed)
tests/abcreg.c
커밋 관련 명령들
git log
명령은 커밋 히스토리를 출력합니다.
git log --pretty=oneline
명령에서 --pretty
옵션을 사용하면 커밋 히스토리를 다양하게 출력할 수 있습니다. 이 중에서 oneline
은 커밋 하나당 한 줄씩 출력해서 전체적은 변화를 한 눈에 보기 좋게 출력합니다.
git show <커밋 번호>
명령은 특정 커밋에서 변경된 사항들을 춫력해 줍니다.
git tag <태그 이름> <커밋 번호>
특정 커밋에 태그를 붙입니다.
특정 커밋으로 돌아가기
특정 커밋을 복제하기 위해 git reset --hard
명령을 사용할 수 있습니다.
아래 예는 커밋 19152d3b73f1c2255ce378501f6c01f9363b75e9
으로 돌리는 방법입니다.
git clone https://github.com/test/test.git
cd test
git reset --hard 19152d3b73f1c2255ce378501f6c01f9363b75e9
git reset
을 사용할때는 2가지 옵션이 있습니다.
``--hard`는 글자 그대로 지금까지의 변경사항을 모두 무시하고, 해당 커밋으로 돌아갑니다.
따라서, 변경 사항을 커밋하지 않았다면 다시 돌아올 수 없습니다.
``--soft는
--hard`와 달리, 현재 변경사항을 인덱스에 남겨두고, 해당 커밋으로 돌아가기 때문에,
다시 원래대로 돌아올 수 있습니다.
로컬 저장소 커밋 되돌리기
로컬 저장소에서 이전 커밋으로 되돌리는 방법은, HEAD
옵션을 사용하는 것입니다.
예를 들어 HEAD~1
은 최신 커밋 HEAD
에서 1개를 되돌립니다. HEAD~1
은 자주 사용되므로, HEAD~
로 줄여서 사용해도 됩니다.
git reset --hard HEAD~1
원격 저장소 커밋 되돌리기
원격 저장소를 이전 커밋으로 되돌리는 방법은, push -f
명령을 사용하여, 원격 저장소를 강제로 변경하는 것입니다.
아래 예에서는, 로컬 저장소 커밋을 이전단계로 되돌린 후, 원격 저장소 origin의 master 브랜치를 강제로 push합니다.
git reset --hard HEAD~1
git push -f origin master
특정 커밋과 차이 확인하기
git diff
명령은 차이점을 확인하는데 사용됩니다.
이 명령을 사용하여 아래와 같이 commit id를 파일이름 앞에 넣어주면, 해당 커밋과의 차이점을 확인할 수 있습니다.
git diff 271211f9b9faaa8c8585d1411e8ea6223bc81738 build.sbt
최신 커밋 날짜 변경
git commit --amend
명령은 최신 커밋의 날짜를 임의의 날짜로 설정할 수 있습니다. ""
사이에 원하는 날짜와 연도 시간을 설정하면 됩니다.
git commit --amend --no-edit --date "Wed 22 Aug 2018 01:23:45 KST"
커밋으로 issue 종료하기
git은 코드 관리뿐만 아니라 issue를 처리하는 데에도 매우 편리한 도구입니다.
코드를 commit할 때 커밋 메시지에 특정 키워드와 issue 번호를 같이 기입하면 해당 issue를 자동으로 처리합니다.
예를 들어, 아래와 같이 커멋 메시지에 "fixed #12"를 입력하면, 12번 이슈는 기본 브랜치에 커밋이 합쳐질때 닫힙니다.
기본 브랜치에 버그가 수정되지 않으면 이슈는 열린 상태로 남게 됩니다.
커밋과 수정사항이 기본 브랜치에 합쳐지면 이슈는 자동으로 답힙니다.
git commit -m "fixed #12"
커밋 메시지로 이슈를 닫을 수 있는 키워드는 다음과 같습니다.
- close, closes, closed
- fix, fixes, fixed
- resolve, resolves, resolved
'작업 tools > git' 카테고리의 다른 글
git 그래프 출력하기 (0) | 2024.04.23 |
---|---|
gitignore not working (0) | 2023.04.07 |
git 서브모듈: 추가하기, 변경하기,삭제하기 (0) | 2021.09.26 |
git 저장소: 복제하기, 합치기, 변경하기 (0) | 2021.09.26 |
git 브랜치: 가져오기, 합치기, 삭제하기 (0) | 2021.09.26 |