2023. 9. 5. 10:57ㆍGit
GitHub란
- GitHub는 소프트웨어 개발 프로젝트를 위한 소스코드 관리 서비스이며, 개발자들에게 협업을 위해 필수적인 서비스입니다.
GitHub를 위한 사전 지식
- Commit&Push
- 커밋 (commit) : 파일을 추가하거나 변경 내용을 저장소에 저장하는 작업
- 푸시 (push) : 파일을 추가하거나 변경 내용을 원격 저장소에 업로드하는 작업
- 로컬저장소와 원격저장소란?
- 저장소는 파일을 저장하는 장소입니다. 자신의 컴퓨터에 있는 것이 "로컬 저장소"이고, 서버나 네트워크에 있는 "원격 저장소"가 있습니다. 기본적으로 로컬 저장소에서 작업을 수행하고 그 결과를 원격 저장소에 저장하게 됩니다.
- 브랜치 (branch)
- 개발을 하다보면 현재 출시하고 있는 버전을 유지보수하기 위해 여러 한 버전을 관리해야 하는데요 이를 위해 GIthub에서 브랜치라는 기능을 제공해 줍니다. 브랜치는 가지라는 뜻으로 나무에서 가지가 뻗듯 Main에서 브랜치를 생성해 다른 브랜치의 영향을 받지 않고 같은 저장소에서 각 개발을 할 수 있습니다.
Git으로 할 수 있는 작업들
- 버전 관리
- SW 개발 진행 시에는 중간 버전 저장이 꼭 필요함.
- 새로 추가한 기능이 최종적으로 쓰이지 않을 수도 있고, 버그로 인해 새로 개발한 파트를 날릴수있음
- 나이브한 방법으로는 여러 개의 파일을 만들어 버전관리를 할 수 있지만, 이는 작업의 규모가 커지게 되면 단순히 여러 개의 파일로 버전을 남겨 놓으면 관리가 힘듦.
- Git은 저장소를 바탕으로 버전 관리를 손쉽게 할 수 있도록 해줌.
-저장소의 버전에 따라 누가, 언제, 무엇을 고쳤는지가 다 기록에 남고 쉽게 확인이 가능, 이전 버전으로 돌리는 것까지 가능하다.
- SW 개발 진행 시에는 중간 버전 저장이 꼭 필요함.
- 백업
- 예기치 못한 에러나 디스크 장애에 대비해 백업이 필수적임.
- GIt의 경우는 GitHub를 주로 활용한다.
-GitHub는 Git 저장소 호스팅 서비스로써,
클라우드 상에 Git 저장소 관련 파일들을 백업할 수 있음.
- 협업
- GitHub를 활용하면 여러 개발자가 협업하여 SW 개발을 진행할 수 있음
- 버전마다 기록이 남으므로 소스코드 상의 문제가 생겨도 해결이 쉽다.
- 네트워크로 접근하는 원격 저장소 하나에서 전체 소스코드 및 관련 파일을 관리하므로 협업에 참여하는 개발자들이 최신 코드를 바탕으로 작업이 가능.
- GitHub를 활용하면 여러 개발자가 협업하여 SW 개발을 진행할 수 있음
📌Git Bash를 이용한 Git 버전관리 및 실습!
Git init 명령을 통해 현재 디렉터리를 git 저장소로 생성 가능합니다.
ls -la명령어를 통해. git과 같은.으로 숨겨진 파일을 읽을 수 있습니다!
Git에서는 세 가지의 공간을 활용하여 저장소를 관리함.
- Working tree
- 소스코드를 직접 수정 및 저장하는 디렉터리입니다.
- Stage
- 버전관리를 수행할 대상이 되는 파일들이 모인 공간
- Repository
- 저장소라고 하며 각 버전이 저장되어 있는 공간
- Working tree(hello-git 디렉터리)에 cal.py라는 파일이 추가한다. 아직은 stage가 비어있는 단계.
- add명렁을 통해 stage에 추가할 수 있고 이후 레퍼지토리에 commmit 할 수 있다.
- commit을 할 경우 stage에 있는 파일들이 저장소로 이동하며 새로운 버전이 생성된다.
먼저 git status 명령어를 입력해 보자!
그러면 아래 사진과 같이 commit 할 파일이 없다고 출력된다. 아직 새로운 생성 파일이 없는 상태이다.
아래처럼 Vim 에디터로 hello-git 디렉터리에 있는 cal.py를 수정해 보자!
그리고 다시 git status를 입력해 보면 이렇게 Untreacked files 이라는 출력이 생긴다.
현재 cal.py는 working tree에는 있지만 stage로 추가되지 않았으며, 이러한 파일들은 untracked 상태라고 한다!
아직 git에 의해서 버전이 관리되지 않은 파일.
git add 명령어를 입력하고 git status를 입력해보면 cal.py는 stage에 추가되었고, commit 할 수 있는 파일로 변경되어 있는 것을 알 수 있다.
git commit 명령어를 입력하면 아래 그림처럼 vim editor로 이동하는데 commit message를 입력하는 공간이다.
commit -m [commit message] 옵션을 이용하면 vim으로 이동하지 않고 커밋 메시지를 입력할 수 있다.
commit을 한 후에 git log명령어를 통해 확인해 보니 "add cal.py"라는 커밋 메시지와 함께 정상적으로 commit 된 것을 볼 수 있다.
commit 6 e2 f...( HEAD -> master) 이 부분은 commit hash로써 각 commit에 대한 고유 식별자이다.
HEAD->master라는 표시는 현재 최신 버전임을 의미한다.
그림과 같이 커밋을 한 이후에는 stage가 비워진 상태로 바뀐다. 그리고 , commit을 누가 언제 했는지 commit 메시지를 통해 알 수 있다.
vim을 이용해 cal.py에 setdata함수를 추가하고 다시 git status를 입력한 화면이다.
아까 cal.py를 처음 생성했을 때와는 달리 untracked file이 아닌 modified file로 뜨는 것을 볼 수 있다. 한번 버전이 생성된 파일은 unmodified file에서 수정되면 modified file로 변경되어 stage로 add 될 준비가 된다.
git diff를 통해 최신 버전과 현재 working tree내의 차이점을 요약해서 확인 가능.
-표시 뒤의 최신버전에 있던 라인이 사라졌고, +표시 뒤의 내용으로 대체됨.
- 요약하면 git에서의 commit은 위 사진과 같다!
- 새로 추가된 파일(untracked file)및 기존에 존재했으나 수정된 파일 (modified)들을 stage에 추가한다.
- 이후 commit이 가능해지고 stage에 있는 파일들만 반영된다.
- -a 옵션들을 통해 변경된 자동으로 stage에 반영하고 commit이 가능하나 stage과정을 거쳐 신중히 commit 하는 것을 추천한다!
- unmodified 파일들은 최신 버전 그대로의 파일들을 의미함.
- Stage에 추가된 파일을 다시 stage에서 제거하고 싶은 경우
- git reset HEAD <파일명>
- 변경했던 파일을 다시 최신 버전의 내용으로 되돌리고 싶은 경우
- git checkout -- <파일명>
- 저장소에 있던 버전으로 파일을 덮어쓰는 명령이므로 수정사항이 사라짐을 유의!
- Working tree에 변경되어 있는 파일을 원본으로 되돌림.
- git checkout -- <파일명>
- git reset HEAD^ 을 이용하면 최신버전 바로 직전의 버전으로 working tree를 되돌릴 수 있다.
- 특정 버전으로 되돌리고 싶다면
- git reset --hard <원하는 버전 commit hash>
- 주의사항: 특정 버전으로 돌아간다면 되돌린 버전 이후의 commit들이 사라짐을 유의하자.
- 이는 기본적인 버전관리의 용이함을 무효화하는 행동이 될 수 있다!
- gir reset --hare 명령은 굉장히 위험함을 유념하자.
- 주의사항: 특정 버전으로 돌아간다면 되돌린 버전 이후의 commit들이 사라짐을 유의하자.
- git reset --hard <원하는 버전 commit hash>
📌Stage 공간의 필요성
- 수정된 부분 중 일부분만 commit가능
- 일부 파일은 수정이 완료되고 일부는 아직 수정 중이라면, 특정 파일만 골라서 commit가능
- 대규모 프로젝트에서는 각자 파트만 골라서 commit 하기에 굉장히 용이하다.
- commit 전 코드 리뷰 및 테스트 용이
- commit 전에 stage 공간의 코드들을 이용하여요 테스트를 진행하고 신중하게 commit 할 수 있다.