Git

GyungHo Go·2020년 4월 29일
0
post-thumbnail

소스코드를 효율적으로 관리하기 위해 사용되는 버전 관리 시스템 VCS(Version Control System)이다.
여기서 version은 소스코드(sourcecode) 파일의 version을 뜻 한다.
즉 소스코드(soruce code)의 변경사항 내역을 관리하는 시스템 이다. 참고로 소스코드란 코드 파일들을 말한다. server.js 같은 파일이 소스코드 이다.

Git Basic

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

Committed
수정 사항들이 git에 저장이 된 상태를 "committed" 이라고 한다. 이러한 행위를 "commit" 한다고 한다.

Modified
Modified file은 이름 그대로 수정된 file 이다. 하지만 아직 "commited" 되지 않은 상태의 file을 이야기 한다.

Staged
Staged file은 modified file에서 한단계 더 나아가서 곧 commit 될거라고 mark 해놓은 상태이다. 즉 modified 와 committed의 중간 상태라고 생각하면 된다.
이렇게 중간 상태가 존재 하는 이유는, commit 하기전에 중간 상태를 저장할 수 있도록 하기 위함이다. Commit을 하면 commit history에 남기도 하고, 혹시 추가 수정 사항이 있거나 다시 되돌려야 할때 까다롭기 때문에 (commit 후에도 다시 되돌리는게 가능은 합니다) commit 전에 중간 상태에 저장할 수 있도록 하는 것이다. 즉, commit은 해당 개발이 완전 완료 됬을때 하는 것이기 때문에, 아직 완료는 안되었지만 그래도 중간 상태를 저장할 필요가 있을때 staging을 사용하는 것이다.

Basic Git Commands

git init
프로젝트를 git repository로 만들기 위해서 사용하는 명령어 이다. 여기서 프로젝트(project)라 함은 개밸하고자 하는 소스코드들이 있는 디렉토리를 말한다. git init을 해서 git repo로 만들어야 git으로 버전 관리가 시작된다.

git add
수정 사항들, 즉 modified 파일들을 staged 상태로 옴기고자 할때 사용하는 명령어 이다. 또한, git repo에 새로이 추가된 파일들을 staged 상태로 옴길때도 사용된다. 새로이 추가된 파일들은 "untracked" 파일 이라고 하는데, git에서는 이들도 수정 사항이라고 보는 것이다.

git commit
staged 된 파일들을 commit 하고자 할때 사용하는 명령어 이다.

git diff
어떤 수정 사항들이 적용됬는지 보고자 할때 사용하는 명령어 이다. 참고로 staged 된 수정 사항들은 git diff로 볼 수 없다. Modified 된 파일들만 git diff로 볼 수 있다.

git status
현재 상태를 보여주는 명령어 이다. 어떠한 파일들이 modified가 되었고 어떠한 파일들이 staged가 되었는지 등의 전체적인 상황을 보여준다.

git log
Commit 내역들을 보여준다.Commit history라고도 한다. git log를 통해 이제까지 커밋 내역들을 전부 볼 수 있다. 다만 출력되는 포맷이 보기가 쉽지가 않아서 tig 같은 tool을 사용하면 훨씬 편리합니다.

git rm
원하는 파일을 git repo에서 삭제합니다.

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

git branch
Branch를 생성할 때 사용됩니다.

git checkout
어떤 branch를 checkout 할때 사용되는 명령어입니다.

Branch & Merging

git을 사용할때는 branch 기반으로 개발하기 때문에 Git 에서 branch는 굉장히 중요한 컨셉이며 꼭 이해하는 컨셉이다. Git branch를 이해할려면 먼저 git이 어떻게 데이터 (수정사항들)을 저장하는지를 알아야 한다.

Git은 데이터를 딘슨한 변경사항(diff)으로 저장하지 않는다. Git은 파일의 스냅샷의 연속으로 저장한다. Git은 새로 commit이 들어오거나 프로젝트의 상태를 저장할 때마다 파일이 존재하는 그 순간을 중요하게 여깁니다. 그래서 파일이 달라지지 않았으면 git은 빠른 성능을 위해서 파일을 새로 저장하지 않고 이전 상태의 파일에 대한 링크만 저장한다. 즉, 수정 사항만을 저장하는게 아니라 파일의 스냅샷(snapshot)을 시간순으로 저장하는 것이다.

그리고 변경사항을 볼때는 현재 스냅샷과 이전 스냅샷을 비교하여 변경사항을 볼 수 있는 것이다.

이렇게 스냅샷으로 저장되어 있기 때문에, 개발자가 central server에서 새로 repo를 checkout 받으면 해당 리포의 어느 특정한 시점의 (일반적으로 가장 최신) 스냅샷을 checkout 받는것이다.

그러면 여기서 질문이 생길 것이다. 개발자들이 각자 snapshot을 checkout 받아서 개발을 하면 어떻게 서로의 변경사항들을 조율을 할수 있을까? 즉 서로의 변경사항들을 합쳐서 새로운 최신 버전의 스냅샷을 만드는 과정이 필요한데, 문제는 어떤 스냅샷을 기준으로 변경사항들을 합치느냐 하는 문제가 생긴다.

그래서 이러한 문제를 해결하기 위해 branch를 사용한다. Branch는 나뭇가지 혹은 분점 을 뜻한다. 즉 기본이 되는 큰 줄기가 있고 그 줄기로 부터 옆으로 가지가 나는걸 뜻 한다. Git의 branch 모델이 바로 이러한 구조이다. 기준이 되는 스냅샷이 있다. 이 기준을 master branch라고 한다. 그리고 각 개발자는 master branch를 checkout 먼저 하고, master branch로 부터 자신만의 branch를 만든다. 이걸 feature branch라고 한다. 그리고 feature branch를 기반으로 개발을 한 후 개발이 완료가 되고 commit을 하면 자신의 feature branch를 다시 master branch로 합하게 됩니다. 이렇게 합하는 과정을 merge 한다고 한다.

