Git & Github

장현웅·2023년 8월 9일
0

Git & Github

Git

만약 레포트를 수정하다가 망해서 스트레스로 탈모가 생긴다면? ㄹㅇ 미침. 한 번 경험해보면 파일을 편집하기 전에 미리 복사를 해서 작업하게 된다. 근데 매번 작업할 때마다 복사를 반복하게되면

20230806Git레포트.text
20230806Git레포트수정본.text
20230806_Git
레포트수정본2.text
20230807_Git
레포트최종본.text
20230807_Git
레포트최종본2.text
20230807_Git
레포트찐막.text
20230807_Git
레포트찐찐막때려죽여도_찐막.text

저장해야 할 파일이 많아지고 지저분해진다. 그리고 저장을 거듭하면서 각 파일의 어느 부분을 수정했는지 확인하기도 번거롭고 명확하게 확인이 잘 안된다.

코드에서도 분명 그런 점에 빡이 쳐서 한 구세주께서 코드를 잘 관리할 수 있는 프로그램을 만들었는데, 그것이 Git이다.

Git은 소스코드를 효과적으로 관리하기 위해 개발된 '분산형 버전 관리 시스템'이다. 말 그대로 소스코드를 변경했다면 변경 전 시점인 버전과 변경 후 버전이 모두 기록되서 도중에 망하더라도 원하는 시점의 버전으로 되돌아갈 수 있다.

# Git은 코드의 변경점을 모~두 기록해주는 프로그램이다.

  • 기능을 개발하면서 코드 변경점을 “기록”할 수 있다.

  • 문제가 생겼을 때 특정 지점으로 되돌아 가는 것이 쉽다.

    → 로그아웃 기능에 문제가 생기면 다시 돌아가서 로그아웃 기능 개발 시작부터 다시 진행이 가능하다.
    (물론 정말 어쩔 수 없는 상황이 아니라면 협업할 때 문제가 생길 수 있기 때문에 과거로 돌아가진 않는다.)

  • 이러한 특징 때문에 git을 버전 관리 도구라고 한다.

Git의 명령어

1. 필수 리눅스 명령어

기본적으로 명령어들은 리눅스 기반으로 만들어지기 때문에 리눅스 명령어도 알아야한다.

바탕화면에서 오른쪽 클릭을 후 Git bash를 열어서 실습해보자. 터미널에서 모든 작업을 한다고 생각하고 실습해보자.

1) pwd

  • print working directory의 약자이다.
  • 현재 내가 작업하는 폴더(디렉토리)가 어디인지 보여달라는 명령어이다.

2) ls

  • list의 약자이다.
  • 현재 위치의 모든 파일 및 폴더 리스트를 보여준다.

3) ls -a
--는 앞의 명령어(ex. ls)의 추가 기능을 사용하고 싶을 때 붙인다.
-a는 all의 약자이다.
-숨겨진 폴더도 보여준다.

4) mkdir 폴더명
-make directory의 약자이다.
-현재 경로에서 폴더를 생성하는 명령어이다.

5) touch 파일명
-현재 경로에서 파일을 생성하는 명령어이다.
(원래는 파일의 생성과 파일의 날짜, 시간을 변경하는 명령어라고 한다.)

6) cd 경로
-change directory의 약자이다.
-터미널에서 폴더 위치를 이동하기 위해 사용한다.
-ls 명령어 입력 후 현재 내가 어떤 폴더로 이동할 수 있는지 확인 먼저 해야한다.
-/(슬래쉬)는 '~안에서'라고 생각하면 된다.

  • .(점 한 개)는 현재 위치이다.
    -..(점 두 개)는 상위 폴더(디렉토리)이다.

→ cd 실습

→ 바탕화면에서 git bash를 켜서 Git 폴더 안에 'hello.html'파일을 만들어보자.

2. git 명령어

바탕화면에 새 폴더(Git-test)를 VS Code에서 열고 파일(index.html)을 하나 만들어 내용을 써놓고 터미널에서 코드를 실습해보자.

1) git init

  • git으로 코드 관리를 시작한다는 명령어
  • init은 initialize(초기화하다, 초기 설정하다)의 준말이다.
    (즉, 프로그래밍을 git으로 관리하기 위해 딱 한 번만 입력하면 되는 명령어이다.)

→ 터미널을 실행시켜보면 현재 내 폴더 위치(~/Desktop/Git-test)가 표시된다.

git init 명령어를 입력 후 엔터를 누른다.

ls -al 명령어를 입력 후 확인해보면 .git이라는 폴더가 하나 생긴 것을 확인할 수 있다.

