010. 데이터 취업 스쿨 스터디 노트_10주차_Git

Julia-jh·2024년 6월 14일
0

10주차

수강한 분량

Git에 가입하고, Github과 Local을 연결하는 내용, Local 내부에서 충돌이 일어나는 내용을 다루는 법을 공부했다.

각 강의별 학습한 핵심 내용 정리

Git

버전관리

  • 버전관리 시스템(형상관리)
    - Configuration Management Systems
    - Version Control Systems
  • 버전관리
    - Source Data + History
    - 협업, 작업추적, 복구 등이 가능
  • Git 등장 배경
    - Local Version Control Systems
    - 파일 버전 관리 시스템
    - 내 컴퓨터에서 버전 관리 기능 > 하드 날아가면 전체 코드 사라짐
    - 버전은 관리되지만, 협업은 여전히 어려움
    - Centralized Version Control Systems
    - 중앙 관리 시스템
    - 협업이 가능해짐
    - commit 하는 순간 배포되어 다수에게 버그 유발 가능(서버로 바로 commit)
    - 인터넷이 안되면 작업이 불가능
    - 자신만의 version history를 가질 수 없음
    - Distributed Version Control Systems
    - 분산 버전 관리 시스템
    - commit 하더라도 개인저장소 내에 적용됨(다른 개발자에게 영향 없음)
    - 원하는 순간 배포(push) 가능
    - 오프라인에서도 작업 가능
    - 자신만의 version history를 가짐
  • 버전 관리 시스템 종류
    - CVCS
    - CVS
    - 1980년대 만들어진 형상관리 시스템
    - commit 중 오류 발생 시 Rollback이 되지 않는 등의 문제
    - 이후 SVN으로 대체됨
    - SVN
    - subversion.apache.org
    - 2000년대 만들어졌고, 현재까지 두루 사용 중
    - DVCS
    - Mercurial
    - Git
    - git-scm.com
    - SVM보다 빠른 속도, 많은 기능 지원
    - 현재 많은 기업이 사용 중
  • Git 기반의 서비스
    - Github
    - github.com
    - git을 호스팅해주는 웹 서비스, 협업을 위한 기능을 제공
    - 소스코드 보안이 중요한 경우 사용을 기피함
    - Gitlab
    - gitlab.com
    - 설치형 버전관리 시스템
    - 소스코드 보안이 중요한 기업에서 주로 사용
    - 클라우드 버전 관리 시스템
    - 10명 이하 부료(Githunb과 유사)
    - Issue tracker, Git Remote Repository, API, Team, Group 기능 제공

