본문 바로가기

General

Git - 자주 사용하는 명령어 모음

 

우아한테크코스 과정을 진행하면서 자주 사용하는 git 명령어를 정리해보자.

 

 

과거의 커밋 메세지 변경하기

PR 메세지를 작성하기 전 git log를 보며 조금 더 커밋메세지를 자세하게 변경하고 싶을 때 사용한다.

git rebase -i HEAD~3
// 변경하고자 하는 커밋이 몇 번째 전 커밋인지 HEAD~숫자로 표현
// 'pick'을 'edit'로 변경 후 저장 (:wq + enter)
git commit --amend
// 내용 수정 후 저장 (:wq + enter)
git rebase --continue

단, 변경하려는 커밋을 이미 push하고 나서 이 방법을 사용하면 conflict가 발생할 수 있고 PR에도 중복되어 들어가게 된다.

 

이미 커밋을 했는데 add 하고 싶은 파일이 있다면 아래 방법으로 살짝 추가할 수도 있다. 

git commit --amend --no-edit

 

 

각자의 레포에서 페어한 내용 가져오기

페어가 fork한 페어의 로컬을 내 로컬에서 remote로 추가해놓으면 페어와 꼭 한 레포에서 작업하지 않고도 쉽게 pull 해올 수 있다. 이렇게하면 페어프로그래밍을 각자의 로컬에서 진행하면서 번갈아가며 커밋로그를 쌓을 수 있어서 편리하다.

git checkout -b 365kim
// pair 라는 이름으로 리모트 설정
git remote add pair https://github.comgithub.com/SunYoungKwon/javascript-lotto.git

// 페어의 repo에서 페어가 commit, push 한 후 턴이 나에게 돌아왔을 때
git pull pair sunyoungkwon

 

 

원본저장소 > 로컬에 동기화 시키기

우선 미션시작 버튼을 누르면 원본저장소에 깃허브 아이디(365kim)로 브랜치가 생성된다. 페어와 하나의 repository에서 작업했다면 헤어지면서 페어와 작업한 내용을 내 로컬에 가져올 때는 아래와 같이 사용한다.

git checkout -b 365kim // 내 로컬 main에서 브랜치 생성
git remote add upstream https://github.com/YUJO42/javascript-racingcar.git
git fetch upstream YOJO42
git rebase upstream/YOJO42
git push origin 365kim

// 신규 커밋 시
git push -u origin 365kim

 

1단계를 마치고 2단계 미션을 진행하기 전에 fork한 로컬 repository로 리뷰어님께서 merge해주신 내용을 가져올 때는 아래와 같이 사용한다. 2단계 PR을 올렸을 때 머지 이전 커밋이 함께 올라가지 않도록 하기 위함이다.  (로컬 1단계 브랜치 - 365kim, 로컬 2단계 브랜치 - 365kim-step2)

git checkout -b 365kim-step2 // 내 로컬 main에서 브랜치 생성
git remote add upstream https://github.com/woowacourse/javascript-racingcar.git
git fetch upstream 365kim
git rebase upstream/365kim
git push origin 365kim-step2

// 신규 커밋 시
git push -u origin 365kim-step2

 

 

미리 작성해둔 2단계 코드 가져오기

우선 원본저장소(woowa)의 내 step1 브랜치를 rebase해서 나의 merge 커밋을 가져온다. 그리고 나의 페어가 1단계에서 추가로 수정한게 있다면 이를 내 로컬 repository에 반영하기 위해 페어의 로컬 repository에서 1단계 커밋을 pull 해온다. 마지막으로 2단계를 진행하던 브랜치에서 cherry-pick으로 모든 커밋로그를 가져온다.

cherry-pick에서 커밋을 하나하나 가져오지 않고 범위를 "2단계첫커밋^..2단계마지막커밋"과 같이 명령어에 범위를 지정할 수 있다. 커밋번호는 git log에서 긁어와도 좋지만 깃허브 웹 상에서 조회하면 더 쉽게 복사할 수 있다. ^를 포함해야 첫커밋도 포함된다는 점에 주의하자.

