TIL - Git & Github

김영훈·2021년 3월 26일
0

ETC

목록 보기
1/34

# Git & Github

  • Git이란?

    • 소스 코드를 효과적으로 관리할 수 있게 해주는 오픈소스로 버전 관리 시스템(version control system)이라고도 한다.

    • 개발 프로젝트 진행 시 최신 소스 여부나 수정 사항 등을 확인하는 이력 관리가 필요한데, 버전 관리 시스템은 이러한 이력 관리를 도와주는 역할을 한다.

  • 코드 버전 관리를 하는 이유는?

    • 수정할 때마다 파일을 새로 만들면 관리가 힘들기 때문에

    • 언제든 이전 버전의 코드로 돌아갈 수 있기 때문에

    • 이력(수정 내역, 수정자 정보 등을 통해 문제의 원인 제공자를 찾기가 쉬워진다.)을 남기기 위해

    • 하나의 프로젝트를 두고 여러 명의 개발자들이 협업할 수 있기 때문에

  • Github란?

    • Git이 사용된 프로젝트들의 저장소

    • 개발자들의 Social Network

  • 정리

    • Git은 프로젝트 버전 관리를 도와주는 시스템이고 Github는 Git을 이용해 버전 관리를 한 프로젝트들을 관리해주는 호스팅 서비스다.
  • Repositories(저장소)

    • Git repository는 Git으로 관리하는 프로젝트 저장소로 크게 두 종류가 있다.

      Local repository - 본인의 컴퓨터에 저장된 로컬 버전의 프로젝트 저장소

      Remote repository - 로컬 repository와는 반대로 내 컴퓨터가 아닌 외부 (일반적으로 원격 서버) 버전의 프로젝트 저장소. 팀에서 작업할 때 특히 유용합니다. 이곳에서 프로젝트 코드를 공유할 수 있고, 다른 사람의 코드를 확인할 수도 있습니다. 또, 로컬 버전의 프로젝트와 병합하고, 변경 사항을 적용 할 수 있는 곳입니다.

# 실습(Git)

  • 버전 관리 대상 디렉터리(프로젝트 디렉터리)로 이동 : cd 명령어 활용하기

  • 깔린 git version 확인 : git —version

  • Git 시작하기 : git init —> '.git'이라는 숨김 폴더 생성 —> 명령어가 활성화되면 Git은 현재 저장소에 대한 모든 변경사항(추가되는 문장 파일 등의 이력)을 추적/관리하게 된다. 즉, 파일 및 폴더의 변경 사항을 이력별로 저장해 두는 로컬 저장소(local repository)가 생성된다.

    * 원치 않는 폴더에서 git이 활성화 됐을 경우: 해당 폴더로 이동하여 rm -rf .git명령어로 저장소를 제거
    * git init을 입력하면 해당 프로젝트 파일에서 자동으로 master branch생성활성화 된다. branch 이름은 수정될 수 있고, 새로운 branch를 만들어 전환하는 것도 가능하다.

  • 숨김 폴더 확인: ls -al

  • Git 상태 확인 : git status

  • 파일 수정 이력 기록 준비 :git add

    • git add는 git으로 관리되지 않고 있던 파일들을 staging area에 추가해준다.

    • git add .: 프로젝트 폴더 내의 모든 파일과 폴더를 staging area에 추가하고, commit을 남길 수 있게 해준다.

  • 파일 수정 이력 기록 : git commit -m "Commit message"

  • Commit 이력 보기 :git log

  • 내가 위치한 경로 확인: pwd

  • 실습해보기 : 프로젝트 폴더로 이동 —> git init —> touch로 파일 생성 —> git status —> git add .—> staging area추가하여 기록으로 남길 것을 명령 —> git status —> 메시지가 바뀐 걸 확인할 수 있음 —> git commit -m “Creating sample.md” —> git status —> commit 이력 보기 —> git log —> 나가려면 q

  • 위 실습을 통해 desktop에 local repository를 하나 생성한 것으로 볼 수 있다.

# 실습(Github)

  • Github에 접속하여 remote repository 생성 및 push 실습을 해보자. repository name은 중복을 허용하지 않으므로 주의!!

  • repository name을 입력하고 public 옵션을 선택한 뒤, Create repository 클릭

  • git push란?

    • commit한 변경사항을 밀어서 git hub에 올리는 것 c.f) 반대는 pull

    • commit한 이력이 repository로 저장된다. 현재 폴더를 그대로 업로드하는 것이 아니라, 지금까지의 이력/버전(commit)을 올리는 것이다.

    • push할 remote repository 주소 입력 : repository 생성한 폴더로 이동 —> git remote add origin (remote repository 주소.git)

    • 현재 연결되어 있는 저장소(remote repository) 주소 확인하기: 로컬 저장소로 이동 —>git remote -v

    • 현재 사용 중인 branch 이름을 'main'으로 바꾸기(선택 사항): git branch -M main

    • push 명령어: git push -u origin [branch name] ex) git push -u origin main

    • MAC OS환경에서 git push 실행시, 아래와 같은 로그가 뜨며 error가 발생했을 경우

  • Github 원격 저장소에 잘못 push한 폴더 삭제 방법

    • 참고 사이트

    • git rm --cached [File Name]: 원격 저장소에 있는 파일을 삭제한다. 로컬 저장소에 있는 파일은 삭제하지 않는다

    • ex) git rm --cached -r .idea/: .idea 폴더 하위의 모든 파일 삭제

    • ex) git rm --cached ./api/models/.room.py.swp

