git rebase와 삽질

git rebase와 삽질

서론

요즘 작업 중인 프로젝트에서 평소에 했던 방식처럼 한 기능 당, 한 테스크당 브랜치를 생성해서 작업하고 있었다. 개인프로젝트이기 때문에.. 따로 dev 브랜치는 만들진 않았고 master에서 작업 브랜치를 만들었는데,

1. 검색기능을 만들었어야 해서 master에서 Search-Todo라는 브랜치를 생성

2. 이미지 클릭시 다른 탭으로 이동하는 기능을 만들어야 해서 Move Todo to Timer라는 브랜치 생성

3. Move Todo to Timer에서 작업하다 잘 안되는 부분이 있어서 다른 기능 구현시작. Search-Todo로 돌아가서 Add-Sound브랜치 생성

4. Add-Sound 작업이 잘 완료되어서 Search-Todo에 rebase 시킴

  • 사운드 작업이라서 Xcode를 좀 건드림.
  • 게다가 Xcode를 중간에 업데이트해서 Xcode 파일 부분부분 변경됨

5. Move Todo to Timer 작업이 끝나서 Search-Todo에 rebase 시키기로 함

문제 발생 지점

  • rebase시 각 커밋마다 rebase할 브랜치와 비교해서 충돌 지점을 체킹함.
    • 여기서 기존 코드랑 수신코드랑 다 받으면 되는거 아닌가 하겠지만,
    • 그건 변경된 코드 부분마다 달라서 잘 확인을 하면서 받아야함.
      • 다행히 최근에 작업한 코드라 괜찮았지, 만약에 작업을 방대하게 많이 했거나 오래전에 작업했던 부분이었다면 더 문제됐을듯.
      • 여기서 Xcode 작업 코드를 잘못 받아버림. (흑흑흑흑 😫😫😫😫)
  • 충돌 체킹 하고, 다시 git add ., git rebase --continue하면 다음 커밋 비교로 넘어감.

6. Search-Todo브랜치에서 error..

Cannot read property 'IsAndroid' of undefined 이 에러를 넘어가질 않음.

  • react-native-sound 모듈은 안드로이드 대응까지 하는데, react-native와 link되는 부분이 적용되지 않아서 나오는 문제라함.
  • 사실 이 에러는 sound 모듈 처음 추가할때 나왔던 에러였는데 재실행해서 해결했던 기억이 남.
  • 똑같이 해봤지만 안됨. > 하 넘나 넘어가고싶었던 빨간색이었따..

나와 같은 문제를 겪은 사람 찾음

  • https://github.com/zmxv/react-native-sound/issues/36
  • 그냥 컴파일 할때 생성되는 파일, 폴더들 다 삭제하고 다시 rebuild하거나, 터미널, 시뮬레이터 에디터 다 재시동 후에 다시 run하면 된다고 했지만..
  • 난 뭔가 안됐다…. 후

7. 다른 브랜치도 공통된 에러인가 해서 다시 Move Todo to Timer로 돌아가봄.

잘 작동됨

  • 진짜 Xcode를 잘못건드렸다는 것을 확신하게 되었다.

8. 다시 Search-Todo로 돌아가서 확인했는데

어랏? 잘 잘동됨

  • 순간적으로 더블체킹 하지않고.. 단순히 된다는 확신에 기쁜 마음으로 master에 merge시킴.
  • rebase 충돌 병합하다가 문제 생길까봐 이번에는 merge만 진행.

9. master merge 이후에 순간 느껴지는 불안감에.. 다시 실행해봄.

하 안됨.

😵

  • 8번에서 잘 작동된 이유는..컴파일을 다시 하고 확인했어야 했는데.. reload만해서 됐었던 것.
  • 흐억. master에 잘못된 코드가 올라갔네.

10. 그냥 돌아가자..

문제가 발생했던 5번 이전으로 돌아가는게 그냥 좋겠다는 생각을 했음.

  • master로 돌아가서 git reset --hard 커밋주소
  • reset은 위험하고 거기에 –hard까지 붙이면 더더욱 위험하지만
  • Xcode라고 확신은 했지만, 정확하진 않았기 때문에.. 이전 커밋을 삭제하기로함.
  • 어차피 문제가 발생했을 때의 브랜치에서 작업했던 코드량이 정말 적어서 다시 작업해도 괜찮았다.

11. master는 4번 상태로 다시 돌아갔다.

  • Sound만 잘 적용된 상태
  • master에서 새로운 브랜치 생성해서 (Move to Timer) 다시 작업 후 master에 merge 시킴
    • 지금 생각해보면 Search-Todo에서 충돌 전 커밋 cherry-pick으로 갖고와도 됐는데

결론

  • git rebase 이후 충돌 병합시 신중하자
  • master나 dev같이 root branch에 merge하기 전에 신중하자
  • git 공부 더하자
  • 한 브랜치에서 2가지 브랜치를 생성할 경우 신중하자.

참고링크
rebase https://backlog.com/git-tutorial/kr/stepup/stepup6_4.html
cherry-pick https://backlog.com/git-tutorial/kr/stepup/stepup2_8.html