개발자 A의 이야기

개발자 A는 자신의 feature branch에서 열심히 작업을 했습니다. 테스트는 통과했고, 코드 리뷰도 받았습니다. 평소와 마찬가지로 develop merge를 했습니다. 다음 날 release 배포가 이루어졌습니다. 그런데 이상하게도 개발한 내용이 반영되지 않았습니다. git history를 확인해보니, develop merge commit이 사라졌습니다! 어떤 일이 생긴 것일까요?

개발자 B의 이야기

개발자 B는 새로운 feature branch를 작업해야 합니다. 코드에 너무 몰입한 나머지, feature branch를 만드는 것을 까먹었습니다. 실수로 develop branch에 직접 커밋을 했고, 심지어 remote push도 했습니다. 우선 git reset --soft를 활용해 remote develop의 가장 최근 commit으로 git history를 되돌립니다. 새로운 feature branch를 만들고 commit을 옮깁니다. 되돌린 git history를 반영하기 위해 force push를 합니다. commit은 새로운 branch로 잘 옮겨졌고, develop branch도 실수 이전으로 복구되었습니다. 다음 날 release 배포가 이루어졌습니다. 왜인지 개발자 A가 굉장히 슬퍼합니다.

git remote의 이야기

  • develop branch의 가장 최근 commit hash는 bba72b입니다.
  • develop branch에 개발자 B의 commit이 push 되었습니다.
  • develop branch에 개발자 A의 merge commit이 push 되었습니다.
  • develop branch가 개발자 B에 의해 bba72b로 force push 되었습니다.

개발자 B가 remote fetch 이후 force push를 하는 사이에, 개발자 A의 merge commit이 들어왔고 force push에 의해 삭제된 것입니다.

문제 해결

실수로 생성한 commit을 되돌리고 싶을 때에는 git reset --soft ~ git push --force가 아닌 git revert를 활용해야 합니다. git history를 덮어 쓰지 않고, 수정을 되돌리는 revert commit을 별도로 만들어 push 하는 것입니다. 그러나 실수로 force push를 하는 일은 누구에게나 생길 수 있습니다. GitHub 등 managed service를 이용하는 경우, master/develop branch를 protected branch로 지정하면 이를 방지할 수 있습니다. protected branch에 실수로라도 force push를 시도하면 에러가 발생하게 되어 revert commit이 강제됩니다.