git branch, checkout 질문

조회수 989회

예전에 Git을 써보려고 한번 공부한 적이 있었는데... 잘 안쓰다가 오랜만에 써보려고 하니 까먹었는지 생각했던 대로 잘 안되네요... ㅎㅎ;; 어떤 상황인지 설명하겠습니다...

혼자서 진행하는 프로젝트라서, 평소처럼 아무생각 없이 master 브랜치에서 A작업을 진행하던 도중, 다른 부분에서 수정이 시급한 버그가 발견되어 버그를 우선 수정해야 하는 상황이 되었습니다. 두 가지 작업에서 모두 '파일 A'를 수정하는 작업이 있습니다. A작업을 진행하던 내용은 내버려두고 B작업을 우선 진행하여 배포하기 위해 기억을 더듬어 브랜치를 만들어 사용해보고자 하였습니다.

제가 생각했던 시나리오는 이렇습니다.

  1. master 브랜치에서 A브랜치와 B브랜치를 생성한다.
  2. master 브랜치와 B 브랜치로 각각 checkout하고 git reset --hard HEAD를 하여 A 작업을 진행하던 내용을 없앤다.
  3. B 브랜치에서 작업을 끝낸 후 master 브랜치로 머지하고 배포한다.
  4. 다시 A 브랜치로 checkout하여 작업을 완료한 후 master 브랜치로 머지한다.

이런 식으로 각각의 브랜치마다 작업 환경이 분리되어 있어 checkout할 때마다 독립된 상태의 '파일 A'를편집할 수 있을 것이라 기대했는데 그렇지 않은 것 같습니다.

branch와 checkout이 실제로는 어떤 식으로 동작하나요? 또, 제 상황처럼 같은 파일을 동시에 서로 다른 작업에서 편집하고자 할 때에는 어떤 방법을 사용해야 하나요?

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 혹시 A, B 브랜치 생성할 때, 기존 작업물을 커밋 하셨나요? working tree의 작업물(add 하기 전 변경 사항)은 브랜치 생성시 같이 옮겨지지 않습니다. 브랜치를 생성하면 그 base 브랜치의 가장 최근 커밋이 기준이지 커밋 안 된 내용을 같이 가져가지 않습니다. 시나리오를 봤을 때 이 부분이 간과된 듯 한 느낌이 드네요. doodoji 2020.3.30 01:42

1 답변

  • checkout은 헤드를 특정 브랜치의 가장 최근 커밋으로 이동하는 명령인데요. 이동할 때 unstaged, untracked file, modified 같은 상태가 변경된 파일이 있다면 변경점을 유지하며 헤드를 이동합니다.

    그러니 브랜치별로 작업을 분리하려면 브랜치를 옮기기 전에 stashcommit으로 현재 브랜치의 작업 내용을 저장한 뒤에 checkout을 해야 하는 것이죠.

    checkout은 경우에 따라 실패하기도 하는데요. 대표적으로 이동하려는 브랜치와 현재 브랜치의 변경점이 충돌하지만 커밋을 하지 않았을 때입니다.

    쉬운 예를 들면:

    1. branch second로 브랜치를 만듭니다.
    2. master 브랜치에서 A.txt에 'test'라는 라인을 추가한 뒤 커밋합니다.
    3. checkout second로 브랜치를 이동합니다.
    4. second 브랜치에서 A.txt의 'test'를 'error'로 변경합니다.
    5. checkout master로 브랜치를 이동합니다. (이 때 add를 하나 안하나 결과는 같습니다.)
    6. 깃이 현재 상태를 자동으로 해결할 수 없어 오류를 뱉습니다.
    • 아 커밋이 이루어지지 않은 부분은 checkout시 건드려지지 않고 유지된 채 이동되는군요. 진행중인 작업이 있어 modified된 파일의 변경 내용을 보존해 둔 채로 다른 작업을 먼저 진행하여 커밋한 후 다시 이어서 작업을 하고 싶은데, 그 경우에는 방법이 있을까요? 알 수 없는 사용자 2020.3.30 12:42
    • 보존이라는게 A를 수정해서 A+가 됐다면 A+ 상태 그대로 다른 브랜치로 가서 작업하는걸 의미하나요 아니면, A+를 따로 저장한 A가 된 상태에서 다른 브랜치에서 작업하고 돌아와 A+를 복구하는걸 의미하나요? 편집요청빌런 2020.3.30 12:45
    • 전자: 현재 브랜치를 커밋 후 브랜치를 새로 생성한 다음 이동해서 작업, 후자는 두 가지 방법이 있는데, 첫 번째는 stash로 임시 저장한 다음 다른 브랜치에서 작업 후 돌아와 stash의 내용을 apply하면 되고, 두 번째는 현재 브랜치를 커밋하기 전에 새 브랜치를 먼저 땁니다. 그럼 새 브랜치는 현재 브랜치의 커밋 전 내용이겠죠? 거기서 작업 후 원래 브랜치로 돌아와 새 브랜치의 내용을 현재 브랜치로 머지합니다. 편집요청빌런 2020.3.30 12:47
    • '두 번째는 현재 브랜치를 커밋하기 전에 새 브랜치를 먼저 땁니다. 그럼 새 브랜치는 현재 브랜치의 커밋 전 내용이겠죠? 거기서 작업 후 원래 브랜치로 돌아와 새 브랜치의 내용을 현재 브랜치로 머지합니다.' - 새 브랜치를 만들고 이동하면 modified된 파일들을 가지고 그대로 이동하게 되지 않나요? 알 수 없는 사용자 2020.3.30 14:38
    • 현재 브랜치를 커밋하기 전에 새 브랜치를 만들기만 합니다. 그리고 현재 브랜치를 커밋하고 새로 만든 브랜치로 이동해서 작업합니다. 새 브랜치에서 커밋하고 원래 브랜치로 돌아옵니다. 그리고 두 브랜치를 머지합니다. 편집요청빌런 2020.3.30 14:42
    • 아 현재 브랜치에서 커밋을 미리 한 후에 이동하라는 말씀이셨군요... stash를 사용해서 원하는 방식으로 문제를 해결 할 수 있을 것 같습니다. 친절한 답변 감사드립니다! 알 수 없는 사용자 2020.3.30 14:46

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)