# Branch

  • Branch

    • 여러 명이 동시에 하나의 프로젝트를 진행할 때, 다른 사람의 작업에 영향을 주거나 받지 않고 개인이 독립적으로 작업을 진행하기 위해 필요한 개념
  • branch를 활용한 작업의 진행 순서

    • '메인 branch'에서 자신의 독립적 작업을 위한 '전용 branch'를 생성
    • 개별 작업 진행
    • 작업이 끝난 후 '전용 branch'의 변경 사항을 '메인 branch'에 적용하여 결과를 하나로 모음
  • branch 활용의 장점

    • branch를 활용하면 작업의 진행 도중 작업에 관한 기록을 남길 수 있기 때문에, 추후 문제가 발생할 경우 원인을 찾아 대책을 세우는 게 수월해짐
  • 관련 명령어

    • git branch <new-branch-name>: branch 생성
    • git checkout <branch-name>: branch 전환
    • git checkout -b <new-branch-name>: branch 생성과 동시에 생성된 branch로 이동
    • git branch: 프로젝트에 존재하는 모든 branch 확인
    • git merge <branch-name>: branch 병합. 특정 branch의 작업 내용을 master branch에 적용할 때 사용된다.
    • git branch -d <branch-name>: branch 삭제(조심해서 사용)

# Rebase

  • Rebase란?
    • git의 commit 이력(history)를 바꿀 수 있는 기능
    • rebase를 활용하면 특정 branch에 존재하는 다수의 commit 이력한 개의 commit으로 병합할 수 있다.
    • rebase를 사용하면 각각의 branch에는 한 개의 commit만 존재하게 된다.
    • 이때, 특정 branch의 마지막 commit이 해당 branch의 base(기준)이 된다.
    • 결과적으로, 한 개의 기능에는 한 개의 commit만 존재하게 된다.(pull request는 branch 단위로 이뤄지므로)
  • Rebase 필요성

    • commit이 여러 개인 경우, 그만큼 merge의 횟수가 증가하고, 이는 여러 개의 merge commit이 존재하는 결과로 이어진다.
    • merge commit이 복수로 존재하면 commit history의 흐름이 끊기는 문제가 발생한다.
    • 한 개의 기능에는 한 개의 merge commit만 존재해도 무방하다.
    • 결국, rebase의 장점은 불필요한 merge commit을 제거하는 데 있다.
  • Rebase 단점

    • conflict가 commit마다 발상핼 가능성이 높음
    • conflict 발생 이유는 특정 branch 생성 시기base(기준)가 전환된 시기(해당 branch의 마지막 commit 시점)가 일치하지 않기 때문이다.
  • 사용 방법

    • Branch 작업 완료 —>git pull origin main —> 작업 branch로 이동 —> Git rebase -i main —> interactive 창이 열림 —> commit 내역이 창에 순서대로 뜸 —> 가장 상단의 것을 pick, 나머진 s로 바꿈 —> **commit 메시지는 그대로 두기 —> :wq —> 다음 에디터 화면으로 전환 —> 최종 commit message 설정 —> :wq —> git log —> 최근 commit이 하나로 대체됨을 확인할 수 있다.

    • 2~3개의 commit 당 rebase 1회 —> 그래야 conflict 처리가 편리해진다.

    • ‘Git push origin branch -f’ 로 강제 push해야 pull request가 이뤄짐

  • 충돌 해결하기

    • 코드가 삭제된 것처럼 보일 수 있음 —> 당황하지 말고 conflict  해결 —> git add . —> git rebase --continue —> 멈춰 있던 리베이스가 진행된다. —> 또 conflict 발생 —> 다시 충돌 해결 후 conintue 반복 —> 계속 해결이 안되면 git rebase --abort로 rebase를 진행하기 전 상태로 돌아갈 수 있다.