Git 가입

  • git global configuration
    - git config --global user.name <username>
    - `git config --global user.email.
  • 가져올 때는 LF를 CRLF로 변경하고 보낼때는 CRLF를 LF로 변경
    - git config --global core.autocrlf true
  • line ending
    - CR
    - \r
    - LF
    - \n
    - window
    - CR + LF
    - Unix or Mac
    - LF
    - OS가 상이한 사용자가 같은 Git Repository를 작업할 때, 코드에서 변경된 내용이 없어도 CRLF 차이로 인해 commit이 발생할 수 있음
  • Editor
    - git config --global core.editor <editor>
  • 전체 설정 확인
    - git config --list
  • 항목별 설정 확인
    - git config <key>

Git 용어

  • Repository
    - 소스코드가 저장되어 있는 여러 개의 Branch가 모여있는 디스크상의 물리적 공간
    - Local Repository
    - Remote Repository
  • Checkout
    - 특정 시점이나 Branch의 소스코드로 이동하는 것
    - Checkout 대상
    - Branch
    - Commit
    - Tag
    - 과거 여러 시점의 코드로 이동 가능
  • Stage
    - 작업할 내용이 올라가는 임시저장영역
    - 내용중 commit에 반영할 파일만 선별하여 commit을 수행할 수 있음
  • Commit
    - 작업할 내용을 Local Repository에 저장하는 과정
    - 각각의 commit은 의미있는 변경단위, 변경에 대한 설명을 commit log로 남김
    - commit을 아끼지 말기 > 게임의 save point
    - commit단위, commit log format이 정해진 회사 혹은 팀 있음(빌드 서버를 사용하는 경우)
  • Tag
    - 임의의 commit 위치에 쉽게 찾아갈 수 있도록 붙여놓은 이정표
    - Tag가 붙은 commit은 commit id (version) 대신 tag name으로 쉽게 checkout 가능
  • Push
    - Local Repository의 내용 중, Remote Repository에 반영되지 않은 commit을 Remote Repository로 보내는 과정
    - Push하는 순간 다른 개발자들도 영향을 받음, 검증된 코드만 Push하기
  • Pull
    - Remote Repository에 있는 내용 중, Local Repository에 반영되지 않은 내용을 가져와서 Local Repository에 저장하는 과정
    - 다른 팀원이 변경하고 Push한 내용을 Local Repository에 가져올 수 있음
    - Push 과정에서 Conflict가 일어나 Push가 거절된 경우, Pull을 통해 Remote Repository의 변경 내용을 Local Repository에 반영하여 Conflict를 해결한 뒤 다시 Push를 시도해야 함
  • Branch
    - 특정 시점 (commit 단위)에서 분기하여 새로운 commit을 쌓을 수 있는 가지를 만드는 것
    - 개발의 주축이 되는 branch를 master branch 혹은 main branch라고 함
    - 모든 branch는 최종적으로 다시 master branch에 merge되는 형식으로 진행됨
  • Merge
    - Branch의 반대개념으로 하나의 Branch를 다른 Branch와 합치는 과정
    - Merge되는 두 Branch는 주종관계가 성립 > dev Branch를 main Branch에 merge
    - Merge되는 과정에서 Conflict가 발생한 경우, Diff를 수정하여, Conflict를 해결한 뒤 Merge를 진행할 수 있음

Local Repository

  • Working Directory(작업공간)
    - 실제 소스 파일, 생성한 파일들이 존재
  • Index(Stage)
    - Staging Area(준비영역)의 역할, git add한 파일들이 존재
  • HEAD
    - 최종 확정본, git commit한 파일들이 존재
  • Local Repository 생성
    - 원하는 디렉토리로 이동한 후, git init을 실행하면 git이 활동을 시작
    - ls -all
    - 내부에 있는 모든 파일들을 보여줌
    - -all 옵션으로 숨겨진 것 또한 보여줌
    - touch <file_name.확장자>
    - 빈 파일을 생성
    - git status
    - git에 존재하는 파일 확인
  • version 관리
    - git add <filename>
    - Working Directory에서 변경된 파일을 Index(Stage)에 추가
    - git commit -m "commit에 대한 설명" <filename>
    - Index(Stage)에 추가된 변경사항을 HEAD에 반영 (확정)
  • Remote Repository 생성
    - Github Token 생성
    - 보안상의 이유로 Remote Repository 접속 시 비밀번호 대신 Token 사용
  • Remote Repository 등록
    - git remote add origin https://githup.com/<repository>.git
    - git remote add origin https://<username>:<token>@githup.com/<repository>.git
    - 매번 아이디와 비밀번호 입력 없이 연결 가능
    - git remote -v
    - remote repository 정보 확인
  • Remote Repository에 변경 내용 push
    - HEAD에 반영된 변경내용을 Remote Repository에도 반영하기 위해서는 Git Push를 사용
    - git push origin <branchname>
  • Remote Repository에서 Pull 하기
    - git pull origin <branchname>
  • 파일 읽기
    - cat <filename.확장자>
  • 파일 쓰기
    - cat > <filename.확장자>

Remote Repository

  • README file
    - 프로젝트에 대한 설명, 사용방법, 라이센스, 설치방법 등에 대한 내용을 기술하는 파일
    - 나, 직장동료, 프로그램 사용자를 위해 존재
  • .gitignore
    - Git 버전 관리에서 제외할 파일목록을 지정하는 파일
    - 사용자가 원하지 않는 파일들을 자동으로 commit 대상에서 제외시켜 줌
  • Default Branch
    - main
    - Remote에서 시작한 경우
    - Master
    - Local에서 시작한 경우
    - branch 이름을 수정할 수도 있지만 아주 초반이 아니라면 신중한 것이 좋다
    - Default Branch 이름을 설정에서 아주 바꾸는 법이 있다
  • Git Clone
    - 앞서 폴더를 만들고
    - Git Init으로 해당 폴더를 초기화
    - Remote Repository 등록
    - Remote Repository 내용을 Pull하는 모든 과정을 Git Clone으로 수행
    - git clone https://github.com/<repository>.git
    - git clone https://<username>:<token>@githup.com/<repository>.git
    - 매번 아이디와 비밀번호 입력 없이 연결 가능
  • Branch
    - 조회
    - Local에서 조회
    - git branch
    - Remote 조회
    - git branch -r
    - Local, Remote 함께 조회
    - git branch -a
    - 생성
    - git branch <branchname>
    - 특정 branch를 remote인 origin에 올리겠다
    - git push origin <branchname>
    - 이동
    - git checkout <branchname>
    - 없어 만들고 이동
    - git checkout -b <branchname>
    - 삭제
    - 내가 머무르고 있는 branch에서는 자신을 삭제할 수 없다
    - Local에서
    - git branch -d <branchname>
    - Remote에서
    - git push origin --delete <branchname>

Log and Diff

  • Git Graph
    -VScode에서 Git 변화를 그래프 형태로 볼 수 있는 것
  • Git Log
    - branch 별로 변경이력을 볼 수 있음
  • Git Editor
    - git config --global core.editor <editorname> --wait
    - --wait옵션은 command line으로 VSCode를 실행시켰을 경우, VSCode 인스턴스 닫을 때까지 command 대기
  • Git Configuration
    - git config --global -e
    - git configuration 파일 열기
    - Git Diff 설정 추가
[diff]
	tool = vscode
[difftool "vscode"]
	cmd = "code --wait --diff $LOCAL $REMOTE"
  • Git Diff
    - Local branch 간 비교
    - git diff <branch1> <branch2>
    - Bash 환경에서 확인
    - git difftool <branch1> <branch2>
    - vscode의 diff 기능을 활용
    - commit 간 비교
    - commithash 앞 7자리만 넣어도 비교 가능
    - git diff <commithash> <commithash>
    - Bash 환경에서 확인
    - git difftool <commithash> <commithash>
    - vscode의 diff 기능 활용
    - 마지막 commit과 이전 commit 비교
    - git diff HEAD HEAD^
    - Bash 환경에서 확인
    - git difftool HEAD HEAD^ - vscode의 diff 기능 활용 - 마지막 commit과 현재 수정사항 확인 - git diff HEAD - Local과 Remote 간 비교 -git diff origin/`

