git에 대해
Git에서 버전 관리를 한다는 것은?
프로젝트 상태가 변경되는 정보를 알고 있다는 것이다. Git 은 commit을 사용해서 버전이 달라지는 것을 관리한다.
Git이 프로젝트 상태가 변경되는 정보를 알고 있다는 것이며, Git 은 누가, 언제, 해당 시점의 프로젝트 상태를 기록해두기 때문에 버전 관리가 가능하다.
컴퓨터에 있는 프로젝트를 Git 이 관리하는 프로젝트로 만들 수 도 있다. 이 작업을 git 초기화(git initialize)한다고 표현한다. 현재 프로젝트의 상태를 찰칵 📸 저장하는 것을 commit이라고 한다.
commit 에는 아래를 포함한다.
- 누가, 언제, 무엇을 했는지가 필요하다. 어떤 작업을 했는지 알려주는 작업 내역인 commit 메시지, 누가(author), commit 한 시간이 필요하다. 누가(author), 언제 commit 했는지의 정보와 프로젝트 변경 내용
- commit을 편하게 관리하기 위한 commit 아이디! commit 아이디는 사용자 아이디처럼 commit에 부여된 유일한 값
- 작업 내역이 어떤 것인지 알아볼 수 있게 적는 메시지를 'commit 메시지'라고 한다.
- commit에 반영할지 안 할지는 파일 단위로 선택할 수 있다. commit에 반영할 파일을 선택하는 것을 add (혹은 staging, 스테이징)이라고 한다.
- commit 한 기록은 history로 볼 수 있다.
- 순서로 보면 'git 초기화하기(initialize) - add(staging) - commit'이다.
- git 초기화는 처음에 단 한 번만 해 주면 된다. 작업 내역을 저장하기 위해서는 add - commit 만 한다.
Repo란?
- 내 컴퓨터에 저장된 Git 프로젝트는 오직 이 컴퓨터에서 나만 볼 수 있는 것은 아니다. 다른 사람과 공유하고 다른 사람도 볼 수 있어야 Git으로 협업할 수 있는 것이다.
- 'Git으로 관리되는 프로젝트'를 Git에서는 repo(리포, repository 리포지토리의 약자)라고 부른다.
- 내 컴퓨터에 저장되어있는 리포지토리를 로컬 repo(local repository) 라 부르고. Github처럼 다른 곳에서 접속할 수 있는 공간에 저장되어있는 것을 원격 repo(remote repository) 라 부른다.
- 원격 repo와 로컬 repo 같이 사용한다는 것은?
- 먼저 one drive, google drive 같은 클라우드 서비스를 사용하는 걸 생각 해자. 클라우드에 있는 폴더를 내 컴퓨터에 있는 폴더를 연결해서 동기화해두면 내 컴퓨터 폴더의 내용이 자동으로 클라우드 폴더와 똑같아진다.
- Git 도 클라우드 서비스로 두 군데의 내용을 동기화한 것처럼 원격 repo와 로컬 repo를 연결시켜서 내용을 반영시킬 수 있다. 로컬 repo 가 원격 repo를 연결하는 것을 추적(Tracking, 트랙킹 / branch tracking)이라고 한다.
- 로컬 repo 만이 내가 어떤 원격 repo와 연결되어있는지를 알고 있지만 원격 repo 는 내가 어떤 로컬 repo와 연결되어있는지 정보를 가지고 있지 않다. 로컬 repo를 기준으로 동작을 이해하자.
- 하지만 Git은 클라우드 서비스와 다르게 작업 내역 즉, commit을 자동으로 반영하지 않는다. 내가 원하는 대로 어디 commit 까지만 반영할지를 수동으로 설정할 수 있게 해서 프로젝트를 더 잘 관리하기 위해서다.
- 협업할 때 특히 commit을 원하는 만큼 반영하는 것이 필요하다 만약 commit 이 자동으로 반영된다면 아래처럼 같이 협업할 때 누구는 요리법 수정을 했고, 누구는 요리법 삭제를 했는데 둘 중에 어떤 내용을 반영해야 할지 난감해지기 때문이다.
- 로컬 repo의 commit 들을 원격 repo에 반영하는 것을 push(푸시)라고 한다. commit들을 밀어 넣는
- 원격 repo의 commit 들을 로컬 repo에 반영하는 것을 pull(풀)이라고 한다. commit들을 당겨오는
- 로컬 repo를 기준으로 생각하면 된다? 나(로컬 repo)의 내용을 보내주는 거니까 push! 나(로컬 repo)로 내용을 당겨오는 거니까 pull!
원격 repo 를 내 컴퓨터에서도 사용할 수 있도록 가져올 수도 있디. 다른 사람이 작업 중이거나 작업을 완료한 프로젝트를 다 가져올 수 있다. 이걸 clone(클론, 복제)라고라고 한다.
깃으로 협업?
이런 상황에서는 어떻게 해야 할 끼?
- 누가 이 작업할 것인지 정한다. -- issue
- 각자 맡은 것을 작업한다. -- Branch
- 각자 작업을 프로젝트에 합칠 수 있게 공유한다. -- merge
- 작업한 내용을 리뷰하고 최종적으로 프로젝트에 반영한다.
issue란?
- 버그(프로그램이 원하는 대로 동작하지 않는 것)를 신고 (Bug report, 버그 리포트)
- 기능 추가 등의 프로젝트 개선 제안 (enhancement)
- 위 문제들을 해결하기 위한 작업 단위
실제 현업에서 issue가 사용되는 예시!
- "회원가입 기능에서 버그 있네요. 이슈 등록해둘게요."
- 여기 버튼을 더 눈에 잘 보이게 고치면 좋겠는데요? 이슈 등록해둘게요.
- "6번 이슈 제가 처리할게요. 제 앞으로 할당해두겠습니다!"
SourceTree에서 내가 만든 iussue와 같이 커밋하기
커밋 메시지에 사진과 같이 #이슈 번호를 넣어준 후 커밋하면 된다!
Branch란?
- 다른사람과 같은 저장소에서 작업을 하고 있다고 해보자! 내 작업만 열심히 commit 하는 게 아니라 다른 부분도 신경을 써줘야 한다. 두 사람이 같은 파일을 작업하면 충돌이 나서 더 이상 작업하기 힘들 수도 있고. 서로가 작업한 commit 내역을 내 로컬 repo에도 틈틈이 반영도 해줘야 한다.
- 서로의 작업 내역이 섞여 있어서 각 작업이 어떻게 진행되고 있는지 좀 보기가 어려워지며 충돌(Conflict의 위험성도 있다).
사진과 같이 서로 다른 branch를 만들어서 서로 다른 곳에서 작업을 한 뒤 merge라는 것을 통해 main이라는 branch에 합쳐준다!
SourceTree에서 branch 만드는 방법
사진과 같이 파일 이름/브랜치 이름 형태로 만들게 되면 파일에 브랜치가 들어가게 됨으로써 나중에 알아보기도 쉽고 파악하기도 쉬워진다.
- 왼쪽 브랜치 탭 : feature 밑에 2_jjigae 항목이 생김. sourcetree에서는 브랜 치명 안에 / 를 적어주면 마치 폴더처럼 보여준다.
- 앞으로 하는 commit 은 방금 만든 브랜치인 feature/2_jjigae 에만 반영됩니다. 현재 작업하는 브랜치를 선택하는 것을 체크아웃(checkout)이라고 합니다. sourcetree에서는 체크아웃된 브랜치, 즉 현재 작업 브랜치를 브랜 치명 왼쪽에 O 표시가 된다.
- 우측 feature/2_jjigae 가 commit 메시지에 생겼습니다. 해당 commit에 붙어있는 파란색 이름표는 브랜치명입니다. 해당 브랜치의 최신 commit 에 이름표를 붙여 줍니다. 각 이름표는 아래와 같은 뜻을 가지고 있습니다.
- main : 로컬 repo의 main 브랜치
- feature/2_jjigae : 로컬 repo의 feature/2_jjigae 브랜치
- origin/main : origin(연결시켜준 원격 repo)의 main 브랜치
- origin/HEAD : 현재 작업 중인 commit. origin(연결시켜준 원격 repo)의 최신 commit
Merge란?
Merge(병합)는 브랜치를 다른 브랜치에 합치는 것입니다. 즉, 특정 브랜치의 commit 들을 다른 브랜치의 commit 내역에 모두 반영한다.
- 브랜치의 작업 내역 commit 들을 다른 branch로 반영(합치기)은 것을 Merge(머지, 병합)이라고 부릅니다. 기본적으로 branch 단위로 merge 하게 됩니다.
- 개발할 때는 기준이 되는 기본 브랜치를 정해놓고 다른 브랜치들을 기본 브랜치에 merge 합니다..
- 추가 자료 - github flow
GitHub flow - GitHub Docs
Introduction GitHub flow is a lightweight, branch-based workflow. The GitHub flow is useful for everyone, not just developers. For example, here at GitHub, we use GitHub flow for our site policy, documentation, and roadmap. Prerequisites To follow GitHub f
docs.github.com
프로젝트마다 Branch 관리하는 방법이 조금씩 다르다고 한다. commit 하고 작업하는 방법을 통틀어 flow(흐름)라고 하며.
대표적으로 github-flow, gitlab-flow, git-flow 가 있다고 한다.
웹 프로젝트 개발의 경우 github-flow를 많이 사용한다
feature/jjigae의 가장 최신 commit(파란색 이름표가 붙어있는 커밋)을 선택하고 확인을 누른다.
모든 경우에 merge 되는 commit 메시지는 자동으로 생성하는 옵션을 넣어준다. (하단 빠른 병합(fast-forward)이 가능해도 새 커밋 생성 옵션)
merge 역시 작업 내역이므로 commit 이 만들어졌다. commit 메시지는 Merge branch 'feature/2_jjigae' into main 한글로 해석하 면면 'main(브랜치)에 'feature/2_jjigae' 브랜치를 병합(merge) 했다'는 뜻이다.
원격 repo와 Branch - 개념과 실습
-
- 원격 repo의 Branch - 개념탑재
- 앞에서 원격 repo는 로컬 repo 가 연결되어있다고 나와있었다. 사실 이 연결은 로컬 repo의 브랜치와 원격 repo 의 브랜치가 연결된 것과 같다.
- 따로 설정을 해주지 않으면 기본적으로 로컬 repo의 브랜 치명 와 같게 원격 repo의 브랜 치명이 생성되어 tracking 됩니다.
pull과 push는 결국 특정 branch(tracking branch)에 있는 commit을 여기와 연결되어있는 branch에 가져오는 것입니다.