cherry-pick은 pull과 다르게 한번에 가져와지지 않고 커밋을 하나하나 가져오다가 conflict가 발생하면 그때마다 수정을 해준 다음 git commit, cherry-pick --continue 해주어야 하기 때문에 번거롭게 느껴질 수 있다. 하지만 pull로 가져오면 커밋로그가 1개만 남아 커밋로그를 그대로 가져오고 싶다면 cherry-pick을 사용하는 것이 좋겠다.

git remote add upstream https://github.com/woowacourse/javascript-lotto.git

git remote -v
// origin      https://github.com/365kim/javascript-lotto.git (fetch)
// origin      https://github.com/365kim/javascript-lotto.git (push)
// pair        https://github.com/SunYoungKwon/javascript-lotto.git (fetch)
// pair        https://github.com/SunYoungKwon/javascript-lotto.git (push)
// upstream    https://github.com/woowacourse/javascript-lotto.git (fetch)
// upstream    https://github.com/woowacourse/javascript-lotto.git (push)

git checkout -b step2
git fetch upstream 365kim
git rebase upstream/365kim
// 컨플릭트 수정
git rebase --continue 또는 git rebase --skip

git pull pair step1
// 컨플릭트 수정
git add .
git commit -m"chore: 페어 브랜치 pull 이후 conflict 해결"
git cherry-pick d2ed218171b931b2b3173e9cf6b4075c5989e700^..8bab85fdd55b2f9a13f6428647f83bc3c03aa343
// 충돌이 안난 커밋은 표시만 되고 충돌이 난 경우에 충돌을 표시하면서 멈춘다.
// ...
// create mode 100644 cypress/integration/winningNumbersInput.spec.js
// Auto-merging index.html
// CONFLICT (content): Merge conflict in index.html
// error: could not apply 4cbf163... test: 입력된 당첨번호 & 보너스번호가 1 ~ 45 사이의 값이 아닌 경우 재입력 요청 메세지 표시

// 컨플릭트 수정
// git commit
// git cherry-pick --continue => 끝까지 반복!

 

 

이전 단계 커밋이 줄줄이 땅콩으로 따라온다면

2단계 PR을 올리려는데 커밋 히스토리에 의도치 않게 1단계 커밋 히스토리까지 딸려왔다. 1단계를 마친 시점을 git log --graph로 확인해보면 브랜치 정리가 제대로 안된 채로 히스토리를 쌓아왔던 것을 볼 수 있다. cherry-pick으로 커밋히스토리를 깔끔하게 수정해보자.

1. 로컬 메인에서 새 브랜치 만든다
2. 원본저장소의 1단계(merge커밋까지) pull 해온다
2. 체리픽 + 무한스킵 한다

 

우선 새로운 브랜치에서 원본저장소에 있는 1단계 merge커밋까지 pull 해온다. 그 다음에 내 로컬에 있는 2단계 작업내용을 cherry-pick 한다. CONFLICT가 발생하더라도 (깃을 믿고) 하나하나 수정하지 말고 모든 커밋이 옮겨질 때까지 계속 git cherry-pick --skip만 반복적으로 해준다. (continue가 아니라 skip이다!) 모든 커밋이 옮겨진 후 cypress로 테스트를 실행해보면 잘 옮겨진 것을 확인할 수 있다.

(이것보다 더 좋은 방법 아시는 분 슬랙dm/댓글 제보 부탁드려요)

git checkout -b 365kim-step2 // 내 로컬 main에서 브랜치 생성
git remote add upstream https://github.com/woowacourse/javascript-lotto.git
git pull upstream 365kim-step1 // 1단계 머지커밋까지 가져오기
git cherry-pick 2단계첫커밋^..2단계마지막커밋
// 이후 git cherry-pick --skip

git log // 잘 옮겨진 것 확인
npm run cypress // 혹시나해서 테스트도

git log --graph로 확인해봤을 때 브랜치 갈래가 여러개로 나뉜 것을 볼 수 있다.
72개의 줄줄이 땅콩 커밋 히스토리에서 27개의 커밋으로 깔끔하게 정리한 모습

 

 

커밋과 커밋 사이에 차이점 확인하기

git diff 버전1..버전2

 

커밋 로그 깔끔하게 모아보기

git log --graph --oneline --decorate

 

커밋 번호 깔끔하게 보기

git rev-parse --short HEAD
git rev-parse --short HEAD~1