.git 이라는 곳에서 코드 변경을 계속 추적할 것이다. .git 이라는 폴더가 있으면 해당 프로젝트에서 더이상 git init 명령어를 입력할 필요가 없다.

  • Quiz

    git init 명령어는 개발 프로젝트 시작 시 딱 한 번만 입력하면 된다? 정답: Yes
  • git init 을 하면 현재 프로젝트에 어떤 변화가 일어나나요?
    정답: .git 이라는 폴더가 생깁니다. 이때부터 코드 변경을 git 에서 추적한다.

2) git add 파일명 & git commit -m "메시지"

  • git으로 코드 변경을 저장하는 명령어
  • 코드 변경 시점을 저장하고 싶다면 'index.html "읏쨔" 추가'와 같은 메시지로 키워드를 지정하는 것

→ index.html 코드 추가 후 터미널에 git add 파일명git commit -m "메시지"를 입력

  • 저장하는데 2개의 명령어를 입력하는 이유
    Git이 코드 변화를 추적하는 파일들이 여러 개일 때 특정 파일만 저장하고 싶을 때가 있을 것이다. git add는 변경 내용이 있는 파일들 중 저장하고 싶은 파일을 지정하는 명령어이고, git commit은 실제로 변경점을 메시지로 북마크를 지정해서 변경 내용을 저장하는 명령어이다.

→ 그럼 hello.html 파일을 하나 더 만들고 원하는 파일만 변경 내용을 저장해보자.

→ 이제 index.html과 hello.html의 코드를 수정해보자.


→ 이 둘 중에서 hello.html 파일만 저장해보자.

→ 실제로 index.html 파일이 저장되지 않았다는 것을 확인하기 위해 git status라는 명령어를 입력해보자. 코드의 변경은 있지만 저장을 하지 않은 파일은 'modified: index.html' 라고 표시된다.

→ 만약 변경한 파일이 아주 많고 모든 파일을 저장하고 싶다면 git add .
('.'(점)은 현재 폴더(디렉토리)에 있는 모든 파일들을 의미한다. 그럼 hello.html과 index.html의 코드를 변경한 후 모두 저장시켜보자.


→ 이제 git status 명령어를 입력하면 'bash: get: command not found(commit 할 파일이 없다)'라고 나온다. 즉, 모든 파일의 변경 사항을 저장했다는 뜻이다.

  • Quiz

    git add 와 git commit 의 차이는?
    정답: git add 는 저장할 파일을 지정하는 것 / git commit 은 실제로 저장하는 것

3) git log

  • 저장한 커밋 내역들을 보여주는 명령어
  • git log 명령어를 통해 보이는 커밋 메시지로 어느 시점에 어떤 변경점이 있었는지 추측이 가능하다.
  • 아래 있는 커밋 id를 이용해서 과거 코드 저장 시점으로 되돌아갈 수도 있다.
  • git log에서 빠져나오고 싶다면 키보드에서 q를 입력하면 된다.

4) git branch 브랜치명 & git switch 내가 작성한 브랜치명 혹은 git checkout 내가 작성한 브랜치명

  • 레포트를 작성할 때 도중에 망칠까봐 두려워서 복사본에 추가 작업을 했던 것처럼 프로젝트를 통째로 복사하지 않아도 git으로 코드를 관리하면 알아서 복사본을 만들어주는데 이것이 바로 branch(나뭇가지)이다.
  • git branch 브랜치명 명령어를 입력하면 브랜치(복사본)이 생성된다. 생성된다고 해서 해당 브랜치로 이동한 것은 아니다.
  • 해당 브랜치로 이동하려면 git switch 내가 작성한 브랜치명 혹은 git checkout 내가 작성한 브랜치명 명령어를 쓴다.
    (switch가 최신 버전이지만 둘 다 써도 된다.)
  • 브랜치를 실수로 생성했을 때 git branch -d 브랜치명으로 브랜치를 삭제할 수 있다. git branch로 브랜치 리스트를 확인하고 삭제하면 된다.

→ 브랜치를 생성해보고 git branch로 내가 만든 branch 리스트를 확인해보자.

→ 이제 해당 브랜치로 이동한다.

→ 현재 위치가 profile 브랜치로 변경되었다. 이것은 기존의 master 브랜치에 있던 코드를 그대로 복사해서 새로운 곳에서 코드를 짤 수 있다는 뜻이다. 그럼 profile 브랜치에서 코드를 변경하고 git add & git commit 명령어도 입력해보자.

→ profile 브랜치에서 코드를 변경 및 저장했다. 그럼 기존의 master 브랜치로 이동(git checkout master)해보자.

