GIt이란?
- Git은 분산 버전 관리 시스템(Distributed Version Control System)으로, 소스코드 및 다른 문서의 변경 내용을 추적하고 관리하는데 사용하는 소프트웨어
- Linus Torvalds에 의해 개발되었으며, 개발자 및 팀이 협업하고 소프트웨어 프로젝트를 관리하는데 유용한 강력한 도구임
Git의 핵심 개념
- Repository (저장소) : Git 프로젝트의 모든 파일과 히스토리가 저장되는 곳
- Commit : 변경 내용을 저장하고 이력을 기록하는 Git 작업 단위
- Branch (브랜치) : 변경 내용을 분리하고 개발자 및 팀이 동시에 작업할 수 있게 해주는 분기점
- Merge (병합) : 브랜치에서의 작업을 다른 브랜치로 통합하는 과정
▷ Git 명령어
- "git init" : 새로운 Git 저장소 생성
- "git clone" : 원격 저장소를 로컬로 복제
- "git add" : 변경된 파일을 스테이징 영역에 추가
- "git commit" : 스테이징 영역의 변경사항을 커밋하여 로컬 저장소에 저장
- "git push" : 로컬 저장소의 변경 내용을 원격 저장소로 업로드
- "git pull" : 원격 저장소의 변경 내용을 로컬로 가져와 업데이트
- "git branch" : 브랜치 목록을 확인
- "git checkout" : 다른 브랜치로 전환하거나 특정 커밋으로 이동
- "git merge" : 브랜치 병합
- "git log" : 커밋 로그 확인
- "git status" : 작업 디렉토리와 스테이징 영역의 상태 확인
▷ 원격 저장소와 협업
- Git을 사용하여 여러 개발자가 동일한 프로젝트에 협업 가능
- GitHub, GitLab, Bitbucket등의 원격 저장소를 사용하여, 프로젝트를 공유하고 다른 개발자와 변경사항을 공유
> Git 브랜칭 전략
- Git 브랜칭을 통해 기능 개발, 버그 수정 및 릴리스 관리와 같은 다양한 작업을 분리하여 관리할 수 있음.
- 주요 브랜치로는 'main' 또는 'master' 브랜치가 사용되며, 기능 브랜치, 버그 픽스 브랜치, 릴리스 브랜치 등을 만들어 작업 수행
> Git 사용 팁
- 규칙적으로 커밋을 하고 메시지를 명확하게 작성.
- 자주 원격 저장소로 푸시하여 변경 사항 백업
- 다른 개발자와 협업할 때 충돌을 방지하고 해결하는 방법 배우기
- Git의 다양한 옵션과 명령어를 이해하고 활용
▶ Commit
- 깃 저장소에 로컬 디렉토리에 있는 모든 파일에 대한 스냅샷을 기록하는 것. 디렉토리 전체를 복사하여 붙여넣는것과 유사하지만 더 유용한 방식임.
- Git은 가능한 한 커밋을 가볍게 유지하고자 하기 때문에, 커밋할 때마다 디렉토리 전체를 복사하진 않음.
- 각 커밋은 저장소의 이전 버전과 다음 버전의 변경내역(= delta)을 저장함. (그래서 대부분의 커밋이 그 커밋 위의 부모 커밋을 가리킴)
- 저장소를 복제(Clone)하려면 모든 변경분(delta)를 풀어내야 하며, 이로 인해 명령행 결과로 "resolving deltas" 문구 확인가능.
▶ Branch
- 브랜치는 특정 커밋에 대한 참조(reference)에 지나지 않음.
- 브랜치를 많이 만들어도 메모리나 디스크 공간에 부담이 되지 않기 때문에, 진행중인 작업을 커다란 브랜치로 만들기보다 작은 단위로 잘게 나누는 것이 좋음.
- 하나의 커밋과 그 부모 커밋들을 포함하는 작업 내역
- "git branch [브랜치명]"으로 새 브랜치를 만들고, "git checkout [브랜치명]"으로 해당 브랜치로 이동.
▶ Merge
- Merge는 두 개의 Parent를 가리키는 특별한 커밋을 만들어 냄. 이는 한 부모의 모든 작업내역과 나머지 부모의 모든 작업, 그리고 그 두 부모의 모든 부모들의 작업내역을 포함한다는 의미가 있음.
▶ Rebase
- Merge와는 다른 브랜치끼리의 작업을 접목하는 방법.
- Rebase는 기본적으로 커밋들을 모아서 복사한 뒤, 다른 곳에 떨궈놓는 방식.
- Rebase를 하면 커밋들의 흐름을 보기 좋게 한 줄로 만들 수 있다는 장점이 있음. (저장소의 커밋 로그와 이력이 한결 깨끗해짐)
▶ HEAD
- 프로젝트를 표현하는 커밋 트리(Commit Tree)에서 이동하는 방법
- HEAD는 현재 체크아웃된 커밋을 가리킴. (현재 작업중인 커밋)
- HEAD는 항상 작업트리의 가장 최근 커밋을 가리키며, 작업 트리에 변화를 git 명령어들은 대부분 HEAD를 변경하는것으로 시작함.
- 일반적으로 HEAD는 브랜치의 이름을 가리키고 있음. 커밋을 하게 되면, 브랜치명의 상태가 바뀌고 이 변경은 HEAD를 통해서 확인 가능.
▶ 상대 참조
- 커밋의 해시를 이용하여 여기저기 이동하는 방식(HEAD 방식)은 커밋 트리가 터미널에서 보이지 않기에 매번 해시 확인(git log) 해줘야 하므로 불편.
- 상대 참조로 기억할 만한 지점에서 출발해서 이동하여 다른 지점에 도달해 작업 가능.
- 상대 커밋은 강력한 기능이며, 두 가지 방법이 있음
⦁ 한번에 한 커밋 위로 움직이는 ^
↳ 참조 이름에 하나씩 추가될 때마다, 명시한 커밋의 부모를 찾게 됨.
↳ "main^"은 "main의 부모"와 의미가 같음
↳ "main^^"은 "main의 부모의 부모"와 같음.
⦁ 한번에 여러 커밋 위로 올라가는 ~<num>
↳ 커밋 트리에서 위로 여러 단계를 올라가고 싶을때 사용.
↳ ~연산자 뒤에 올라가고 싶은 부모의 개수를 입력
↳ 상대 참조를 사용하는 일반적인 방법은 브랜치를 옮길때이며, '-f' 옵션을 이용해 브랜치를 특정 커밋에 직접적으로 재지정할 수 있음. (ex. > git branch -f main HEAD~3)
▶ Git 작업 되돌리기
> git reset
- 브랜치로 하여금 예전의 커밋을 가리키도록 이동시키는 방식. (히스토리를 고쳐씀)
- 애초에 커밋하지 않은 것처럼 예전 커밋으로 브랜치를 옮기는 것
- reset 사용시 커밋 히스토리를 깔끔하게 유지할 수 있고, 혼자 작업할때 편하게 되돌아 갈 수 있음.
> git revert
- 개인 로컬 브랜치의 경우 reset을 써도 되지만, 히스토리를 고쳐쓴다는 점 때문에 다른 사람이 작업하는 리모트 브랜치에는 쓸 수 없으므로 변경분을 되돌리고, 되돌린 내용을 다른 사람들과 공유하기 위해서 git revert를 사용.
- revert를 사용하면 중간에 무슨 문제가 있었는지, 왜 돌아갔는지 등의 기록이 가능
- 다른 사람과 같은 브랜치에서 작업할 때 코드 충돌을 최소화 할 수 있음
▶ Git Cherry-pick
- git cherry-pick <Commit1> <Commit2> <...> 과 같은 형태로 사용
- 현재 위치 아래에 있는 일련의 커밋들에 대한 복사본을 만들겠다는 것.
- 체리픽은 우리가 원하는 커밋이 무엇인지 알때 아주 유용함. 원하는 커밋을 모르는 상황에는 인터렉티브 리베이스 사용
▶ 인터렉티브 리베이스
- rebase 명령어 사용시 '-i' 옵션을 같이 사용하는 것을 의미함.
- 이 옵션을 추가하면 git은 리베이스의 목적지가 되는 곳 아래에 복사할 커밋들을 보여주는 UI를 띄움. 또한 각 커밋을 구분할 수 있는 각각의 해시들과 메시지도 보여줌.
- 적용할 커밋들의 순서를 UI로 바꿀 수 있음. (마우스 드래그 앤 드롭)
- 원하지 않는 커밋들을 뺄 수 있음. 이는 pick을 이용해 지정가능.
- 커밋을 스쿼시(squash) 할 수 있음.
↳ 체리픽과 인터렉티브 리베이스는 로컬에 쌓인 커밋(디버그용 코드)을 해결하는 대표적인 방법
댓글