일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- K8s
- JPA
- QueryDSL
- Spring Data JPA
- mysql
- spring kafka
- Streams
- consumer
- CodePipeline
- Spring JPA
- topic생성
- bean
- cd
- Kubernetes
- mirror maker2
- API
- PAGING
- ECS
- offsetdatetime
- spring
- AWS
- producer
- kafka
- CI
- git
- entity graph
- Kotlin
- transactionaleventlistener
- Entity
- centos7
- Today
- Total
Yebali
Git 사용법 본문
Git이란?
git은 형상 관리 툴 중 하나로 소스코드 관리를 도와주는 무료 소프트웨어이다.
SVN과 다르게 소스코드를 원격 저장소와 로컬 저장소에 분산하여 저장하고 관리한다.
개발을 하면서 git을 사용할 줄 모르는 것은 치명적인 단점이 될 수 있다.
git에서 사용되는 다양한 명령어들을 알아보자.
$ git init
git 저장소를 초기화하는 명령어이다. 현재 위치한 디렉토리를 로컬 저장소로 등록해준다.
$ git clone <URL>
원격 저장소로부터 프로젝트를 복제하는 명령어이다.
clone 하면 'origin'이라는 원격 저장소가 자동으로 등록된다.
$ git remote
현재 프로젝트에 등록된 원격 저장소를 확인할 수 있다.
'-v' 옵션과 함께 사용하면 추가 정보를 볼 수 있다.
$ git status
파일들의 상태를 확인할 수 있다.
작업 중인 디렉토리와 스테이징 영역의 상태를 확인하기 위해 사용한다.
$ git add <파일 이름>
작업한 내용(코드 변경)을 스테이징 영역에 추가하기 위한 명령어
$ git commit -m "commit message"
파일의 추가/변경 사항을 저장소에 기록한다.
$ git push <저장소 이름> <브랜치 이름>
로컬 저장소에 있는 파일 변경 이력(commit 된 이력)을 원격 저장소에 저장한다.
'-u' 옵션을 사용하면 최초 한 번만 저장소와 브랜치 명을 입력하고 이후에 생략이 가능하다.
$ git branch <브랜치 이름>
브랜치를 생성하는 명령어
현재 위치한 브랜치에서 새로운 브랜치를 생성한다.
$ git branch -f <브랜치 이름> HEAD~<숫자>
특정 브랜치를 특정 커밋에 재지정한다. '숫자'만큼의 이전 커밋으로 재지정된다.
만약 'git branch -f <브랜치 이름> <커밋 ID>'로 사용한다면 브랜치가 해당 커밋을 가리키도록 바꾼다.
$ git checkout <브랜치 이름>
현재 브랜치에서 <브랜치 이름>으로 이동하기 위한 명령어
$ git checkout HEAD^
현재 브랜치의 HEAD를 현재 커밋의 부모 커밋으로 옮기는 명령어
과거 커밋으로 돌아간다
만약 'git checkout HEAD~4'처럼 입력한 경우 4단계 이전의 커밋으로 HEAD를 되돌린다.
$ git fetch
원격 저장소로부터 변경된 내용을 가지고 오는 명령어
병합은 하지 않는다.
$ git pull
원격 저장소로부터 변경된 내용을 가지고 온 후 병합(merge)하는 명령어
pull == fetch + merge
$ git merge <브랜치 이름>
브랜치를 병합하는 명령어 (브랜치가 사라지는 것은 아님)
위 상태에서 bugFix의 변경내용을 main에 병합해보자
- 'git merge bugFix'
명령어를 실행하면 아래와 같이 bugFix의 변경사항이 main으로 병합된다.
그 후 bugFix 브랜치에 main의 내용을 반영해보자
- 'git checkout bugFix'
- 'git merge main'
명령어를 실행하면 아래와 같이 변경된다.
$ git rebase
브랜치의 base를 재 배치하는 명령어
'merge'와 다르게 커밋 라인을 정리하여 히스토리를 깔끔하게 볼 수 있다.
위의 상황에서 bugFix를 rebase 시켜보자.
- 'git rebase main'
rebase를 하게 되면 위 그림처럼 커밋 라인이 한 줄로 정리된다.
하지만 'main'이 아직 그대로라는 문제가 있다.
해결하기 위해 아래의 명령어를 실행하자
- 'git checkout main'
- 'git rebase bugFix'
'main'이 'bugFix'의 부모 쪽에 있었기 때문에 단순히 'main'브랜치를 더 앞쪽의 커밋을 가리키게 이동하게 된다.
Interactive Rebase
cherry-pick은 우리가 어떤 커밋을 원하는지 알 때 유용하다.
만약 원하는 커밋을 모르는 상황이면 Interactive Rebase를 사용할 수 있다.
Interactive Rebase는 리베이스 할 일련의 커밋을 검토할 수 있는 가장 좋은 방법이다.
$ git rebase -i
이런 상황에서
- 'git rebase -i HEAD~4'
공부 중인 웹에서 명령어를 입력하면 아래와 같은 화면이 나타난다.
실제로는 다른 화면이 나온다.
이후 자신이 선택한 커밋만으로 rebase를 할 수 있다.
이 기능으로 undo와 reset을 통해 했던 실수들을 되돌릴 수 있다.
Interactive Rebase를 통해 흔히 말하는 squash를 할 수 있다. (git에는 squash 명령이 없다)
로컬 저장소에 Add a/b/c 커밋이 되어있을 때 만약 이 3개의 커밋을 합치고 싶다면 Interactive Rebase기능을 사용하면 된다.
- 'git rebase -i HEAD~3'
해당 명령어를 입력하면 아래와 같은 화면이 나온다.
Add a/b/c 커밋이 모두 'pick'되어 있다. 세 커밋을 하나의 커밋으로 만들고 싶다면 'squash'를 사용하면 된다.
위의 3줄을 아래와 같이 수정해준다.
수정 후 ':wq'를 입력하여 저장하면 다른 vi창이 뜨면서 커밋 메시지를 수정할 수 있다.
주석처리되지 않은 부분이 커밋 메시지로 저장된다. 이후 :wq를 눌러 커밋 메시지를 저장하면 흔히 말하는 squash 작업이 끝난다.
이 작업은 가능하면 push하지 않은 작업만 squash 하는 것이 추천된다.
만약 이미 push 한 커밋을 squash 하면 아래처럼 브랜치가 이상하게 될 수 있다.
$ git reset
브랜치가 예전의 커밋을 가리키도록 이동시키는 명령어
히스토리를 고친다고 할 수 있다.
이런 상태에서
- 'git reset HEAD~1'
명령어를 입력하면 아래와 같이 변경된다.
$ git revert
git reset의 경우 로컬 브랜치의 경우 사용이 자유롭지만 '히스토리를 고쳐 쓴다'는 점에서 원격 브랜치에는 쓸 수 없다.
변경 내용을 되돌리고, 되돌린 내용을 다른 사람과 공유하기 위해서는 'git revert'를 사용해야 한다.
이런 상태에서
- 'git revert HEAD'
명령어를 입력하면 아래와 같이 변경된다.
$ git cherry-pick
다른 브랜치의 커밋 내용을 현재 자신의 브랜치의 내용으로 복사해 가져오는 명령어
이런 상태에서
- 'git cherry-pick C2 C4'
명령어를 실행하면 아래와 같이 수정된다.
$ git squash
위 그림들은 https://learngitbranching.js.org/ 에서 git을 공부하며 캡처한 사진들입니다.
'Etc' 카테고리의 다른 글
[Jenkins] Jenkins를 이용한 CI/CD (0) | 2022.09.11 |
---|---|
GitHub Action으로 PR 마다 빌드 테스트 하기 (0) | 2022.01.25 |
Confluence OAuth 2.0 인증하기 (0) | 2021.12.14 |
Confluence Cloud Basic REST API 사용법 (0) | 2021.12.14 |