→ master 브랜치를 보면, index.html과 hello.html에서 분명 코드를 고쳤는데 변경되기 전의 코드이다. 즉, 원본은 변경하지 않고 profile 브랜치에서만 코드를 변경한 것이다.

  • 🍯 꿀팁 - 브랜치를 만들면서 한 번에 이동하는 법
// -c 는 create의 약자
git switch -c feature/login 

// -b는 branch의 약자
git checkout -b feature/login
  • Quiz

    브랜치를 새로 만들고 싶을 땐 어떤 명령어?
    정답 : git branch 브랜치명
    내가 만든 브랜치 리스트들을 확인하고 싶다면?
    정답 : git branch
    생성한 브랜치로 이동하고 싶으면 어떤 명령어?
    git switch 내가 작성한 브랜치명 혹은 git checkout 내가 작성한 브랜치명

5) git merge

  • 다른 브랜치에서 만든 코드를 원본에 합치라는 명령어

→ 원본 브랜치(master)로 이동해서

`git switch master`

git merge 새롭게 기능을 개발한 브랜치명 명령어를 입력하면 원본 브랜치로 코드가 합쳐진다.

→ 우리는 github에서만 합칠 예정이라 쓸 일은 없을 것 같다.

6) git stash -u -m "메시지"

  • 내가 만든 브랜치에서 코드를 완성하지 못했을 때 다른 브랜치로 이동하기 위해 임시 저장을 하는 명령어
  • 내가 만든 브랜치에서 git addgit commit로 저장하지 않으면, git switch 혹은 git checkout 명령어가 작동하지 않을 때가 있다.((정확히는 항상 그런 것은 아니고, 이동하는 브랜치의 코드와 내가 변경한 코드에서 겹치는 부분이 있을 때 이동이 안되는 것이다.) 만약 급하게 브랜치 이동을 해야하는데 아직 코드 개발을 다 하지 못한 경우 git stash 명령어를 쓴다.
  • -u는 untracked 파일들의 변경사항도 모두 저장하겠다는 뜻
  • -m 은 커밋 메세지처럼 어떤 기능을 개발하는 중이었는지 간단하게 메세지를 작성할 수 있게 하는 옵션

→ profile 브랜치로 이동해서 코드를 변경해보자.

→ 그리고 git stash -u -m "메시지" 명령어를 입력해보자.

→ 코드에서 변경했던 부분들이 사라진다. git stash list 명령어를 치면 임시 저장한 부분을 확인할 수 있고, q를 눌러 빠져나올 수 있다.

→ 임시 저장했던 부분을 다시 불러오려면 git stash apply stash@{숫자}를 입력하면 된다. 숫자git stash list 명령어 입력 후 확인할 수 있다.

7) git reset & git revert

  • git reset : 과거 커밋으로 완전히 되돌아가는 명령어
  • git revert : 과거 커밋을 다음 커밋으로 만들어 되돌아가는 명령어

- github의 히스토리가 지워질 수 있으니 웬만하면..안 쓰는게 좋다.

8) Vim

Git의 구조

Git은 '로컬 저장소'라는 이름으로 전체 데이터를 작업 폴더에 넣어 관리한다. 이는 전체 기록과 각각의 기록을 추적할 수 있는 정보를 포함하고 있는 저장소이다. 즉, 자기 컴퓨터에 모든 파일을 다 받아서 하는 셈이다. 이 '로컬 저장소' 는 해당 작업자의 작업을 버전별로 저장하고 관리하는 중간 관리 역할도 하면서, 동시에 해당 작업자와 다른 작업자의 작업을 '각기 다른 사람의 로컬 저장소'로 다원화 하는 역할도 가지고 있다. 즉, 여러 기여자가 메인 서버의 편집 버전 숫자 증가를 공유하는 것이 아니라, 각 유저별로 나름 자기 버전의 편집버전을 올려가다가, 필요해지면 서버와 각 유저가 작업을 마친 원하는 버전을 통합시켜 서버 단위의 편집버전을 +1 올리는 것이다.

작업이 끝나면 Git 원격 저장소로 다시 발행하는데, 여기에서도 메인 저장소와 합치기 전 메인 저장소와 격리시키고 따로 개발 할 수 있는 가지라는걸 만들어 가지의 개발이 완료될 시 메인 저장소와 합치고 가지는 삭제시키는 가지치기를 할 수 있으며, 또한 개발 중간중간 꼬리표를 매겨 개발을 더 수월하게 할 수 있다.

Github