# 다른 저장소 clone하기

  • git 저장소(Local repository)를 만드는 방법엔 두 가지가 있다. 첫 번째는 위에서 언급했던 git init명령어로 본인 컴퓨터의 기존 프로젝트나 디렉터리를 저장소로 만드는 방법이다. 두 번째는 다른 서버에 있는 git 저장소를 본인의 컴퓨터로 clone하는 방법이다. 두 번째 방법은 주로 공동 프로젝트에 참여하여 협업이 필요한 경우 사용된다.

  • clone 방법

    1. 저장소로 만들 프로젝트 디렉터리로 이동
    2. clone할 remote repository 페이지로 이동해서 저장소의 URL(HTTPS)을 복사
    3. git clone URL
    4. clone이 완료되면 remote respository의 프로젝트 폴더가 사용자 본인의 프로젝트 폴더에 복제된 것을 확인할 수 있다.
  • clone 이후 전용 branch 생성하여 작업하기

    • 복제된 프로젝트 폴더 안전용 branch 생성: git branch feature/본인 이름

      • 보통 feature/현재 작업하는 기능명으로 branch 이름을 짓는다.
    • branch 확인: git branch

    • 전용 branch로 이동: git checkout branch 이름

    • 본인의 작업물이 저장될 폴더 생성: mkdir 폴더명

      • 동료들이 본인의 작업 폴더임 식별할 수 있도록 폴더명 짓기 ex) 본인 이름
    • 개인 작업 폴더로 이동 후 프로젝트 폴더 생성: ex) django-admin startproject project_westagram

    • 이후 실행한 작업 이력을 add --> commit --> log 확인 --> push해주면 된다.

      • push 대상: 전용 branch
    • remote repository 페이지로 이동 후, Compare & pull reqeust 클릭

    • 제목 및 내용 작성

      • 제목 작성(본인 이름, 작업 내용) 예시: [19기 강경훈] Mission1 Django 초기셋팅 완료
      • label 지정 후 Create pull request 클릭
        • 첫 번째 pull request: '리뷰 요청'
        • Status: Accepted label을 수신하면, 추가 수정 후 다음 미션을 진행하면 된다.
        • 진행해야 할 미션 목록은 remote repository 페이지의 Issues 목록에서 확인 가능하다.

# 원격 저장소의 업데이트 코드 내려받기

  • git pull origin [내려받을 branch 이름]: origin(원격 저장소 주소)의 내용을 사용자의 로컬 branch로 내려받음

  • git merge [병합할 branch 이름]: 현재 사용 중인 branch(개인 작업 branch)병합할 branch(main)의 내용을 가져옴

    • merge의 장점: 개인 작업 branch의 내용이 삭제될 염려 없이, 새롭게 업데이트된 내용을 추가할 수 있다.
  • pull하는 과정에서 충돌이 발생하는 경우

    • git stash: commit되지 않은 채 남아있는 이력들을 백업하는 명령

    • Git stash list: 백업해둔 이력들의 목록을 확인하는 명령

    • git stash drop [stash 이름]: 백업해둔 이력 목록 삭제 명령

# 추적되지 않은(unstage) 파일 삭제하기

  • git clean -f: 추적되지 않은(unstage) 파일을 삭제. 해당 명령어를 사용하면 삭제된 파일을 복원할 수 없기 때문에 심사숙고해서 사용해야 한다.
  • git clean -d -n: git clean 명령으로 삭제될 대상을 미리 확인하는 명령어

# 가상환경 생성 및 기타 터미널 명령어

  • conda create -n project python=3.8 —> 가상환경 생성
  • conda env list —> 가상환경 목록 확인 가능
  • conda activate project —> 가상환경 활성화
  • pip freeze —> 가상환경에 설치된 패키지 확인
  • pip install django —> 가상환경에 Django 설치
  • conda deactivate —> 가상환경 비활성화 명령
  • conda env remove -n '가상환경 이름' —> 가상환경 삭제
  • conda list -> 설치된 패키지 정보 확인(환경 별로 다름)
  • rm 파일 이름 —> 파일 삭제
  • rm -rf 폴더 이름 —> 폴더 삭제

# git 기본 commit editor 변경하기

  • git rebase를 사용하려면 vim과 같은 텍스트 편집기(editor)를 git과 연결해줘야 한다. 간혹 연결이 돼있지 않거나, 연결은 됐지만 editor의 이미지를 찾지 못해 error가 발생하곤 하는데, 이 경우 git의 기본 editor를 다시 연결해줘야 한다.

  • 실제로 git rebase를 실행하려다가 아래와 같은 버그가 발생했다.

hint: Waiting for your editor to close the file... dyld: Library not loaded: /System/Library/Perl/5.28/darwin-thread-multi-2level/CORE/libperl.dylib
  Referenced from: /opt/homebrew/Cellar/macvim/8.2-170/MacVim.app/Contents/MacOS/Vim
  Reason: image not found
error: vi died of signal 6
error: There was a problem with the editor 'vi'.
  • 해결 방법은 간단하다. 명령어를 통해 git의 기본 편집기를 재설정하도록 하자.

    • git config --global core.editor /opt/homebrew/bin/nvim
    • 글쓴이의 경우 주로 사용하는 nvim의 위치 경로를 입력하였다.
profile
Difference & Repetition

0개의 댓글