Git 과 GitHub

Daye Kang·2019년 12월 15일
1

Git을 쓰는 이유는?

  • 버전 관리(형상 관리)를 함으로써 코드의 보수, 유지를 원활하게 하고자

  • 코드를 수정하고 저장한 파일들을 폴더에 정리하고 그 폴더를 카테고리 별로 만들어 관리해도 파일들 하나 하나를 봤을 때 따로 변경사항들만 정리하지 않는 이상 변경사항을 파악하기 힘들다는 문제가 발생.

  • 그런데 그 폴더와 파일 관리를 나 혼자 하는 게 아니라 공동관리를 해야 한다면?
    => 다같이 자료를 공유해야 한다
    => 그런데 같은 파일을 동시에 수정한다면? 충돌 발생

  • 이 모든 문제점들을 해결하고자 Git을 사용, 그리고 이 모든 기능

    ** Git이 각광을 받는 이유

    • 모든 내역들을 모든 구성원들이 받고 가져올 수 있음(모든 컴퓨터에 복제가 그대로 됨).
      그 전 시스템들은 하나의 중앙 컴퓨터가 있고 그게 필요한 부분들만 받아오는 시스템이었다면 Git은 모두가 받아올 수 있음.
    • 코드의 수정사항은 본인의 컴퓨터에서만 수정이 되고 공유하고자 할 때는 'push'를 통해 모두에게 공유가 됨.
    • Git 자체는 인터넷이 없어도 가능함.

Git의 중요한 요소

  1. git repository: 저장소
  • 모든 파일들이 저장되는 곳
  • 'history' 기능: 수정한 것들의 역사, 수정한 내역들이 모두 저장되어 있음.
    수정된 시점(commit)으로 저장 됨.
  1. branch: commit들이 쭉 나열되어 있는 것. 모든 branch들을 묶는 건 'master branch(나무의 뿌리)' 가지.

  2. GitHub: 모든 사람들이 접속해서 이용할 수 있는 중앙 서버 역할, 중앙 repository.

Git stage

Git을 사용해서 파일 버전 관리를 할때 파일은 다음 3개의 상태중 하나의 상태에 있게 됨.

  1. modified: 내용 수정
  2. staged: 변경된 내용을 중간 save => git add .
    'commit' 되기엔 완벽하지 않고 임시 저장하는 것, 추가 수정. 되돌리기가 가능
  3. commit: 해당 브랜치에 내용이 저장됨=> history 생성.
    local repository에 저장 => git commit -m "something typed"

Git's commands

-git init : git을 레퍼지토리로 사용하겠다고 시작하는 것.
-git add : 수정 사항들, 즉 modified 파일들을 staged 상태로 옮기고자 할때 사용하는 명령어. 또한, git repo에 새로이 추가된 파일들을 'staged' 상태로 옮길때도 사용.
-git commit: 'staged' 된 파일들을 'commit' 하고자 할때 사용하는 명령어.
-git push & git pull: 변경사항들을 원격으로 'push'&'pull'하는 것. 변경사항들을 add, commit했다면 원격으로 push, 최신내용이 업데이트 되서 원격에서 받길 원하면 'pull'.

  • How to : git pull <:remote:> <:branch:> and git push <:remote:> <:branch:>

-git diff: 어떤 수정 사항들이 적용됬는지 보고자 할때 사용하는 명령어. 'staged' 된 수정 사항들은 git diff로 볼 수 없고 'Modified' 된 파일들만 git diff로 확인 가능.
-git status: 현재 상태를 보여주는 명령어. 어떠한 파일들이 'modified'가 되었고 어떠한 파일들이 'staged'가 되었는지 등의 전체적인 상황을 보여줌.
-git log: 'commit' 내역들을 보여줌(commit history). git log를 통해 이제까지 커밋 내역들을 전부 볼 수 있음. 다만 출력되는 포맷이 보기가 쉽지가 않아서 'tig' 같은 tool을 사용하면 훨씬 편리.
(sudo apt-get install tig)
-git rm: 원하는 파일을 git repo에서 삭제.

-git mv: 원하는 파일을 git repo 상에서 이동 시킬때 사용. 주로 rename 할때 사용.

Git branch & mersing

  • 'master branch'에서 작업한다고 가정했을 때, 작은 가지 'branch' 생성 => git branch
  • 예를 들어, 'feature branch'(master branch에서 나온, 작업 branch)를 생성해서 로그인 하는 코드를 작성하고 저장을 해 'master branch'에 합하는 것. for 다른 사람들과 적업을 하기 위해 'featrue branch' 생성. 공동 작업자들의 작업에 영향을 받지 않으면서 작업을 하고자. 자신만의 브랜치를 따서 작업을 하고 마지막에 끝났을 때 'master branch'에 합함. 그리고 그 과정을 'mersing'이라고 함.
  • 작업자들 서로 'pull' 받는 시점이 다르고 같은 부분에서 수정 사항이 두개 이상이 되면 어떤 부분을 반영해야 할지 git 시스템에서 결정을 못해 수정사항을 저장하고 'mersing'하게 되면 'conflict(충돌)' 발생.
  • 그 어떠한 내용도 받지 못하므로 작업자들끼리 최종적으로 반영햘 내용을 상의해서 다시 'git add'와 'git commit'을 해야 함.
  • 충돌이 일어날 때 버그가 많이 발생하므로 이럴때일수록 차분히 코드를 확인해 문제가 없는지 파악해야 함.
  • git commit, git diff를 자주 확인해야 함.

GitHub, 중앙서버

'Github'는 중앙서버의 역활을 하는 서비스. 개발자가 직접 git 중앙서버를 구현하여 운영할 수 도 있지만 여러가지 비용과 구현하는 시간이 걸리는 불편함이 발생. 그래서 대신에 가성비 좋고 튼튼한 github를 사용.

  • 내 local(내 컴퓨터)에 있는 'master branch'를 'GitHub'(모든 작업자들의 컴퓨터)으로 'push'.
  • 나의 'master branch'와 'Github'에 있는 'master branch'를 비교해 수정사항 반영.
  • 다른 작업자가 업데이트한 내용을 확인하려면 'git pull'을 해야 함.
  • 'pull'을 할 때 conflict(충돌) 발생 => 왜냐하면 누군가의 수정사항을 반영해 'mersing'한 파일을 내가 다시 받아오고, 나의 코드에도 수정사항이 있게 되면 2개 이상의 수정사항이 생기므로 'conflict' 발생.
  • 'push'를 할 때도 'conflict' 발생 => 'push' 할 때 내가 한 수정사항이 'github'에 있는 코드와 다르게 되면 'github'의 'master branch'를 일단 'pull'하고 'local branch'를 'push'하라고 뜸.
  • 각 'feature branch'별로 작업을 해야 함. 로그인 작업은 로그인 feature branch, 로그아웃 작업은 로그아웃 feature branch에.
  • 'feature branch'는 'master branch'에 'mersing' 하면 지워도 됨 => 'feature branch'는 short lived.

<git 실습>
git pull origin master => master branch에서 최신 코드 받기
git branch feature/기능 이름 => feature branch 만들기 => 그러면 내 로컬 브랜치로 저장
git checkout feature/기능 이름 => feature branch로 이동
git status
git add .
git comment -m "something typed"
git push origin feature/기능 이름 => feature branch로 push => 내 로컬 브랜치에서 깃허브 마스터 브랜치로 저장
pull request, 사이트에서 하기 => mersing 이 되면 내 코드 업로드, 안 되면 충돌


reference: https://stackoverflow.com/c/wecode/questions/299

profile
뭐든 하자

0개의 댓글