본문 바로가기

문돌이 존버/코딩연습

git 기본 지식 쌓기(1)

반응형

git의 기본 구조는 아래와 같습니다. Working Directory는 본인이 작업하고 있는 공간이며, .git directory 에 파일을 업로드하기 위해선 Staging Area 를 거쳐야 하죠. 항상 파일 업로드는 Working Directory -> Staing Area -> .git directory 순서로 흘러갑니다. 

<출처: git-scm 홈페이지>

아래는 파일에 대한 라이프 사이클을 표현한 것인데요. 화살표 방향을 잘 살펴보시면 플로우를 이해할 수 있을 겁니다.

<출처: git-scm 홈페이지>

Git 기본 명령어

git add: 새로운 파일을 Staging area(준비영역)으로 보내기
git status: Staing file들의 상태 확인
git commit: .git 저장소 내에 staging 파일 저장 (추가: git commit -m "commit message")
git reset: 준비영역에서 파일 삭제
git diff: commit된 파일 중 변경된 사항을 비교할 때 
git commit --amend -m "modify message": commit message 수정
git log: .git repository에 존재하는 history 확인
log 옵션들

git log -p -2
-p, --patch: 각 commit의 수정 결과를 보여주는 diff와 같은 역할 수행
-n: 상위 n개의 commit만 보여줌
git log --stat
--stat: 어떤 파일이 commit에서 수정되고 변경되었는지, 파일 내 라인이 추가되거나 삭제되었는지 확인
git log --pretty=oneline
--pretty=oneline: 각 commit을 한 줄로 출력
git log --graph
--graph: commit 간의 연결된 관계를 아스키 그래프로 출력 (branch에 유용하게 사용되는 옵션)
git log -S function_name
-S: 코드에서 추가되거나 제거된 내용 중 특정 텍스트(위에선 function_name)가 포함되어 있는지 검사

Git Branch란?

독립적으로 어떤 작업을 진행하기 위한 개념 => 각각의 Branch는 다른 Branch의 영향을 받지 않음

종류: 메인 Branch(배포할 수 있는 수준의 안정적인 Branch) / 토픽 Branch(기능 추가나 버그 수정과 같은 단위 작업을 위한 Branch)

git branch branch_name: branch_name이라는 Branch 생성
git branch: 현재 Branch 확인
git checkout branch_name: Branch 전환
checkout은 branch를 전환하는 데 사용할 수도 있고 아래와 같이 git log로 확인한 snapshot(16진수 hash값)을 넘나들 때도 사용 가능
git checkout <snapshot hash>: snapshot hash 예시(d97d38... / e4abb6f...)

fast-forward

git checkout master
git merge branch_name
master가 가지고 있는 모든 내용은 branch_name이 갖고 있는 모든 내용과 동일
branch_name Branch 내용이 master Branch에서 업데이트된 내용이기 때문에 곧바로 merge 가능 

갈라지는 branch(branch name과 master가 가리키는 체크포인트가 다름)

파일을 동시에 수정하는 경우
git log --graph --all: commit graph 확인 가능(추가 옵션: git log --pretty=oneline --graph --all)
git checkout master
git merge branch_name
git branch --merged: 병합된 Branch 확인 가능

사용을 마친 Branch는 git branch -d branch_name 을 통해 삭제

Merge conflict

Merge한 두 Branch에서 같은 파일을 변경했을 때 충돌 발생 

git status: 어느 파일에서 충돌이 발생했는지 확인
충돌이 일어난 파일을 열고 어느 Branch에서 수정한 내용을 선택할지 결정
파일을 생성하거나 수정할 때는 폴더 내 파일을 직접 누르거나 nano file_name.py를 이용 
수정 완료 후(Ctrl X -> Y -> Enter) git add, git commit 과정을 거쳐 다시 Merge 진행

* 충돌을 방지하는 가장 좋은 방법은 master Branch의 변화를 최소화하는 것

원격 저장소란?

인터넷이나 네트워크 어딘가에 있는 저장소(ex. github / gitlab)

Git clone: 기존의 git repository(원격/로컬)를 복사
Gitlab이나 Gitlab에서 clone 버튼을 누르면 2개의 옵션 등장 -> Clone with HTTPS 옵션 선택 
git clone https://gitlab.com/~~/myproject.git
git remote add origin https://gitlab.com/group/project: 원격 저장소 연결 (원격 저장소 단축 이름은 origin)
저장소 구소는 웹 호스트 서비스 + 그룹 명 + 프로젝트 명 으로 구성됨 
git remote: 연결된 원격 저장소 확인
git remote show origin
git remote rename origin git_test: 원격 저장소 단축 이름을 origin에서 git_test로 변경
git remote rm git_test: 원격 저장소 삭제

저의 간단한 예제를 공유하자면 다음과 같습니다. 로컬에서 이미 폴더를 만들어놓은 상태입니다. 

git init
git remote add origin https://gitlab.com/~~~/main.git
git add . # 현재 폴더 안에 있는 모든 파일 추가
(git status)
git commit -m "Initial commit"
(git log)
git push -u origin master

원격 저장소 동기화

Pull: 원격 저장소에서 데이터 가져오기 + 병합(Merge)

Fetch: 원격 저장소에서 데이터 가져오기 

git pull origin master: 원격 저장소에서 데이터를 가져와 로컬 데이터와 병합
git log --all: 병합 확인
git log origin/master: 변경된 파일을 확인

git fetch origin master: origin 데이터를 master에 반영
git merge origin/master: Merge 진행(fast-forward 방식으로 master와 origin/master 병합)

로컬 저장소에서 작업한 내용을 원격 저장소에 반영

git push origin master
주의: 다른 사람이 먼저 Push한 상태에서는 Push할 수 없기 때문에 다른 사람이 작업한 것을 Merge부터 해야 함
해결 방법: git pull(fetch) origin master -> 해당 파일 최종 수정 -> git add file_name.py -> git commit -m "final version" -> git push origin master
이때, 브랜치를 여러 개 만들었을 경우 git push origin master에서 master 대신 해당 브랜치 이름 입력
git remote -v: 지정한 저장소의 이름과 주소를 함께 볼 수 있음

git push origin --delete "branch name": 원격저장소에 올라가 있는 브랜치 삭제

기본적으로 만들어진 원격 저장소의 이름은 origin이 default값이기 때문에 clone으로 복사해온 저장소의 이름은 origin으로 통일

728x90
반응형