Git

[커널아카데미] 백엔드 12기 1주차 - Git, Github 기본 원리 및 명령어 사용 방법

OptimizerStart 2025. 3. 29. 14:24

이미지 출처: 위키백과

 

 

 

 

Git 이란?

정의 

분산 버전 관리 시스템

- 분산 : 소스코드가 여러 곳에 퍼져있는 형태 

- 버전 관리 : 이전 버전으로 rollback하기 위하 history 관리

 

원리 

내용 기반으로 숫자로 변환(임베딩)해 해시값으로 파일을 관리

  • 내용이란 학생 이름과 성적이 담긴 텍스트 파일 'student_score.txt' 가 있을 때, 'Alice' : 90, 'Bob' : 80의 내용을 의미한다.

git은 파일관리할 때 이름이 같은 파일이어도 파일 내용으로 비교

  • 파일이 1G 일 때 어떻게 비교할것인가? 유사성을 확인
  • 파일내용(텍스트)을 숫자로 바꿔 연관성을 비교
  • GIT의 경우 내용이 같은지만 확인

해시값 및 실제 데이터(내용)들은 .git 폴더의 objects 폴더 내에 압축된 상태로 저장된다. 

.git의 objects 폴더

 

[참고: https://git-scm.com/docs/hash-function-transition 

 

역사 

과거에는 파일들을 파일이름으로 관리

ex.파일 탐색기의 '250329_학습계획.txt', '250328_학습계획.txt'

 

특징

head를 이전 커밋(과거)로 옮기면 그 이후에는 볼 수 없음. ccc.txt가 사라진건 아님.

 

저장 영역 -3

  1. 실제 작업 영역 Working Directory
    • 실제 코드를 작성하고 편집하는 공간
    • 작업 영역에서 mv 명령어로 파일이름을 변경하면 old 파일의 트래킹을 해제해야함. git rm old 파일이름
  2. 스테이징 영역 Staging Area, Index
    • 내가 수정한 파일들 중에 로컬 저장소에 저장되기 전의 임시공간
  3. 로컬 저장소 Local Repository
    • .git 폴더 안에 저장되는 데이터베이스
    • 실제 파일 내용이 아니라 메타데이터와 압축된 파일로 구성됨

 

 

 

용어 정리

HEAD

 

최신 커밋을 가리키는 포인터.

내가 현재 보고 있는 커밋을 가리킴. 옮기면 원하는 버전으로 이동 가능.

HEAD@{숫자} 는 계속 바뀜. 커밋 ID 작성 잘해야함

detached HEAD

브랜치에서 분리된 헤드. 최신버전은 main으로 유지하고 HEAD만 움직이면서 이전 버전을 확인할 수 있음

cf . reset은 브랜치와 HEAD가 같이 움직이는 것.

Branch

어떤 커밋이 최신인지 가리키는 꼬리표 필요.

커밋 흐름이 갈라지는 것(분기)은 브랜치라 하지 않음.

커밋을 만들면 브랜치는 자동으로 마지막 커밋을 가리킴.

 

Tag

고정된 꼬리표. 한번 지정한 커밋을 계속 가리킴. 

HEAD와 반대의 기능.

 

 

명령어

git add *

모든 파일 및 폴더 스테이징 영역으로 올라감

 

git status

git에 의해 파일이 관리 되는지 안되는지 확인가능.

add를 해야 관리(track)시작.

 

touch 파일명.확장자

파일의 내용은 바뀌지 않고 가장 최근에 건들인 시각 출력. 파일이 없으면 생성.

 

git reflog

HEAD가 어디로 이동했는지 이력이 나옴.

커밋ID 혹은 HEAD@{번호} 를 적어도 됨.

 

 

git mv <원본파일이름.확장자> <바뀔이름.확장자>

파일 이름 변경

 

git log —oneline —decorate

현재 작업 중인 브랜치 확인

[스테이징 영역 파일 추가 및 삭제 ]

1. 삭제

git restore —staged 파일이름

스테이징 영역에 있는 파일 제거

 

git reset git restore —staged *

스테이징 영역 모두 비우기

 

git rm —cached 파일이름

스테이징 영역 비우기 및 git 트래킹 해제

cf. git rm 파일이름

파일 삭제 및 git 트래킹 해제

 

2. 추가

git add -u

git이 트래킹하는 커밋한 이력이 있는 파일이 수정사항이 있으면 스테이징 영역으로 올림

 

 

[untracked 된 파일 및 폴더 삭제]

git clean -f

스테이징 영역에 있지 않거나 커밋되지 않는 untracked된 파일들을 한번에 삭제

 

git clean -fd

스테이징 영역에 있지 않거나 커밋되지 않은 untrack 된 폴더 및 파일 한번에 삭제

 

 

[커밋 취소(되돌리기)]

git revert HEAD~N

최신 커밋 내용 이전으로 되돌리기. 되돌아가는거지만 커밋이 사라지는 것은 아님.

HEAD~3을 되돌린다고 최신 반영한 커밋이 사라지진 않음.

 

git revert <revert_commit 해시값>

revert 하기 전으로 되돌아가기. revert 할때마다 커밋이 생기고 내용은 이전 버전으로 되돌아감.

 

 

[이전 상태로 되돌리기]

git reset 커밋ID —옵션 git reset HEAD~n —옵션

-- hard 해당 커밋 파일을 작업 폴더에 반영 (파일 생성 삭제 발생가능)

-- mixed (디폴트) 해당 커밋을 작업 폴더에 저장. 스테이징 영역에 add 하기 직전 상태로 변경

--soft 해당 커밋 파일을 스테이징 영역에 저장

  • HEAD가 가리키는 커밋으로 이동.
  • HEAD~n : HEAD보다 n번 이전 커밋 가르킴

 

git revert HEAD 와 git reset HEAD~N 차이

revert는 작업 디렉터리를 이전 상태로 바꾼것을 반영하고 이전상태로 바꿨다는 새로운 커밋을 생성.

reset은 새로운 커밋을 작성하지 않고 이전 상태로 돌아감.

 

git checkout 커밋ID

브랜치는 유지한채 HEAD만 옮기는 명령어

브랜치의 히스토리는 유지한채 특정 시점의 커밋을 작업 폴더에서 확인할 수 있음

cf. reset 은 브랜치 히스토리 변경가능.

cf. git checkout 브랜치명 

 

[참고]

히스토리

  • 브랜치에 포함된 모든 커밋들의 연결관계
  • 커밋간 연결관계가 (초기 커밋) A → B → C (최신) 일때, 특정 커밋의 파일 상태를 작업 폴더에서 확인가능
  • ex. 커밋ID, 커밋 메세지, 날짜, 작성자

 

[커밋할 때 빼먹은 파일포함 해서 커밋하기]

git reset HEAD~1 —soft

git add 파일.확장자

git commit -m “new Commit”

 

[커밋 메세지 수정] 

git commit --amend

가장 최근 커밋의 이름을 변경할 수 있고 커밋 ID는 무조건 변경됨

최근 커밋의 staging area에 있는 파일이 이전 커밋에 추가된다.

 

git commit —amend -sm 수정된 메세지

이미 커밋한 메세지 수정

 

 

[merge]

목적

새로 개발된것을 포함하기 위해 main과 merge.

 

주의

merge 전에 main으로 브랜치를 변경해야함

더 최신 커밋을 가리키는 브랜치가 이전 커밋을 가리키는 브랜치로 merge 불가

ex. HEAD→ dev, HEAD~1→ main 일 때 (dev)에서 git merge main 불가

 

종류-3

1. 3 way merge

  • main과 dev가 내용이 있으면 커밋을 새로 남김
  • 두 브랜치의 최신 커밋이 부모자식 관계가 아닐 때 사용
  • git 에서 자동처리

 

2. fast forward merge (디폴트)

git merge dev -ff

  • main 꼬리표만 올려주면 됨. 새로운 커밋이 생기지 않음. 
  • git 에서 자동처리

 

3. no fast forward merge

git merge dev —no-ff

  • main과 dev를 합치는 커밋을 새로 생성. 내용이 같더라도 새로운 커밋 생성.
  • main 브랜치가 dev 브랜치의 작업을 다 반영했으므로, main과 dev를 merge 할 필요 없고 dev 브랜치는 계속 작업하며넛 커밋하면 됨.

 

merge 취소 명령어 

git merge —abort

merge 할 때 충돌이 발생하면 merge 취소. 이미 완료된 merge에 대해선 취소 불가능한 명령어.

git reset 커밋ID —옵션으로 이미 완료된 merge 이전 상태로 되돌아갈 수 있음

cf . git reset —merge 

 

 

[브랜치 생성 , 변경, 삭제]

 

1. 생성

git branch 브랜치명

브랜치를 새로 생성. 작업 폴더 및 HEAD가 변경되지 않음.

 

2. 변경

git checkout 브랜치명

지정 브랜치의 최신 상태를 작업 폴더에 업데이트하고 HEAD도 해당 브랜치를 가리킴.

작업 디렉토리는 해당 브랜치가 가리키는 커밋의 상태로 업데이트되고, HEAD 역시 그 커밋(혹은 브랜치)을 가리키게 됨.

cf. git checkout 커밋ID  detached HEAD 상태 

 

git checkout -b 브랜치명

브랜치 생성 후 전환

 

3. 삭제

git branch -d 브랜치명

임시로 생성한 브랜치 삭제

 

4. 그 외 

git branch -v

각 브랜치가 가리키는 커밋ID와 메세지를 보여줌

 

git branch —merged

HEAD가 가리키는 브랜치에 병합된 브랜치 목록 보여줌

 

git branch —no-merged

아직 브랜치에 병합되지 않은 브랜치 목록 보여줌

 

 

1주차 회고 

Keyword 

# 학습 몰입 시간 늘리기 위한 노력

부트캠프가 오전 10시부터 오후 7시까지 장시간 동안 앉아서 학습을 진행하지만, 그 시간이 온전히 집중했다고 할 수 없다. 그래서 강의를 들을 때 최대한 암기 및 이해를 위해 실습도 병행하고 궁금증이 들 때 넘어가지 않고 남궁성 강사님께 질문을 하면서 내용을 정리해 나갔다. 

 

# 아는 것을 출력할 수 있도록 반복하기

부트캠프를 듣기 전에도 "객체 지향 개념이 뭐야?" 라고 했을 때, 어딘가 정리해 둔 문장을 대답할 수 있지만 정확히 이해했다고 할 수 없었다. 자바의 정석 기초편 강의 들으면서 정의와 예시를 간단하고 명확히 설명해주셔서 지금은 툭치면 말할 수 있다.  "기존 프로그래밍 언어에 규칙 4가지 (캡슐화, 상속, 추상화, 다형성)을 추가한 것" 이라고 말이다.

강사님이 어떤 개념의 정의를 간단하게 출력하는 것을 중요시하시는 부분에 깊이 공감해서 제공해주신 기초편 책의 목차를 보고 정의를 적어나가면서 복습을 하니 효과가 있었다. 

 

# 매일 회고를 통해 목표 세우는 방법 학습

전에는 목표를 세워둔 후 달성하지 못하면 소소한 실패감을 느꼈었다. 1주차 동안 셀프 체크를 통해 내가 '주말에 시간을 내서 해야하는 해야할 것'과 '강의장에서 할 수 있는 해야할 것'을 구분하지 못해 목표 달성률이 낮았다. 졸업 프로젝트를 위한 개별 공부는 강의장에서 하는 것이 아니라 주말에 따로 시간을 내서 해야 진도가 나가는데 빨리 처리하고 싶은 마음 때문에 매일 TODO에 적어놓고 처리하지 못해 소소한 실패감을 느꼈다. 앞으로는 이를 구분해 목표 달성률을 높이고 매일 매일 성취감을 느껴보려 한다.