git 에서 commit을 안하고 브랜치를 이동한다면?

한창 git을 공부하면서 들었던 의문이 있었다.

 

main 브랜치에서 feat1 브랜치를 따고 feat1에서 새 파일을 만들고 커밋을 하지않고 다시 main 브랜치로 checkout하면 어떻게 될 까?

 

결론은 feat1 브랜치나 main브랜치나 새 파일을 공유하게 된다.

 

여기서 내가 나름 생각한 결론은 내가 만든 새 파일은 add를 했든 안했든 commit으로 인한 이력이 남지 않기 때문에(git이 아직 관리를 하지 않음) 단지 working directory에 머무느냐 stage에 머무느냐와 관계없이 그냥 로컬에 남아있기 때문에 엄밀히 말해서 checkout을 했다고 하더라도 파일이 그대로 공유가 된다.

 

근데 만약 feat1 브랜치에서 newfile.md 파일을 만들고 다음과 같이 글을 작성했다고 가정하자.

안녕하세요.

그리고 commit을 하지 않은 채로 checkout을 통해 main브랜치로 넘어와도 이 newfile.md가 존재한다. 이제 다시 feat1 브랜치로 checkout 한뒤, commit을 한다.

이렇게 되면 main 브랜치에는 newfile.md가 없고, feat1 브랜치에만 newfile.md가 남아있게 되는데,

 

여기서 다시 feat1 브랜치의 newfile.md를 다음과 같이 변경했다고 가정하자.

안녕하십니까?

그리고 commit을 하지않고 checkout으로 main 브랜치로 이동하려고 하면 다음 메시지가 뜬다.

즉, 커밋한 내용이 로컬 내용과 겹치게 되면(로컬 내역을 변경함으로써 커밋한 내용이 변경될 가능성이 생길 경우) 브랜치의 이동이 불가능하다고 나온다. 그 이유는 브랜치를 이동하게 되면 이동하게될 브랜치의 newfile의 내용을 덮어씌어 버릴 수 있기 때문이다. 

 

결론은 항상 브랜치를 따고 작업물을 완성적으로 만든 다음에 commit을 하고 그제서야 브랜치를 이동해야 된다는 것이다.

 

만약 해당 브랜치에서 작업물을 완성하지 못하고 다른 브랜치로 넘어가야 한다면 stash를 통해 잠깐 작업물을 커밋하지 않고 보관해 둘 수 있다. 다른 브랜치의 작업이 끝나고 다시 해당 브랜치로 돌아오게 되면 stash pop을 통해 보관해둔 작업물을 꺼내서 다시 작업할 수 있다.

댓글

Designed by JB FACTORY