GitHub - Git 사용법 2 (명령어,branch, checkout, reset 등)
GitHub - Git 사용법 2 (branch, checkout, reset 등)
이전 포스팅에서는 간단한 Git 사용법에 대하여 다루어봤습니다. 이번에는 조금 더 나아가서 branch, tag, 잘못 반영된 작업을 되돌리는 작업 등 조금 더 진화된 예제를 다루어보려고합니다. 혹시 이전 포스팅을 보시지 못하셨다면 이전 포스팅을 참고하시고 오시면 좋을 듯 싶습니다. 혹시라도 대부분의 기본 명령어들이 숙지 되어있으시다면 굳이 보시지 않으셔도 됩니다.
GitHub - 간단한 Git사용법(명령어,로컬 레포지토리,원격 레포지토리)
로컬 저장소는 git이 관리하는 세그루의 나무로 구성되어 있습니다.
첫번째 나무인 작업 디렉토리(Working Directory)는 이전 포스팅에서 생성한 git 위한 로컬디렉토리입니다.
두번째 Index는 staging 역할을 합니다.("add 명령어로 파일을 관리하에 추가")
마지막 세번째 HEAD는 commit된 스냅샷, 즉 최종 확정본을 나타냅니다.
Branch 만들기 (일명 가지치기)
master라는 최종본의 형상이 있고, 무엇인가를 변경해야하는 작업이 생겨났습니다.
만약 master branch에 직접 수정을 하면? 큰일 날 수도 있겠죠.... 그렇기 때문에
새로운 Branch를 하나 따서 원하는 작업을 진행 할 수 있게 됩니다.
이제 새로운 작업을 새로운 Branch에서 진행하고 개발이 완료된다면
master 가지로 돌아와 병합을 하면 됩니다.
"git checkout -b yeoseong_branch" 라는 명령어로 새로운 Branch 하나를 생성함과 동시에
그 Branch로 스위칭 해줍니다.
"git status" 명령으로 현재 어떠한 Branch에 있는지 확인할 수 있습니다.
만약 다시 Master Branch로 돌아가고 싶다면 "git checkout master"로 돌아가시면 됩니다.
다른 Branch 역시 동일합니다.
만약 Branch를 삭제하고 싶다면 "git branch -d yeoseong_branch"로 삭제해줍니다.
이제 작업을 진행하기 위하여 수정할 소스를 다른 Branch에서 pull 해옵니다.
"git pull origin master"
새로운 파일도 생성했습니다.
이전 포스팅과 똑같은 과정입니다. "git add yeoseong_yoon.txt" 로
git이 관리할 수 있는 파일로 만들어주고 commit 하여 HEAD에 최종본을
반영합니다.
이제는 변경하려고 pull 했던 파일을 수정합니다.
"add" 하지않은 파일은 "git status" 명령에 수정되었으니
"add" 해라라는 상태를 보여줍니다.
만약 파일을 add 하지 않고 commit 한다면 이러한 예외문구를 만날 수 있을 겁니다.
파일을 모두 변경하고 commit까지 해놓은 상태입니다. 이제 commit된 모든 변경사항을
원격 레포지토리에 push합니다.
깃허브에 접속해보니 yeoseong_branch에 변경사항들이 모두 잘 적용이 되었습니다.
변경사항을 master Branch에 merge
이제는 변경사항이 모두 yeoseong_branch로 적용되었으니(개발완료)
master branch에 병합하는 작업입니다.
현재 branch를 master로 스위치 해줍니다. 그리고 yeoseong_branch에 있는 변경내용과
master의 내용을 병합해줍니다.
"git merge yeoseong_branch" 명령어는 현재 Branch와 target Branch를
병합해라 라는 명령어입니다.
master에 추가된 파일과 변경된 파일이 잘 들어온것이 보입니다.
이제는 이것을 원격 레포지토리에 push 해줍니다!
와우... 깃허브에 master Branch를 보면 변경 사항이 잘 merge 된것을 볼 수 있습니다.!!!
로컬 레포지토리에서 잘못 반영되어 되돌리고싶을때(Checkout OR Reset,Fetch)
만약 commit하지 않았다면 "git checkout -- filename"으로 변경내용을 변경 전 상태(HEAD)로 되돌려줍니다.
다만, 이미 인덱스에 추가된 변경 내용과 새로 생성한 파일은 그대로 남습니다.
but add 하지않아서 index에 들어가지도 않았다면 완벽한 reset입니다.
만약 위와 같이 이미 인덱싱했고 commit까지 했다고 가정하면
"git fetch origin" 명령어를 치고,
"git reset --hard orgin/master" 명령어로 리셋을 합니다. 그렇다면
결과를 보듯이 commit된 것이 없어졌습니다.
그렇다면 여기서
Pull & Fetch의 차이점이란 무엇인가?
Fetch : 중앙 저장소의 소스를 로컬 저장소로 가져온다! 그러나 현재 작업중인 소스들을 변경하는 Merge 작업을 하지는 않는다
즉, 변경된 소스는 버려지고 원격저장소의 소스로 업데이트가 된다.
Pull : 중앙 저장소의 소스를 로컬 저장소로 가져온다! 또한 현재 작업중인 소스들의 Merge 작업까지 통합하여 수행한다
변경된 소스 + 원격저장소 소스가 merge된다.
출처: https://coding-start.tistory.com/110?category=786242 [코딩스타트]