정리:

  • Matser branch를 check out 한다.
  • 자신만의 feature branch를 만든다.
  • Feature branch에서 개발을 한다.
  • 완료되면 commit 한다.
  • Master branch에 feature branch를 merge 한다.

Git 실행해 보기

  • 새로운 저장소 만들기
    폴더를 하나 만들고, 그 안에서 아래 명령을 실행하세요.
    git init
    새로운 git 저장소가 만들어집니다.

  • 저장소 받아오기
    로컬 저장소를 복지(clone)하려면 아래 명령을 실행하세요.
    git clone / 로컬 / 저장소 / 경로
    원격 서버의 저장소를 복제하려면 아래 명령을 실행하세요.
    git clone 사용자명 @호스트:/원격/저장소/경로

  • 추가와 확정 (commit)
    변경된 파일은 아래 명령어로 (index에) 추가할 수 있어요.
    git add <파일 이름>
    git add .

    이게 바로 git의 기본작업 흐름에서 첫 번째 단계이다.
    하지만 실제로 변경 내용을 확정하려면 아래 명령을 내려야 한다.
    git commit -m "이번 확정본에 대한 설명"
    이제 변경된 파일이 HEAD에 반영되었다.
    하지만 원격 저장소에는 아직 반영이 안됐다.

  • 변경 내용 발행(PUSH)하기
    현재의 변경 내용은 아직 로컬 저장소의 HEAD안에 머물고 있다.
    이제 이 변경 내용을 원격 서버로 올려보자.
    git push origin master
    (다른 가지를 발행하려면 master를 원하는 가지 이름으로 바꿔주면된다.)
    만약 기존에 있던 원격 서버의 주소를 git에게 알려줘야 한다.
    git remote add origin <원격 서버 주소>
    이제 변경 내용을 원격 서버로 발행할 수 있다.

  • 가지(branch)치기
    가지는 안전하게 격리된 상태에서 무언가를 만들 때 사용한다.
    우리가 저장소를 새로 만들면 기본으로 master 가지가 만들어 진다.
    이제 다른 가지를 이용해 개발을 진행하고, 나중에 개발이 완료되면 master가지로 돌아와 병합하면된다.
    아래 명령으로 "feature_x"라는 이름의 가지를 만들고 갈아탑니다.
    git checkout -b feature_x
    아래 명령으로 master가지로 돌아올수 있다.
    git checkout master
    아래 명령으로는 가지를 삭제할 수 있다.
    git branch -d feature_x
    우리가 새로 만든 가지를 원격 저장소로 전송하기 전에는 다른 사람들이 접근 할수 없다.
    git push origin<가지이름>

  • 갱신과 병합(merge)
    우리의 로컬 저장소를 원격 저장소에 맞춰 갱신하려면 아래 명령을 실행하면된다.
    git pull
    이렇게 하면 원격 저장소의 변경 내용이 로컬 작업 디렉토리에 받아지고 (fetch), 병합(merge)된다.
    다른 가지에 있는 변경 내용을 현재 가지(에를들면, master가지)에 병합하려면 아래 명령을 실행하면된다.
    git merge <가지이름>
    첫번째 명령이든 두번째 명령이든, git은 자동으로 변경 내용을 병합하려고 시도한다.
    문제는 항상 성공하는 게 아니라 가끔 충돌(conflicts)이 일어나기도 한다는 거다.
    이렇게 충돌이 발생하면, git 이 알려주는 파일의 충돌 부분을 우리가 직접 수정해서 병합이 가능하도록 해야한다.
    충돌을 해결했다면, 아래 명령으로 git에게 아까의 파일을 병합하라고 알려주면된다.
    git add <파일이름>
    변경 내용을 병합하기 전에, 어떻게 바뀌었는지 비교해 볼수 있다.
    git diff <원래가지><비교대상가지>

  • 로컬 변경 내용 되돌리기
    만약 우리가 실수로 무언가 잘못한 경우, 아래 명령으로 로컬의 변경 내용을 되돌릴 수 있다.
    git checkout -- <파일이름>
    위 명령은 로컬의 변경 내용을 변경 전 상태(HEAD)로 되돌려 준다.
    다만, 이미 인덱스에 추가된 변경 내용과 새로 생성한 파일은 그대로 남는다.
    만약, 로컬에 있는 모든 변경 내용과 확정본을 포기하려면, 아래 명령으로 원격 저장소의 최신 이력을 가져오고, 로컬 master가지가 저 이력을 가리키도록 할 수 있다.
    git fetch origin
    git reset --hard origin/master

——————————

  • git clone 깃 주소
  • cd git3(깃 )
  • git branch feature/GGH (git branch 생성)
  • vi GGHpython.py (파일생성해서 작성)
  • git checkout feature/GGH
  • git add .
  • git commit -m “설명”
  • git push origin feature/GGH
    ——————————

commit 충돌시

  • 현재 branch 상태에서 최신 마스터를 당기면된다.
  • git pull origin master
  • vi README.md (:wq)
  • git add .
  • git commit -m “설명”
  • git push origin feature/GGH

참고
https://stackoverflow.com/c/wecode/questions/299
https://rogerdudler.github.io/git-guide/index.ko.html
https://gist.github.com/480/4681b67d2a906db8c6c1321cc678f05f

profile
기록하는 습관

0개의 댓글