일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 항해플러스
- 파이썬 map 함수
- 파이썬 int()
- 백준
- 99일지
- 파이썬 |
- print sep
- EnvCommandError
- 항해99
- 주니어개발자역량강화
- cp949
- MomentumParameters
- 파이썬 sep
- Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
- 파이썬 클래스
- Til
- 99클럽
- fatal:not a git repository
- 파이썬
- not a git repository
- 개발자스터디
- 10430번
- 항해
- print("""
- 코딩부트캠프후기
- vscode cp949
- 99클럽 #99일지 #코딩테스트 #개발자스터디 #항해 #til
- 코딩테스트
- 주니어개발자멘토링
- 개발자사이드프로젝트
- Today
- Total
선발대
[코드잇] Git으로 배우는 버전 관리 (완강) 본문
수강일자
- 2022년 7월 27일 수요일 ~ 2022년 7월 29일 금요일 (3일)
수강후기
- 혼자서 이것저것 뚝딱 만들 때는 상관없는데 확실히 협업할 때 Git 중요성을 절실히 느낀다.
- 예전에 스파르타코딩클럽 Git 강의를 들었을 때는 소스트리 GUI 환경으로 해서 개념만 짚고 넘어갔었다.
- CLI 환경에서는 사실 push, pull, branch, merge 등만 사용했었다. (맨날 쓰던 것들)
- 이번에 원티드 프리온보딩에 참여하면서 Git flow가 꼬여있을 때 구글링이나 다른 팀원 분 도움으로 긴급처치는 했지만
- 제대로 된 개념을 익히지 않을 채로 적용하다 보니 따로 공부가 필요했다.
- 그래서 듣게 된 Git 강의였다. 총 강의 시간은 3시간 정도였는데, 정리하고 하다 보니 3일이나 걸렸다.
- 아마 주말에 들었다면 반나절만에 끝낼 수 있었을 듯하다.
- 확실히 Git을 실제로 써보고 강의를 들어보니 훨씬 이해가 잘됐다. Git의 흐름을 알 수 있었다.
- fetch, blame, reflog, cherry-pick은 프로젝트 하면서 한 번도 안 써봤는데, 나중에 실무에서 유용할 것 같다.
- 이제 Git 사용할 때 뚝딱거리지 말기~~
토픽 1. Git
1-1. Git 시작하기
01. Git이란?
- Git: 버전 관리, 동시 협업을 가능하게 해주는 툴
- 버전 관리: 파일의 변화를 시간에 따라서 기록했다가, 나중에 특정 시점에 버전을 꺼내올 수 있는 시스템.
- 버전관리 장점 1: 최종본을 만들기까지 어떤 과정을 거쳤는지 확인할 수 있음.
- 버전관리 장점 2: 잘못된 부분이 생기면 이전에 만든 버전의 과제로 돌아갈 수 있음.
02. [설명] Git의 역사
- Git 만든 사람: 리누스 토발즈(운영체제 리눅스 만든 사람)
- 리눅스 만든 뒤 BitKeeper이라는 툴로 버전 관리하다가 사이 안 좋아져서 버전관리 프로그램 하나 만듦.
03. GitHub란?
- 버전 관리, 동시협업툴
- 백업본 저장 가능: 작업 내용을 자신의 컴퓨터가 아니라 다른 곳에도 저장 가능하게 함.
- Git: 버전 관리하는 프로그램 (소프트웨어 자체)
- Github: Git으로 관리하는 프로젝트를 올려둘 수 있는 사이트
- 외부에 컴퓨터를 대신 만들어주는 서비스. 즉 원격 저장소를 대신 제공해주는 서비스임.
- 정리하면, Git으로 관리하는 프로젝트의 복사본을 저장하는 서버를 제공해주고,
- 협업을 위한 편의 기능을 제공해주는 서비스.
04. [설명] Git 설치하기(Mac 사용자)
- 패스
05. [설명] Git 설치하기(Window 사용자)
- 1. Git 홈페이지에서 'Download 2.26.1 for Windows' 버튼 클릭
- 2. Git 설치 프로그램 실행 후, Git Bash 항목에 체크 후 설치.
06. [설명] Sublime Text 설치하기(Mac 사용자)
- 패스
07. [설명] Sublime Text 설치하기(Window 사용자)
- 1. Sublime Text 설치 페이지에서 DOWNLOAD FOR WINDOWS 클릭
- 2. 설치 프로그램 실행
08. [퀴즈] Git 시작하기 퀴즈
- 통과~
1-2. Git 써보기
01. repository와 commit
- 프로젝트 디렉토리: 작업하는 디렉토리
- 레포지토리: 프로젝트 디렉토리 안의 .git 폴더 의미. 커밋이 저장되는 곳
- 커밋: 프로젝트 디렉토리의 특정 모습을 하나의 버전으로 남기는 행위, 결과물
02. repository 만들기
mkdir Mathtool # 프로젝트 디렉토리 생성
cd Mathtool/
git init # 레포지토리 생성
ls -al
cd .git
ls -al
03. 첫 commit 해보기
- 제일 첫 커밋은 제일 먼저 사용자 이름과 이메일을 등록해줘야 함.
- git config user.name "codeit"
- git config user.email "code@codeit.kr"
- git add .
- git commit -m "커밋메시지"
04. [설명] calculator.py 파일에 작성했던 코드 설명
- 패스~
05. [설명] Git의 3가지 작업 영역
- working directory: 작업을 하는 프로젝트 디렉토리
- staging area: git add 한 파일들이 존재하는 영역. 여기 파일들만 커밋에 반영됨.
- repository: working directory의 변경 이력들이 저장되어 있는 영역. 스냅샷처럼 커밋들이 저장됨.
06. [퀴즈] Git 써보기 퀴즈 1
- working directory 안에 있는 .git 디렉토리가 repository임. 커밋이 저장되는 장소.
07. git add 더 자세히 알아보기
- git status: 깃이 인식하고 있는 프로젝트 디렉토리의 현재 상태를 보여줌
- 디렉토리 add 하면 디렉토리 안의 모든 파일이 스테이징 됨.
08. [설명] Git이 보는 파일의 4가지 상태
- Git 파일은 2가지 상태를 가진다: Untracked (git add X), Tracked
- Tracked 상태는 3가지 상태로 나눌 수 있음: Staged, Unmodified, Modified
09. git add 취소하기
- git reset [파일명]: staging area에서 파일 제거하기
- 변경된 새 모습은 그대로 working directory에 남아있음
10. [설명] 특정 git 커맨드의 사용법을 알고 싶다면?
- git help [알고 싶은 커맨드 이름]
- man git-[알고 싶은 커맨드 이름]
11. [퀴즈] Git 써보기 퀴즈 2
- git status: 현재 Git이 인식하고 있는 프로젝트 상태를 보여줌
- git reset [파일명]: staging area에서 내리기
12. [설명] Git 써보기 정리 노트
- git init: 현재 디렉토리를 Git이 관리하는 프로젝트 디렉토리(working directory)로 설정.
- 안에 레포지토리(.git 디렉토리) 생성
- git config user.name 'codeit': 현재 사용자 아이디를 'codeit'으로 설정 (커밋할 때 필요한 정보)
- git config user.email 'teacher@codeit.kr': 현재 사용자 이메일 주소를 'teacher@codeit.kr'로 설정
- git add [파일 이름]: 수정사항 있는 특정 파일을 staging area에 올리기
- git add [디렉토리]: 해당 디렉토리 내에서 수정사항이 있는 모든 파일들을 staging area에 올리기
- git add . : working directory 내의 수정사항이 있는 모든 파일들을 staging area에 올리기
- git reset [파일 이름]: staging area에 올렸던 파일 다시 내리기
- git status: Git이 현재 인식하고 있는 프로젝트 관련 내용들 출력
- git commit -m "커밋메시지": 현재 staging area에 있는 것들 커밋으로 남기기
- git help [커맨드 이름]: 사용법이 궁금한 Git 커맨드의 공식 매뉴얼 내용 출력
1-3. GitHub 시작하기
01. GitHub 계정과 Remote Repository 만들기
- 로컬 레포지토리에는 버전별 프로젝트 모습, 버전별 변경 내역이 담겨있음.
- 깃허브 회원가입 및 레포지토리 생성
02. Local Repository의 내용을 Remote Repository로..
- 로컬 레포지토리를 만들고 커밋한 후에 깃허브에 업로드 하기
git init
git add README.md
git commit -m "first commit"
git remote add origin [깃허브 레포 주소]
git push -u origin main
- 이미 생성된 로컬 레포지토리를 깃허브에 업로드 하기
git remote add origin [깃허브 레포 주소]
git push -u origin main
03. Local Repository에서 바뀐 내용을 Remote Repository
- git push: 로컬 레포지토리에서 변경된 내용을 리모트 레포에 반영함.
04. Remote Repository에서 바뀐 내용을
- git pull: 리모트 레포지토리에서 변경된 내용을 로컬 레포에 반영함.
05. [퀴즈] GitHub 퀴즈 1
- 로컬 레포지토리 내용을 처음으로 Github 리모트 레포로 보낼 때
- git push --set-upstream origin main
- 위 커맨드를 한번 실행하고 난 이후에 또 로컬 레포 내용을 Github 리모트 레포로 보낼 때
- git push
06. [설명] 아무나 git push를 할 수 있는 건 아닙니다.
- settings > manage access 에서 사용자 초대함
- 원칙적으로 자신의 리모트 레포지토리에는 자신만 git push 가능함
- 다른 사용자도 git push 할 수 있게 하려면 해당 리모트 레포지토리의 collaborator로 지정
07. 다른 프로젝트 가져오기
- git clone [깃허브 레포 주소]: 깃허브 프로젝트의 레포지토리를 그대로 복제함
08. [설명] 오픈 소스 프로젝트란?
- 오픈소스 프로젝트(open source project): 소스코드가 공개되어 있는 프로젝트
- 1983년 리차드 스톨만: 자유 소프트웨어재단 설립
- 소스 코드가 공개되고 누구나 코드를 자유롭게 가져다 사용하고 수정할 수 있어야 한다는 정신.
- 이어서 오픈소스 소프트웨어 명칭 제시됨.
- 오픈소스에도 여러 종류의 라이선스가 있어서 제약도 존재함.
- 오픈소스 라이센스 참고 링크
09. [설명] README.md를 더 예쁘게
- 마크다운: 간단한 텍스트만으로 어떤 표시를 해두면 자동으로 HTML 태그로 변환되도록 약속한 문법(.md)
10. [퀴즈] GitHub 퀴즈 2
- 통과~
11. [설명] GitHub 시작하기 정리 노트
- git push -u origin master: 로컬 레포지토리 내용을 처음으로 리모트 레포지토리에 올릴 때 사용.
- git push: 로컬 레포지토리의 내용을 리모트 레포지토리에 보내기
- git pull: 리모트 레포지토리의 내용을 로컬 레포지토리로 가져오기
- git clone [프로젝트의 Github 상 주소]: Github에 있는 프로젝트를 내 컴퓨터로 가져오기
1-4. 커밋 다루기
01. 커밋 히스토리 살펴보기
- 커밋 히스토리: 지금까지 한 커밋 기록
- git log: 커밋 히스토리 확인 가능
- 커밋 아이디 (=커밋 해시): 앞의 4자리 정도만 쳐줘도 확인 가능 (중복 있으면 안 됨)
- 커밋 히스토리 깔끔하게 보기: git log --pretty=oneline
- 커밋 히스토리 자세하게 보기: git show [커밋 아이디]
02. m 옵션 없이도 커밋 메시지를 남길 수 있어요
- git commit 만 입력하면 각 텍스터 에디터가 나와서 커밋메시지 길게 작성할 수 있음.
- 메시지 입력하고 상세 내용은 한 줄 엔터 치고 입력함.
- 다 작성했다면 저장은 esc 누르고 :wq + enter 입력하면 됨.
03. 최신 커밋 수정하기
- git commit --amend: 최신 커밋을 수정해서 다시 새로운 커밋으로 만들기
04. [설명] 커밋 생성, 커밋 메시지 작성 가이드라인
커밋 메시지 작성 가이드라인
- (1) 커밋메시지 제목(title)과 상세설명(body) 사이에는 한 줄 비워두기
- (2) 커밋메시지 제목 뒤에 온점(.) 붙이지 말기
- (3) 커밋메시지 제목 첫 번째 알파벳은 대문자로 작성하기
- (4) 커밋메시지 제목은 명령조로 작성하기 (예: Fix it (O), Fixed it (X))
- (5) 커밋메시지 상세 내용은 이런 내용이 들어가면 좋음.
- 예: 왜 커밋을 했는지, 어떤 문제가 있었고, 적용한 해결책이 어떤 효과를 가지는지
- (6) 다른 사람들이 자신의 코드를 바로 이해할 수 있다고 가정하지 말고 최대한 친절하게 작성하기
커밋할 때 알아야 할 가이드라인
- (1) 하나의 커밋에는 하나의 수정사항, 하나의 이슈를 해결한 내용만 남기기
- (2) 현재 프로젝트 디렉토리 상태가 내부 전체 코드 실행했을 대 에러 발생하지 않는 경우만 커밋하기
05. [설명] 긴 커맨드에 alias 설정하기
- Git에는 길이가 긴 커맨드 전체에 별명을 붙여서 사용할 수 있도록 하는 기능이 있음.
- 이때의 별명을 alias라고 하고, 별명 붙이는 행위를 aliasing이라고 함.
- git log --pretty=oneline → git history
- git config alias.history 'log --pretty=oneline'
- .gitconfig 파일 위치: Window에서는 C:\Users\사용자\.gitconfig
06. 두 커밋 간의 차이 보기
- git diff [이전 커밋 아이디] [이후 커밋 아이디]
07. [퀴즈] 커밋 퀴즈 1
- 통과~
08. HEAD의 의미
- HEAD: 보통 가장 최근에 한 커밋을 가리킴
- HEAD가 가리키는 커밋에 따라 working directory 구성됨.
09. 이전 커밋으로 git reset 하기
- git reset --hard [원하는 커밋아이디]: 원하는 곳으로 워킹디렉토리 상태가 변함
- HEAD가 과거의 커밋을 가리키게 할 수 있음
- working directory 내용도 과거 커밋 모습으로 돌아감
- 한 시점 이후의 커밋이 마음에 안 들 때 사용하면 된다.
10. [설명] git reset의 옵션을 배우기 전에 확실히 알아야 할 부분
- 1. git reset을 쓸 때 --hard는 뭐였을까?
- git reset에는 3가지 옵션이 있음 (--soft, --hard, --mixed)
- git reset에서 어느 옵션을 쓰든 HEAD가 과거 커밋을 가리키게 되는 결과는 동일함
- working directory 내부도 과거 커밋 모습처럼 변경되는 건 --hard 옵션을 사용했기 때문임.
- 2. staging area에 있던 것들은 커밋하고 나면 어떻게 될까?
- git add를 할 때마다 새로운 파일이 추가되거나, 원래 있던 파일이 새로운 버전으로 교체될 뿐임.
- staging area에 있던 것들은 커밋을 하더라도 그것과 상관없이 계속 남아있음. 이걸 기억하기!
11. git reset의 3가지 옵션 1
git reset [옵션] eea5 | working directory |
staging area |
repository |
--soft | 안 바뀜 | 안 바뀜 | HEAD가 eea5 커밋 가리킴 |
--mixed | 안 바뀜 | eea5 커밋처럼 변경 | HEAD가 eea5 커밋 가리킴 |
--hard | eea5 커밋처럼 변경 | eea5 커밋처럼 변경 | HEAD가 eea5 커밋 가리킴 |
- --hard: 커밋 이후로 한 작업이 전부 사라짐. 권장되지 않음. (나중에 reflog로 복구될 수도)
- --mixed: 워킹 디렉토리가 가장 최근에 작업한 그대로임
12. git reset의 3가지 옵션 2
- 테스트 해봤음.
- 다시 복구하려면 git pull 하면 됨. (리모트 레포에서 받아온다.)
13. [설명] HEAD를 기준으로 git reset 하기
git reset [옵션] [커밋아이디]
- git reset [옵션] HEAD^ : HEAD가 가리키고 있는 커밋의 바로 이전 커밋 나타냄
- git reset [옵션] HEAD~2 : HEAD가 가리키고 있는 커밋보다 2단계 전 커밋 나타냄
- git reset [옵션] HEAD~x : HEAD가 가리키고 있는 커밋보다 x단계 전 커밋 나타냄
14. [설명] 커밋에 tag 달기
git tag [태그 이름] [커밋 아이디]
- 예시: git tag Version_1 84ab
- git tag : 프로젝트 디렉토리 내의 모든 태그 조회하기
- git show [태그 이름] : 각 태그와 연결된 커밋 조회하기
- 의미가 중요한 커밋들은 태그를 달아주면 나중에 프로젝트 이력 파악할 때 도움된다.
15. [퀴즈] 커밋 퀴즈 2
- 통과~
16. [설명] 커밋 다루기 정리 노트
- git log: 커밋 히스토리를 출력
- git log --pretty=oneline: --pretty 옵션을 쓰면 커밋 히스토리를 다양한 방식으로 출력
- git show [커밋 아이디]: 특정 커밋에서 어떤 변경사항이 있었는지 확인
- git commit --amend: 최신 커밋을 다시 수정해서 새로운 커밋으로 만듦
- git config alias.[별명] [커맨드]: 길이가 긴 커맨드에 별명 붙이기
- git diff [커밋 A 아이디] [커밋 B 아이디]: 두 커밋 간의 차이 비교
- git reset [옵션] [커밋 아이디]: 옵션에 따라 하는 작업이 달라짐
- (1) HEAD가 특정 커밋을 가리키도록 이동시킴 (--soft)
- (2) staging area도 특정 커밋처럼 리셋 (--mixed)
- (3) working directory도 특정 커밋처럼 리셋 (--hard)
- git tag [태그 이름] [커밋 아이디]: 특정 커밋에 태그 붙임
1-5. 브랜치 사용하기
01. 브랜치란?
- main: 레포지토리를 만들고 커밋을 하면 자동으로 생기는 기본 브랜치
- git branch [브랜치명]: 브랜치 생성하기
- git checkout [브랜치명]: 브랜치 이동하기
02. 브랜치 다뤄보기
- git branch: 모든 브랜치 조회하기
- git branch -d [브랜치명]: 브랜치 삭제하기
- git checkout -b [브랜치명]: 브랜치 만들고 바로 이동하기
- git switch [브랜치명]: 브랜치 이동하기
03. [퀴즈] 브랜치 퀴즈 1
- 통과~
04. 브랜치 merge 하기
- git merge [브랜치명]: 현재 있는 브랜치에 병합함
- merge commit 편집기에서 새로 입력할 수 있음.
05. merge 할 때 conflict가 날 수도 있어요!
Conflict 해결방법
- 1. 컨플릭트가 발생한 파일 열기
- 2. 머지 결과가 되었으면 하는 모습대로 코드 수정
- 3. 커밋
06. [설명] conflict가 났을 때 merge 자체를 취소해도 됩니다
- git merge --abort: 머지를 시도하기 이전의 상태로 돌아가려면 그냥 머지 자체를 취소함
07. [설명] 여러 파일에서 conflict가 났을 때는?
- 모든 파일의 conflict를 다 해결하고, git add . 커맨드로 한 번에 staging area에 올리고 커밋함.
08. [퀴즈] 브랜치 퀴즈 2
- 통과~
09. [설명] Remote Repository의 브랜치는 이렇게 보입니다!
(1) Origin 이란?
- git remote add origin [리모트 레포지토리 주소]: [리모트 레포지토리]를 origin이라는 이름으로 등록함
(2) Remote Repository에 있는 브랜치
- git push -u origin main: 현재 로컬 레포 main 브랜치의 내용을 origin 이라는 리모트 레포로 보낸다.
- 같은 이름의 브랜치로 전송하게 되는데, 만약 origin 리모트 레포에 main 브랜치 없으면 새로 생성하고 푸시.
- -u : --set-upstream 옵션의 약자. 로컬 레포의 main 브랜치가 origin main 브랜치를 tracking 하는 것으로 설정.
- tracking: 로컬 레포의 한 브랜치가 리모트 레포의 한 브랜치와 연결되어 계속 바라보는 상태라고 생각하면 됨.
- tracking connection이 한번 설정되면 자동으로 main 브랜치에 있을 때 main으로 git push, git pull 이 실행됨.
- 이 옵션 안 주면 나중에 git push origin main:main 이런 식으로 지정해야 함.
(3) origin / main 의 의미
- (main): 로컬 레포지토리의 main 브랜치
- (origin/main): 리모트 레포지토리의 main 브랜치
10. master 브랜치와 premium 브랜치 둘 다 push 하기
- git checkout premium
- git push --set-upstream origin premium
- 이렇게 하면 리모트 레포에도 premium 브랜치 생성됨
11. HEAD와 브랜치의 관계
- HEAD: 어떤 커밋 하나를 가리킴. 워킹 디렉토리 내용이 변경됨.
- branch: 코드를 관리하는 하나의 코드 흐름. 얘도 어떤 커밋을 가리키는 존재(포인터)라고 할 수 있음.
- HEAD는 직접적으로 커밋을 가리키는 게 아니라, 브랜치를 통해 가리킨다.
- Merge: 헤드가 가리키던 커밋에 다른 브랜치가 가리키던 커밋을 합쳐서 새로운 커밋을 만드는 작업
12. [설명] git reset의 비밀
- 사실 브랜치(branch)는 커밋을 가리키는 존재 (포인트)
- HEAD는 이런 브랜치를 통해 커밋을 간접적으로 가리키는 존재 (포인트)
git reset
- 1. HEAD는 여전히 같은 브랜치를 가리킴
- 2. HEAD가 가리키는 브랜치가 다른 특정 커밋을 가리킴
- 3. 이 때문에 결국 HEAD가 간접적으로 가리키던 커밋도 변경됨
git reset을 한다고 그 이후의 커밋이 사라지는 건 아닙니다.
- git reset은 꼭 과거의 커밋으로만 할 수 있는 것은 아님.
- 과거의 커밋으로 git reset를 한다고 그 이후가 커밋들이 삭제되는 게 절대 아님.
- 현재 HEAD가 가리키고 있는 커밋 이후의 커밋으로도 리셋할 수 있음.
13. [설명] git reset과 git checkout의 차이점(심화)
이전 노트의 내용(git reset) 복습
- HEAD는 보통 직접 커밋을 가리키는 게 아니라 브랜치를 통해 간접적으로 커밋을 가리킴
git checkout이 하는 일
- HEAD가 커밋을 직접적으로 가리키게 하기
- Detached HEAD: 브랜치를 통해서 커밋을 가리키는 게 아니라 본인이 직접 커밋을 가리키는 상태의 HEAD
- HEAD가 특정 커밋을 직접 가리키게 하는 이유: 과거의 특정 커밋에서 새로운 브랜치 만들 때
- git branch premium
- 1. 위의 명령어를 하면 premium이라는 브랜치가 새로 생성됨
- 2. premium 브랜치는 HEAD가 가리키던 커밋을 똑같이 가리킴
git checkout 커맨드
- 1. HEAD가 커밋을 직접적으로 가리키게 할 수 있음
- 2. 커밋 아이디나 브랜치 이름을 줘서 브랜치를 직접 가리키게 만들 수 있음
- git checkout premium 하게 되면 HEAD가 브랜치를 가리키게 됨
git checkout master
- = master 브랜치로 이동하가
- = HEAD가 master 브랜치를 가리키도록 하라
- = HEAD가 master 브랜치가 가리키던 커밋을 간접적으로 가리키게 됨으로써
- = working directory의 내부도 그 커밋에 맞게 변함으로써
- = master 브랜치로 이동한 것을 사용자는 실감하게 됨
git reset vs git checkout
git reset | git checkout |
HEAD가 가리키던 브랜치가 다른 커밋을 가리키도록 함 | HEAD 자체가 다른 커밋이나 브랜치를 가리키도록 함 |
HEAD도 결국 간접적으로 다른 커밋을 가리키게 되는 효과 | 브랜치를 통하지 않고,커밋을 직접적으로 가리키는 HEAD를 Detached HEAD라고 함 |
14. [설명] 새로운 커밋을 만들지 않는 merge도 있습니다(심화)
- 머지 커밋(merge commit): 머지를 통해 생겨난 커밋
- git merge premium
- 머지를 한다고 해서 항상 새로운 커밋이 생기는 것은 아님
- 머지에는 2가지 종류가 있음. Fast-forward, 3 way merge
Fast-forward 머지
- 커밋 히스토리에서 같은 선상에 있는 브랜치를 머지할 때 발생함
3-way-merge
- (1)번 : 두 갈래로 갈라지기 전 공통 조상이 되는 커밋
- (2)번 : 한 브랜치가 가리키는 커밋
- (3)번 : 다른 브랜치가 가리키는 커밋
- base에서 변화가 발생한 것을 우선 채택함
- 두 브랜치에서 둘 다 변화가 일어났을 때는 Conflict를 발생시켜 사용자가 스스로 선택하게 함
15. [퀴즈] 브랜치 퀴즈 3
- 통과~
16. [설명] 브랜치 정리 노트
- git branch [새 브랜치명] : 새로운 브랜치 생성
- git checkout -b [새 브랜치명] : 새로운 브랜치 생성하고 그 브랜치로 바로 이동
- git branch -d [기존 브랜치명] : 브랜치 삭제
- git checkout [기존 브랜치명] : 브랜치 이동
- git merge [기존 브랜치명] : 현재 브랜치에 다른 브랜치 머지
- git merge --abort : 머지하다가 conflict 발생했을 때, 일단 머지 작업 취소하고 이전 상태로 돌아감
1-6. Git 협업하기
01. [설명] 지금부터 배울 Git 실무 지식
- 앞으로 실제로 개발 환경에서 Git을 쓸 때 자주 만나는 상황과 그 상황에서 써야 할 커맨드를 배울 것임.
02. git push 전에 git pull을 해야 하는 경우가 많을 겁니다
- 로컬 레포지토리와 리모트 레포지토리 내용이 다를 경우에는 push 전에 git pull 부터 해야 함
- conflict 나면 수정하고 다시 커밋해준다.
- 리모트 레포지토리를 가져와서 로컬 레포지토리에 반영하는 것과 동일함
- 브랜치를 가져온다는 것은 브랜치가 가리키고 있는 커밋 이전에 이루어진 모든 커밋들을 가져온다는 의미
03. git pull 말고 git fetch도 있어요
- git fetch: 리모트 레포지토리에 있는 브랜치 내용을 일단 가져와서 살펴온 후에 머지하고 싶을 때 사용
- 리모트 레포지토리에서 가져온 브랜치 내용을 머지하기 전에 점검해야 할 필요가 있을 때 사용
- 또는 리모트 레포지토리에 있는 브랜치 내용과 내가 작성한 코드를 비교해서 잘못된 부분 검토할 때 사용
- git pull = git merge + git fetch
- git fetch
- git diff premium origin/premium
- git merge origin/premium
- 리모트 레포지토리 브랜치에 문제가 있을 때 해결방법
- 1. 잘못된 코드를 추가한 개발자에게 함수를 지우고 다시 리모트 레포지토리에 올려달라고 하기
- 2. 잘못된 부분을 알아서 해결하고 다시 git push 하기
04. 이 코드는 누가 작성했을까?
- git blame: 어떤 파일의 특정 코드를 누가 작성했는지 찾아내기 위한 커맨드
- 해당 파일 내용의 한줄한줄이 어떤 커밋에 의해 생겨났는지 알 수 있음
- 즉 어떤 커밋인지 안다는 것은 특정 코드를 누가 작성했는지도 알 수 있다는 것임
- git blame caculator.py
- git show [커밋아이디] : 작성자, 내용 확인 가능
05. 이미 Remote Repository에 올라간 커밋을 취소해야 한다면?
- git revert [돌리고 싶은 커밋아이디] : 내용 수정하고 다시 커밋, 푸시하면 된다.
- 최신 커밋에서 한 작업을 되돌리고 다시 커밋을 해주는 커맨드임
- 로컬 레포지토리가 리모트 레포지토리보다 더 앞서있다면 push 해도 문제 X. (git reset이 어려운 이유)
- git revert 하면 Revert "커밋메시지" 이런 커밋이 새로 생긴다. (이전 상태를 가진 채로)
- git commit --amend : 커밋메시지만 수정
- git revert : 커밋을 수정하는 새로운 커밋 추가
- git reset : 이전 커밋으로 이동 (로컬 레포지토리에서만 작업한다면 이거 써도 괜찮음)
06. 여러 커밋 취소하기
- git revert [시작하는 커밋 아이디 이전]..[마지막 커밋 아이디] : 범위 지정해주고 push 하면 끝
07. [퀴즈] Git 실전 퀴즈 1
- 통과~
08. [설명] Git 협업하기 정리 노트
- git fetch : 로컬 레포에서 현재 HEAD가 가리키는 브랜치 업스트림 브랜치로부터 최신 커밋 가져옴
- (가져오기만 한다는 점에서 가져와서 머지까지 하는 git pull과는 차이가 있음)
- git blame : 특정 파일의 내용 한줄한줄이 어떤 커밋에 의해 생긴 것인지 출력
- git revert : 특정 커밋에서 이루어진 작업을 되돌리는(취소하는) 커밋을 새로 생성
1-7. Git 자유자재로 활용하기
01. git reset을 하고 나서 돌아오려면?
- reset을 해도 그 이후의 커밋들이 삭제되는 것은 아님
- git reflog : reference log의 줄임말. 헤드가 이때까지 가리켜왔던 커밋들의 id 확인하기
- HEAD 위치가 변경될 때마다 한 줄씩 생성됨
- 예시: git reset --hard HEAD@{1}
02. 커밋 히스토리를 보는 다양한 방법
- git log --pretty=oneline --all
- git log --pretty=oneline --all --graph
03. [설명] Git GUI 환경에서 사용할 수 있게 해주는 프로그램
- CLI(Command Line Interface) 환경에서 Git을 사용했음
- GUI(Graphic User Interface)
- 소스트리(Source Tree)
04. [퀴즈] Git 실전 퀴즈 2
- 통과~
05. 깔끔한 커밋 히스토리를 원할 땐 git merge 대신 git rebase
- 테스트 브랜치에 작성한 기능을 프리미엄 브랜치에도 추가하고 싶다면?
- 프리미엄 브랜치로 이동해서 git merge test 한 뒤에 커밋하면 됨 (A+B, 새로운 커밋 생성)
- 이 방법 외에도 git rebase를 통해 진행할 수 있음.
- 프리미엄 브랜치에서 git rebase test 하면 된다.
- 프리미엄 브랜치가 테스트 브랜치를 거쳐온 것처럼 커밋 히스토리 구조 자체가 변경됨
- git rebase test: 프리미엄 브랜치의 베이스를 테스트 브랜치로 재지정함
- git rebase --continue: conflict가 발생해서 제대로 진행되지 못한 리베이스를 계속 진행함
merge와 rebase 차이
- 1. rebase는 새로운 커밋을 만들지 않음
- 2. rebase로 만들어진 커밋 히스토리는 merge로 만들어진 커밋 히스토리보다 좀 더 깔끔함
- 사실 merge, rebase 결과물은 동일함
- 커밋 히스토리를 깔끔하게 만들기 위해 rebase를 사용하는 것임.
- merge: 두 브랜치를 합쳤다는 정보가 커밋 히스토리에 꼭 남아야 하는 경우 사용
- rebase: 커밋 히스토리를 깔끔하게 유지하는 게 더 중요한 경우 사용
06. 작업 내용 임시 저장하기
- git stash : working directory에서 작업하던 내용을 깃이 따로 보관함 (이때 보관하는 장소를 stack 이라고 함)
- stack : 어떤 데이터를 저장하는 구조
- 최근 커밋 이후 작업했던 내용은 모두 스택에 옮겨지고 working directory 내부는 다시 최근 커밋 상태로 초기화.
- 어떤 브랜치에서 작업을 아직 커밋하지 않았는데 다른 브랜치로 가야 하는 상황에서 작업 내용을 임시로 저장할 때.
- 로컬 레포지토리(.git)에서 관리됨. push를 통해 공유할 수 없음
- git stash list : stack에 있는 작업한 내용들을 확인할 수 있음
- git stash apply : 지금 stack에 있는 내용을 working directory로 가져와서 적용함.
07. 잘못된 브랜치에서 작업하고 있었다면?
- 프리미엄 브랜치에서 해야 했는데 마스터 브랜치에서 작업했었다면?
- git stash 로 저장한 다음, 프리미엄 브랜치로 넘어가서 git stash apply stash@{0} 적용함.
- git stash drop [작업 내용 아이디] : stash 쌓이지 않게 제거해준다.
08. [설명] 적용한 작업 내용은 스택에서 없애기
- git stash : 작업 내용 저장
- git stash list : 작업 내용 조회 (=스택 살펴보기)
- git stash apply [작업 내용의 아이디] : 작업 내용 적용 (작업내용을 나중에 또 쓸 일이 있다면 사용)
- git stash pop [작업 내용의 아이디] : 특정 작업 내용을 적용하면서 스택에서 제거 (나중에 쓸 일 없을 때)
- git stash drop : 가장 최근의 stash 삭제
- git stash drop [작업 내용의 아이디] : 작업 내용 제거
- git stash clear : 전체 삭제
09. [퀴즈] Git 실전 퀴즈 3
- 통과~
10. 필요한 커밋만 가져오는 git cherry-pick
- git cherry-pick [커밋 아이디] : 자신이 원하는 작업이 들어있는 커밋들만 가져와서 현재 브랜치에 추가
11. 여러 커밋을 하나의 커밋으로 만들기 (심화)
- 기능을 하나 추가했는데 보완된 더 좋은 기능이 생각났음. 그래서 커밋을 중복해서 하게 됨.
- 이럴 때 working direct 상태는 유지하고 git reset --soft [커밋 아이디] 함
- HEAD는 이전 커밋을 가리키지만 working directory는 그대로 유지하며 새롭게 하나의 커밋을 함.
- 이렇게 하면 쓸데없는 커밋들을 없앨 수 있음. git reset --mixed or --soft
- git commit --amend의 경우 마지막 커밋을 수정하는 상황에서 유용하게 사용됨.
12. [설명] git이 무시하는 파일들
.gitignore
- working directory 내에 존재하는 파일들 중에서 마치 존재하지 않는 것처럼
- Git이 인식해야 할 파일들의 목록이 적힌 파일임.
- *.py[cod] : .pyc / .pyo / .pyd로 끝나는 파일명
- *$py.class : $py.class로 끝나는 파일명
- *.so : .so로 끝나는 파일명
13. [퀴즈] Git 실전 퀴즈 3
- ㅇ
14. [설명] Git 토픽 내용 총정리
- git reflog : HEAD가 그동안 가리켜왔던 커밋들의 기록을 출력함
- git log --all --graph : 모든 브랜치의 커밋 히스토리를, 커밋 간의 관계가 잘 드러나도록 그래프 형식으로 출력
- git rebase [브랜치 이름] : A, B 브랜치가 있는 상태에서 HEAD가 A 브랜치 가리킬 때, git rebase B를 실행하면 공통 커밋 이후로부터 존재하는 A 브랜치 상의 커밋들이 그대로 B 브랜치의 최신 커밋 이후로 이어 붙여짐.
- (git merge와 같은 효과를 가지지만 커밋 히스토리가 한 줄로 깔끔하게 된다는 차이점이 있음)
- git stash : 현재 작업 내용을 스택 영역에 저장
- git stash apply [커밋 아이디] : 스택 영역에 저장된 가장 최근의 (혹은 특정) 작업 내용을 working directory 적용
- git stash drop [커밋 아이디] : 스택 영역에 저장된 가장 최근의 (혹은 특정) 작업 내용을 스택에서 삭제
- git stash pop [커밋 아이디] : 위와 동일한 작업 내용을 working directory에 적용하면서 스택에서 삭제
- git cherry-pick [커밋 아이디] : 특정 커밋의 내용을 현재 커밋에 반영
- git push, git pull은 작업 단위가 브랜치임. (git push --all 이라는 옵션을 주면 모든 브랜치 내용 전송은 가능)
'공부 > 코드잇' 카테고리의 다른 글
[코드잇] 프로그래밍 기초 in JavaScript / 토픽 2 (완강) (0) | 2022.03.27 |
---|---|
[코드잇] 프로그래밍 기초 in JavaScript / 토픽 1 (완강) (0) | 2022.03.27 |