우아한테크코스 과정을 진행하면서 자주 사용하는 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 diff 버전1..버전2
커밋 로그 깔끔하게 모아보기
git log --graph --oneline --decorate
커밋 번호 깔끔하게 보기
git rev-parse --short HEAD
git rev-parse --short HEAD~1
'General' 카테고리의 다른 글
SQL 기초 & 자주쓰는 쿼리문 정리 (10) | 2021.03.29 |
---|---|
[테코톡 요약] 우아한테크코스 3기 레벨1 테코톡 모아보기 (3) | 2021.02.18 |
[번역] 성급한 추상화에 관하여 - AHA Programming (Kent C. Dodds) (7) | 2021.02.11 |
엑셀 자동화 - 구글 스프레드시트 매크로로 데일리 플래너 만들기 (83) | 2021.01.28 |
VS Code 필수 초기 설정 - 기본설정부터 익스텐션까지 (0) | 2021.01.26 |