GIT을 이용한 개발 중 Merge의 실수로 큰 어려움을 겪었다.

이 글을 보는 개발자라면 이러한 머지 방법은 지양하는 것이 좋을것이다.

사건은이러하다.

develope의 branch에 A 개발자는 자신의 개발중인 코드를 merge했다.

B는 develope에서 브랜치를 새로 만들고, 자신의 코드를 개발하여 커밋하였다.

그리고 이 커밋을 master에 merge하게된다. 그런데 이때 B는 A의 코드가 master에 머지되는 것을원치 않아 의도적으로 A의 코드를 삭제하고 merge를 했다. (이후 A가 코드를 merge하면 아무 문제가 없을것이라 착각하고..)

하지만 A가 자신의 코드를 master에 merge하려고 할때, merge할 커밋에 A의 코드가 정상적으로 나오지않는다. 그 이유는 이미 B의 이전 merge시점에서 A의 코드를 지워버렸기 때문에이다. A가 merge하려는 코드가 B가 merge한 시점의 이전의 버전이라면 A가 지워버린 것이 그대로 반영된다. 결과적으로 A의 코드가 정상적으로 master에 merge할 수 없게 된다.

이것을 해결하는 방법은 여러가지가 있을 수 있다. 내가 시도했던 방법은 아래 두가지있다.

1.revert 기능의 이용 - 잘못된 커밋을 revert시키고 다시 commit하기

2.merge시점 이전의 브랜치에서 새로운 branch 를 생성하고 이후 시점의 commit을 cherrypick으로 merge 한다.

2번방법을 이용해 이번 문제를 해결했다. 단순한 merge가 가능한(새로운 브랜치를 생성하기 이전에 생성된 브랜치) branch는 merge를 하면되지만, 그렇지않은(새로운브랜치를 생성하기 이후에 master에서 생성된 branch의 경우는 나의 잘못된 커밋을 포함하고있다) 브랜치는 변경이력들만 따로 cherrypick이 필요하다.

위의 방법을 통해 식은땀나는 상황을 해결 할 수있었다.

결론 : merge시점에 자신이 프로그래밍하지 않은 코드에 대해서는 unstaging하면 큰일이 발생한다.