[커널아카데미] 백엔드 12기 1주차 - Git, Github 기본 원리 및 명령어 사용 방법
Git 이란?
정의
분산 버전 관리 시스템
- 분산 : 소스코드가 여러 곳에 퍼져있는 형태
- 버전 관리 : 이전 버전으로 rollback하기 위하 history 관리
원리
내용 기반으로 숫자로 변환(임베딩)해 해시값으로 파일을 관리
- 내용이란 학생 이름과 성적이 담긴 텍스트 파일 'student_score.txt' 가 있을 때, 'Alice' : 90, 'Bob' : 80의 내용을 의미한다.
git은 파일관리할 때 이름이 같은 파일이어도 파일 내용으로 비교
- 파일이 1G 일 때 어떻게 비교할것인가? 유사성을 확인
- 파일내용(텍스트)을 숫자로 바꿔 연관성을 비교
- GIT의 경우 내용이 같은지만 확인
해시값 및 실제 데이터(내용)들은 .git 폴더의 objects 폴더 내에 압축된 상태로 저장된다.
[참고: https://git-scm.com/docs/hash-function-transition ]
역사
과거에는 파일들을 파일이름으로 관리
ex.파일 탐색기의 '250329_학습계획.txt', '250328_학습계획.txt'
특징
head를 이전 커밋(과거)로 옮기면 그 이후에는 볼 수 없음. ccc.txt가 사라진건 아님.
저장 영역 -3
- 실제 작업 영역 Working Directory
- 실제 코드를 작성하고 편집하는 공간
- 작업 영역에서 mv 명령어로 파일이름을 변경하면 old 파일의 트래킹을 해제해야함. git rm old 파일이름
- 스테이징 영역 Staging Area, Index
- 내가 수정한 파일들 중에 로컬 저장소에 저장되기 전의 임시공간
- 로컬 저장소 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에 적어놓고 처리하지 못해 소소한 실패감을 느꼈다. 앞으로는 이를 구분해 목표 달성률을 높이고 매일 매일 성취감을 느껴보려 한다.