Yebali

Git 사용법 본문

Etc

Git 사용법

예발이 2021. 10. 30. 22:17

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 push -f 해주면 원하는 결과를 얻을 수 있다.

$ 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을 공부하며 캡처한 사진들입니다.