Merge and Conflict

  • Git Merge
    - 현재 위치한 branch에 다른 branch를 병합
    - git merge <branchname>
  • Git Conflict
    - Branch를 Merge하는 과정에서 충돌이 생김
    - Push, Pull 하는 과정에서도 충돌이 날 수 있음
  • git mergetool
    - conflict 발생 이후 위의 명령어 입력 시, conflict난 파일들이 차례로 열림
    - 내부 문자 의미
    - <<<<
    - 현재 변화
    - ====
    - 구분
    - >>>>
    - 앞으로의 변화
    - 살릴 내용 말고 나머지 다 지우고 저장
    - git status로 확인하면, 파일명.확장자.orig 라는 파일이 생김
    - 백업용 파일
    - add, commit하면 정리
    - 이후 merge 중 충돌 관련된 내용 문서가 나옴

Tag

  • 특정 버전(Commit)에 Tag를 달아놓을 필요가 있을 때 사용
    - 버전 릴리즈
  • 생성
    - 현재 버전에 Tag 달기
    - git tag <tagname>
    - 특정 버전에 Tag 달기
    - git tag <tagname> <commithash>
    - Tag를 Remote Repository에 Push
    - git push origin <tagname>
  • Tag 목록 보기
    - git tag
  • Tag 상세 정보
    - git show <tagname>
  • 삭제
    - git tag --delete <tagname>
    - git push --delete origin <tagname>

README

  • 프로젝트에 대한 설명, 사용방법, 라이센스, 설치방법 등에 대한 내용을 기술하는 파일
  • 나, 직장동료, 프로그램 사용자를 위해 존재
  • Markdown 문법
    - #
    - headers
    - 갯수가 많을수록 작아짐
    - >
    - blockquote
    - 블럭 인용
    - 블럭 내에서 다른 Markdown 요소 포함 가능
    - 목록
    - 1.
    - 순서가 있는 목록
    - 내림차순으로 자동 정렬
    - *, -, +
    - 순서가 없는 목록
    - 문자가 달라도 상관 X
    - 하위로 갈수록 표시 모양이 달라짐
    - 코드블럭
    - <pre><code>{code}<\code><\pre>
    - \```{code}```\
    - 수평선
    - ***
    - * * *
    - *****
    - - - -
    - ------
    - 외부 링크
    - [텍스트](하이퍼링크, "커서 올리면 나오는 글")
    - 자동 연결
    - - 외부링크: <하이퍼 링크>
    - 강조
    - *기울임*
    - _기울임_
    - **진하게**
    - __진하게__
    - ~~취소~~
    - 이미지
    - 이미지가 어딘가 업로드되어 있어야 함
    - ![Alt text] (/path/to/img.jpg)
    - ![Alt text] (/path/to/img.jpg "Optional title")

느낀점

그동안 Git을 사용하면서 왜 충돌이 일어날까. 나 혼자 쓰는데?? 하는 부분을 이해할 수 있었다. 모든 충돌은 컴퓨터가 가치판단을 하지 않기때문에 일어나는 것. 내용을 갈아엎는다면, 무조건 충돌을 예상하고 어떻게 수정할 지, 혹은 강제로 바꾸는 것을 익히는 것이 필요할지도.
SQL과 마찬가지로 Git은 command 환경이지만 Bash라 언어가 달랐다. 예전에 끄적거리던 리눅스언어가 생각났다. 그때 좀 더 노력했다면 지금 훨씬 쉬웠을까?

이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.

profile
데이터 직무로 먹고 살고 싶은 사람

0개의 댓글