업데이트:

태그: ,

카테고리:

git

git은 리누스 토르발스가 리눅스의 커널 소스코드를 유지 보수하고 개발하기위해 만들어졌다.

개발자가 되기위해 공부할때 git은 외면당하기일수이다.

왜냐하면 공부를 하면서 정리하는 것은 크게 정리가 필요하지 않고, 버전을 나누는게 굳이 필요하지 않다.

하지만, 다른 개발자와 협업을 하기위해선 세세한 버전관리가 필요하다.

각각 어떤 작업언제했고, 어떤 이유로 이 코드를 작성했는지 쉽게 파악할 수 있어야하고,

유지 보수기능 개발을 잘 할 수 있어야한다.

한 기능과 서비스를 개발하기 위해 수많은 개발자가 수많은 코드를 작성하게된다.

minishell 프로젝트는 위와 같은 개발 프로세스의 아주 작은 부분을 간접적으로 진행해볼 수 있다.



기본적인 개념

크게 3가지의 추상적인 공간이 존재한다.

  • Repository
    • 버전이 저장되는 곳.
    • .git 폴더가 존재하는 디렉터리를 의미하기도 한다.
    • .git 폴더 안에 프로젝트의 history가 저장된다.
  • Staging Area(index)
    • commit되기 전에 대기하는 영역을 의미한다.
    • 이 영역이 유용한 이유는 commit 전에 파일을 검토할 수 있다는 점이다.
  • Working Tree
    • 작업중인 파일들로 구성된다.
    • 파일을 볼 수 있고, 수정할 수 있는 파일시스템이라고 생각하면된다.



기본 명령어

  • git init
    • 버전정보와 history가 담긴 .git폴더와 그 안에 파일을 생성한다.
    • git project를 시작한다.


  • git status
    • 추적되지 않은(untracked)된 파일을 추적한다.
    • 최신의 커밋과 현재 working tree의 차이를 보여준다.


  • git add [file] = commit전에 파일을 staging area에 올린다.
    • 보통 git add .으로 사용하기도 한다.


  • git commit -m [commit message]
    • staging area에 있는 파일을 repository로 이동한다.
    • git commit -am 으로 사용하기도 하는데, untracked된 파일(add로 한 번이라도 추가되지 않은 파일)은 커밋되지 않는다.
    • –amend 옵션을 넣으면 이미 커밋된 메세지를 수정할 수 있다.


  • git log
    • 커밋된 메세지와 함께 커밋의 해시값을 나타낸다.
    • git log –stat
      • git log와 더불어 세세한 수정사항까지 보여준다.


  • git diff
    • 최신 커밋과 현재 working tree간의 차이를 보여준다.


  • git checkout
    • [커밋 해시값]을 통해 해당 커밋상태로 현재 working tree의 상태를 되돌린다.
      • HEAD가 해당 커밋에 놓이게되는데, 변경되지 않는 수정사항은 유지된다.
      • 되돌아오고 싶다면 - 를 하면 된다.
    • [브랜치명]으로 해당 브랜치로 working tree로 변경할 수 있다.


  • git reset –hard
    • 최신 커밋과 working tree의 차이를 원래대로 되돌린다.
    • –hard옵션의 경우, staging area의 trachked된 수정사항을 없애고, untracked 파일은 삭제한다.
    • –soft, –mixed는 staging area와 working tree의 파일을 건드리지 않는다.


  • git revert
    • 커밋을 되돌리는 커밋을 하는 것을 의미한다.
    • 여러개의 커밋을 되돌리려면 역순으로 모든 커밋을 되돌려야한다.



branch

기본적으로 git project를 시작하면 master branch로 시작한다.
이는 설정에따라 다를 수 있다.

  • git branch
    • 존재하는 branch들을 나열한다.
    • 현재 branch는 *과 함께 녹색으로 표시된다.
    • HEAD가 가리키는 곳에서 branch를 나누게된다.
    • branch가 나뉘는 순간 분기가 나뉘게되는데,


  • git merge
    • branch 간의 변경사항을 합친다.
    • merge하기 위해선 branch간의 공통의 조상이 필요하다.
    • 이 공통의 조상을 base라고 부른다.
    • base에서 분기된 branch 각각의 변경사항을 합쳐서 커밋하는 것을 merge commit이라 한다.
    • merge 명령어는 합쳐지는 브랜치가 아닌, 합치는 브랜치에서 실행한다.


  • 주의사항
    • merge 될 때, 같은 파일이라도, 내용이 다르면 두 파일의 다른 점 수정사항이 모두 합쳐진다.
    • 하지만 git은 같은 파일의 같은 줄에 동시에 수정사항이 있다면 자동으로 합치지 못한다.
    • 그런데, 같은 파일의 같은 줄에 서로 다른 내용이 있다면 conflict가 발생한다.
    • 이때, git은 automatic merge를 하지 못하므로, 이 충돌을 바로잡아야한다.
    • 충돌이 발생하면 git이 해당하는 부분을 플래그로 덮어씌우므로, 해당 부분을 수정하면된다.


  • 3way merge
    • git이 conflict를 해결하는 방법
    • 2way merge방식은 가능한 경우의 수 4개 중, 두 branch의 내용이 같은 부분만 automatic merge가 이루어진다.
    • 3way merge는 branch의 공통의 조상(base)이 비교에서 추가된다.
    • 이에따라, 2 branch를 merge하면서 수정사항의 비교대상이 base가 추가되기때문에, 수정이 이루어진 파일을 쉽게 파악할 수 있다.


  • 외부도구를 이용한 병합

댓글남기기