드라이브를 사용하기 이전에는 레포트가 날아갈 경우를 생각해서 usb에 담아다니고는 했다. 하지만 이 조차도 usb를 잃어버리면 인생 망한 기분이다. 이런 상황을 방지하기 위해 우리는 드라이브, 클라우드 등에 백업을 해놓다. 이런 공유 저장소에 파일을 저장하면 다른 사람들과도 쉽게 공유가 가능하다. Github은 대표적인 무료 Git 저장소 / 온라인 코드 저장소이다.

Github의 장점

  1. 내 코드를 온라인 저장소에 백업을 할 수 있다.

  2. 팀원들과 협업할 때 내 코드를 공유할 수 있다.

  3. 함께 작업이 가능하다.

내 컴퓨터의 코드를 Github에 올려보자

Github repository (온라인 코드 저장소) 생성하기

  1. Github 홈페이지에서 'github-test'라는 레포지토리 생성
  2. 내 컴퓨터의 코드를 Github repository로 업로드해보자.
    → 아래 코드를 터미널에 실행(<github 주소>를 origin이라고 “명명”하겠다!라는 명령어)


    → github 홈페이지로 이동 후 새로고침을 하면 내 컴퓨터에 있는 코드가 올라간 것을 확인할 수 있다.
  3. 코드를 다시 수정한 후 github에 올려보자. 터미널에 git add & git commit 명령어를 입력해서 변경사항 저장해준 후 로컬에서 main으로 업로드를 하기 위해 git push origin main 명령어 입력.
  4. 변경된 코드가 올라간 것을 볼 수 있다.

전체적인 흐름

  1. 팀장의 온라인 저장소(github)의 레포리지(저장소)에서 코드를 처음 받아올 때는 git origin 대표자의 github 주소 .(띄우고 점 = 파일만 가져옴) 명령어로 내 로컬 저장소로 가져온다.

    [대표자의 github 주소]

    [터미널 / git bash]

  2. 자기가 담당한 기능별로 브랜치 만들기 - 'git branch 브랜치명'으로 브랜치를 만들고 git switch/checkout 내가 지정한 브랜치명으로 브랜치로 이동한다.

  1. 기능 개발 및 코드를 수정한다. 변경한 코드를 git add . & git commit -m "메시지"로 저장해준다.

  1. git push origin 브랜치명 명령어로 github에 코드를 내 브랜치 이름으로 업로드한다.

git push를 하면 github에 'Compare & pull request'가 자동으로 생성된다.

  1. 'Compare & pull request'를 누르면 메인 브랜치에 내 브랜치를 가져와 병합시키는 식이 있는데 'Able to merge(병합 가능)'이라고 쓰여져 있다. 내가 작성한 커밋도 확인이 가능하다. 다 확인이 되었으면 'Create pull request'를 누른다.

  2. 이어지는 페이지에 보면 코드를 합칠 수 있는 상태라고 뜨고 'Merge pull request' 버튼을 누른 후 'Confirm Merge'라고 한 번 더 누르면 최종적으로 코드가 합쳐진다. 또 내가 작성한 커밋 내용과 파일의 변경 사항들을 볼 수 있다.




  1. github의 main 브랜치의 코드 확인


  1. 이제 또 다시 새로운 기능을 만들어야 할 때 'git bush'에 get clone 주소 명령어가 아니라

터미널에서 'git switch/checkout main' 명령어로 로컬에서 main 브랜치로 이동한다. 이때 아래에 'Your branch is up to date with 'origin/main'.'라고 쓰여있는데 이 말은 현재 내 컴퓨터(로컬)의 main 브랜치 코드가 github의 main 브랜치보다 과거의 코드라고 이야기하는 것이다.

→ 'git pull origin main'으로 내 컴퓨터도 github 코드를 가져와서 최신화한 뒤 위 과정을 반복하면 된다.

만약 다른 팀원이 이미 main과 merge를 한 뒤에 나도 같은 부분을 수정해서 충돌이 나는 경우도 있다.

  1. 보통은 충돌이 날 가능성을 생각해서 바로 합치지 않고 github에서 다른 팀원들의 코드와 병합된 파일을 git pull origin main 명령어로 내 브랜치에 받아와서 코드가 잘 실행되는지 확인한다.
  1. main에서 받아온 코드와 내 코드를 병합 및 정리해서 github에 내 브랜치 이름으로 업로드한다.
  1. Merge

→ github에 requirements.text(설치 프로그램 및 버전) 생성 / .gitignore(github에 업로드 안할 목록) 포함 https://www.toptal.com/developers/gitignore

0개의 댓글