git branch, checkout 질문
조회수 989회
예전에 Git을 써보려고 한번 공부한 적이 있었는데... 잘 안쓰다가 오랜만에 써보려고 하니 까먹었는지 생각했던 대로 잘 안되네요... ㅎㅎ;; 어떤 상황인지 설명하겠습니다...
혼자서 진행하는 프로젝트라서, 평소처럼 아무생각 없이 master 브랜치에서 A작업을 진행하던 도중, 다른 부분에서 수정이 시급한 버그가 발견되어 버그를 우선 수정해야 하는 상황이 되었습니다. 두 가지 작업에서 모두 '파일 A'를 수정하는 작업이 있습니다. A작업을 진행하던 내용은 내버려두고 B작업을 우선 진행하여 배포하기 위해 기억을 더듬어 브랜치를 만들어 사용해보고자 하였습니다.
제가 생각했던 시나리오는 이렇습니다.
- master 브랜치에서 A브랜치와 B브랜치를 생성한다.
- master 브랜치와 B 브랜치로 각각 checkout하고
git reset --hard HEAD
를 하여 A 작업을 진행하던 내용을 없앤다. - B 브랜치에서 작업을 끝낸 후 master 브랜치로 머지하고 배포한다.
- 다시 A 브랜치로 checkout하여 작업을 완료한 후 master 브랜치로 머지한다.
이런 식으로 각각의 브랜치마다 작업 환경이 분리되어 있어 checkout할 때마다 독립된 상태의 '파일 A'를편집할 수 있을 것이라 기대했는데 그렇지 않은 것 같습니다.
branch와 checkout이 실제로는 어떤 식으로 동작하나요? 또, 제 상황처럼 같은 파일을 동시에 서로 다른 작업에서 편집하고자 할 때에는 어떤 방법을 사용해야 하나요?
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
checkout
은 헤드를 특정 브랜치의 가장 최근 커밋으로 이동하는 명령인데요. 이동할 때 unstaged, untracked file, modified 같은 상태가 변경된 파일이 있다면 변경점을 유지하며 헤드를 이동합니다.그러니 브랜치별로 작업을 분리하려면 브랜치를 옮기기 전에
stash
나commit
으로 현재 브랜치의 작업 내용을 저장한 뒤에checkout
을 해야 하는 것이죠.checkout
은 경우에 따라 실패하기도 하는데요. 대표적으로 이동하려는 브랜치와 현재 브랜치의 변경점이 충돌하지만 커밋을 하지 않았을 때입니다.쉬운 예를 들면:
branch second
로 브랜치를 만듭니다.master
브랜치에서A.txt
에 'test'라는 라인을 추가한 뒤 커밋합니다.checkout second
로 브랜치를 이동합니다.second
브랜치에서A.txt
의 'test'를 'error'로 변경합니다.checkout master
로 브랜치를 이동합니다. (이 때add
를 하나 안하나 결과는 같습니다.)- 깃이 현재 상태를 자동으로 해결할 수 없어 오류를 뱉습니다.
- 아 커밋이 이루어지지 않은 부분은 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
댓글 입력