Extremely Agile/CVS2014.01.27 15:06

Git을 사용하다 보면 아래와 같은 상황에 자주 부딛히게 된다. 가령 어떤 branch 상에서 여러 프로그래머들이 공동으로 작업을 진행하고 있다고 하자. 


   +------------------------------> a


위의 그래프는 branch a의 초기 상태다. 이 상태에서 여러 프로그래머들이 branch를 만들면 상태는 곧 다음과 같이 바뀐다. 


                +----> a01
                |
                |
                +----> a02
                |
                |
     +--------->+ a
                |
                |
                +----> a03
                |
                |
                +----> a04


이 상태에서 몇몇 프로그래머들이 자기 브랜치를 commit하고 원래 branch에 merge 하면 branch 상태는 아래와 같이 바뀔 것이다. 


                +----> a01 +-------------+
                |                        |
                |                        |
                +----> a02 +---+         |
                |              |         |
                |              |         v
     +--------->+----^---------v--------->
                |    |
                |    |
                +----+ a03
                |
                |
                +----> a04 +---------------->


현재 a04 만이 독야청청 독자적인 길을 가고 있다. 그런데 만일 원래 branch a의 상태가 굉장히 많이 변경되어서 (가령 핵심적인 API가 바뀌었다던지) 더 이상 독자적으로 작업하는 것이 의미가 없다면? 그렇다면 원래 branch a를 다시 받은 다음, a04 브랜치에서 바꾼 파일들의 내용을 반영하도록 하는 것이 좋을 것이다. 그런 작업을 수행하는 기본적인 절차는 다음과 같다. 


1. a04 브랜치에서: git stash (현재까지 바꾼 파일들을 stash 영역에 보존한다)

2. a 브랜치로: git checkout a

3. a 브랜치에서: git pull (최신 버전으로 갱신)

4. a 브랜치에서: git branch a05 (a04의 변경 내용을 반영할 브랜치 생성)

5. a05 브랜치로 이동: git checkout a05

6. a05 브랜치에서: git stash apply --index (a04의 종전 작업 내용 반영)

7. 원래 branch a04 삭제: git branch -d a04


6 단계에서 staged 상태까지 그대로 복원하고 싶은 경우에는 끝에 --index를 붙이고, 그렇지 않은 경우에는 --index는 생략해도 된다.  


또한 4, 5, 6 단계는 git stash branch a05 명령으로 한방에 실행할 수도 있다. 주의할 것은 이렇게 하면 stash 영역에 저장된 내용은 branch에 apply된 다음에 자동으로 삭제된다는 것이다. 



저작자 표시 비영리 변경 금지
신고
Posted by 이병준
TAG ,

소중한 의견, 감사합니다. ^^