Git이 커밋(Commit)을 관리하는 방식   

 

  git은 두 명 이상의 사람이 동시에 버전 관리를 할 때에도 서로의 작업물에 의존하지 않고 내가 원할 때 코드를 올리고 수정하고 협업자의 코드와 합칠 수 있다. 즉, 병렬적으로 버전 관리를 할 수 있다.

 

 그렇다면 어떤 원리로 작동할까? 우리는 커밋을 통해 코드의 변경사항을 하나로 덩어리로 묶을 수 있었다. 이러한 커밋들은 바로 전 커밋을 가리키며 시간순으로 쌓이게 된다. 

 

 

 혼자서 작업한다면 위의 그림처럼 한 줄로 계속 커밋이 쌓인다. 하지만, 협업을 통해 버전 관리를 한다면 한 줄로 커밋이 쌓일 수 없다. 커밋 3을 기준으로 두 명이서 각각 파일을 수정해 커밋을 한다고 가정하면 아래 그림과 같이 될 것이다.

 

 

 

 이렇게 특정 기준에서 나누어 작업할 수 있는 기능을 브랜치(Branch)라고 한다. 만약 브랜치를 만들지 않고 둘 다 커밋을 하면 원격 저장소에 먼저 푸시한 커밋(커밋 4)은 정상적으로 올라가고, 뒤늦게 푸시한 다른 커밋(커밋 5)은 "너는 낡은 코드에 푸시를 하는 것이다. 최신 코드에 푸시하라"라는 오류가 난다. 

 


 

 

   Git에서 관리하는 파일의 4가지 상태 (1)   

 

  git이 파일을 추적하고 스테이지에 올리는지 과정을 살펴본다. 먼저, 프로젝트 폴더에 git 초기화를 하고 README.md와 app.js를 생성한다고 가정하고 모두 한 번도 커밋되지 않은 상태이기 때문에 파일 상태는 추적 안됨(untracked)이다. 

 

 

  다음으로, add 명령어를 통해 두 파일 모두 스테이지에 올리면 파일 상태는 스테이지됨(staged)으로 바뀐다. 

 

 

  다음으로, commit 명령어를 통해 하나의 버전으로 만들면 파일 상태는 수정 없음(unmodified)으로 바뀐다. 수정 없음으로 된 파일은 다시 수정을 할 수 있다.

 

 

 

  마지막으로, 다른 사람도 함께 협업 하기위해 push 명령어를 통해 원격 저장소에 업로드 하면 파일 상태는 그대로이다.

 

 

 

 


 

   Git에서 관리하는 파일의 4가지 상태 (2)   

 

  위에서 했던 작업에서 더 많은 작업을 한다고 가정한다. app.js 파일을 수정해서 파일 상태를 수정 없음(unmodified)에서 수정함(modified)로 바꾸고 app.css 파일을 새로 만들어 준다. 새로 만들었기에 파일 상태는 추적 안됨(untracked) 상태이다. 

 

 

   변경사항이 없는 README.md 파일은 스테이지에 올릴 수 없지만 add 하지 않아도 이미 올라가 있는 상태이며 나머지 두 파일은 모두 스테이지에 올린다. 이 때, 두 파일 상태는 스테이지됨(staged)로 변경된다. 

 

 

  커밋을 통해 버전을 또 하나 생성한다. 이 때의 커밋은 앞서 만든 커밋인 "프로젝트 초기화"와 연결되어 있기 때문에 git은 쉽게 app.js가 수정되었고 app.css가 추가되었다는 것을 알 수 있다. 커밋을 했기 때문에 세 파일 모두 수정 없음(unmodified) 상태로 변하게 된다.

 

 

  마지막으로,  push 명령어를 통해 원격 저장소에 업로드 한다. 이 때, 파일 상태는 그대로이다.

 

 


   정리   

  

 요약하자면 untraked(추적 없음), staged(스테이지됨), modified(수정함), unmodified(수정 없음), 총 4가지의 파일 상태가 존재하고 각각의 특징은 다음과 같다.

 

 

 

   SVN과 Git의 가장 큰 차이점   

 

  하나의 버전을 만들기 위해 Git에서는 다음과 같은 과정을 진행합니다.

 

    1. 변경서항을 선택(add) - 스테이지에 올리는 작업

    2. 선택한 변경사항을 하나로 묶어 버전으로 만들기(commit)

  

  하지만 커밋 객체에 변경사항의 묶음이 저장되어있지 않다. 변경사항만 부분적으로 저장하는게 아니라 변경된 파일이 통째로 저장되어 있다. 바뀐 것만 저장하면 될 것 같은데 왜 용량을 더 차지하게 파일을 전부 저장할까?

 

  Git이 등장하기 전에는 SVN(SubVersion)과 같은 버전 관리 시스템이 제일 많이 쓰였다. 이 둘의 가장 큰 차이점은 아래 그림과 같이 변경사항만 저장하는가이다. 

 

 

 단순하게 생각하면 전체를 저장하는 Git보다는 차이점만 저장하는 SubVersion 방식이 용량 면에서도 좋고 속도도 빠를 것 같지만 조금 더 생각해보면 SubVersion 같은 방식은 버전을 보여줄 때 파일이 만들었던 맨 처음부터 거슬러 올라가 바뀐 점을 모두 반영해야 한다는 불편함이 있다.

 

 예를 들어, SubVersion에서는 README.txt 파일이 백 번 바뀌었다면 백 번의 계산을 모두 해야한다. 하지만 Git은 바로 앞에서 바뀐 커밋이랑 비교하는 연산 한번 만 하면 된다. 그리고 바뀌지 않은 파일은 링크만 저장하기 때문에 용량도 적고 계산하지 않아도 된다. 

 

   소스트리에서 변경된 사항 커밋(Commit)   

 

  파일을 수정하고 소스트리를 확인해보면 다음과 같이 변하게 된다. 빨간색 부분을 자세히 보면 

     

       1. 아까와는 다르게 커밋하지 않은 변경사항이라는 텍스트가 보인다.

       2. 스테이지에 올라가지 않은 파일 부분에 수정한 파일들의 목록을 확인할 수 있다. 

 

 

  이제 버전 관리를 위해 초록색 부분의 커밋 버튼을 누른다. 커밋을 누르면 첫 번째 사진과 같은 화면으로 바뀌게 되고 여기서 커밋을 하고자 하는 파일을 [+] 버튼을 이용해서 스테이지에 올리거나 [모두 스테이지에 올리기] 버튼을 이용해서 수정한 모든 파일을 스테이지에 올린다.

 

[커밋] 스테이지에 파일을 추가하기 전

 

[커밋] 스테이지에 파일을 추가한 후

 

  수정한 파일을 스테이지에 올렸으면 이제 진짜 커밋을 생성해야 한다. 맨 아래에 커밋 메세지를 작성하고 커밋 작성 버튼을 누르면 커밋이 생성된다. 이것은 CLI 환경에서 git commit -m "index.js API 경로 추가"와 동일하다. 

 

커밋 메세지 작성

 

  커밋을 생성하면 다음과 같이 "커밋할 내용 없음"이라는 화면이 뜬다. 그리고 [히스토리]탭으로 가면 커밋 내역이 업데이트 된 것을 알 수 있다. 아직 원격 저장소에 올리는 Push 작업을 하지 않았으므로 로컬 저장소와 원격 저장소의 버전이 다른 것을 알 수 있다. 그리고 밑으로 가면 실제 커밋한 내용에 대한 정보를 확인할 수 있다. 그리고 맨 위 초록색 부분인 Push 버튼의 상태가 바뀐 것을 확인할 수 있다. 

 

 

 


 

   소스트리에서 커밋을 원격저장소 푸시(Push)  

 

 

 

 

  위에서 로컬 저장소의 버전과 원격 저장소의 버전이 다르다고 하였는데 자세히 살펴보면, 로컬 저장소 버전은 master라는 꼬리표가 붙어있고 원격 저장소 버전에는 origin/master라는 꼬리표가 붙어있다. origin은 연결한 github 원격 저장소의 별명이다.

 

 예전에 git remote add origin github 주소 라는 명령어를 수행했었다. 이것은 origin이라는 이름으로 해당 github 주소의  원격 저장소를 추가하라는 명령어이다. 만약,  git remote add orange github 주소라고 입력했으면 origin 대신 orange라는 별명이 보였을 것이다. 정리하면 origin 꼬리표는 원격 저장소의 현재 버전 상태를 가리키는 커밋에 붙어있다고 할 수 있다. 

 

 master는 커밋을 올리는 줄기의 이름이다. [히스토리]탭으로 가면 커밋이 하나의 줄기로 이어져 있는 것을 볼 수 있다. 따로 줄기를 생성하지 않으면 git은 master라는 기본 줄기에 커밋을 올리게 된다. 

 

 종합해보면 맨 처음 master는 내 컴퓨터 로컬 저장소의 버전을 그 다음 origin/master는 github 원격 저장소의 버전을 가리키는 것이다. 따라서 위 사진에서는 내 컴퓨터의 로컬 저장소의 버전은 'index.js API 경로 추가'인데 원격 저장소의 버전은 하나 이전인 'index.js 경로 추가' 상태라는 것이다. 

 

 이제 새로 생성한 커밋을 초록색 부분의 Push 버튼을 눌러 원격 저장소에 업로드해보면 다음과 같은 화면이 뜬다. 

 

 

  위 화면에서 master에 해당하는 체크박스를 체크하고 Push 버튼을 누르면 업로드하는 과정이 나오게 되고 업로드가 완료된다. 이 동작은 git push origin master와 동일하다. [히스토리] 탭으로 가면 원격 저장소에도 최신 커밋 상태가 반영된 것을 확인 할 수 있다. 

 

 

   소스트리에 로컬 저장소를 추가   

 

  소스트리를 실행하고 상단 탭을 보면 아래 그림과 같은 탭이 있을 것이다.

 

 

  셋 다 소스트리에 저장소를 추가하는 방법인데, 각각의 역할은 다르다.

 

 

  [로컬 저장소를 소스트리에 Add]

 

    1. 탭에서 [Add] 버튼을 누른다.

    2. 작업 경로란에 작업했던 폴더를 선택하여 추가한다.

 


 

   로컬저장소의 핵심은 .git 폴더   

 

  Git은 로컬 저장소인 .git 폴더에 버전 관리한 내용과 원격 저장소의 주소 등 필요한 정보를 저장한다. 

 

 

 

 

   소스트리 설치   

 

 소스트리(Source Tree) GUI 환경에서 git을 사용할 수 있는 프로그램이다. 커밋, 푸시, 브랜치 등을 CLI와 같이 명령어를 입력하여 실행하는 것이 아닌 버튼을 클릭하는 방식으로 실행된다.  

 

  [소스트리 설치 - Window 버전]

 

    1. https://www.sourcetreeapp.com/ 에 접속하여 [Download for Window]를 클릭한다.

    2. 다운로드가 완료되면 [Atlassian 소프트웨어 라이선스 계약 및 개인정보 보호정책]에 체크를 하고

        Download 버튼을 누른다.

    3. Registration 항목에서 Bitbucket을 선택하고 다음을 누른다. 아틀라시안(Atlassian) 계정 창이 뜨면 회원

        가입을하고 로그인을 한다. [grant aceess] 버튼을 누르면  Authentication Successful이라는 화면이 나

        오게 되고 인증에 성공한다.

    4. 도구설치 항목에서 Mercurial 항목을 체크를 해제하고 다음을 누른다. 

    5. 소스트리에서 Git을 사용할 때 기본 계쩡으로 사용할 Git 계정을 설정하는 화면이 나오고 예전에 작업했던

       git config --global user.email 과 name에 입력했던 내용을 입력한다.(아마 자동으로 입력되어있을 것이

       다.)

    6. SSH 키를 불러오겠냐는 확인창에서는 아니오를 누른다. 

 

 


 

   소스트리에서 Github 로그인 하기   

 

  [Github 로그인]

 

    1. 소스트리 좌측의 계정에서 마우스 오른쪽 버튼을 클릭하고 [계정 편집] 메뉴를 선택한다. 

    2. [호스팅 계정 편집] 창이 뜨면 호스팅 서비스를 Github로 바꿔주고 하단에 [OAuth 토큰 새로고침] 을 클릭

        한다.

    3. Github 인증을 마치면 실제 원격 저장소 목록이 나온다. 

    4. 도구설치 항목에서 Mercurial 항목을 체크를 해제하고 다음을 누른다. 

 

 

 

 

 

 

 

   로컬 저장소   

 

 로컬저장소는 git으로 버전 관리가 이루어질 내 컴퓨터 내에 있는 폴더를 말한다.

 

  [1. 로컬 저장소 생성]

 

    1. 컴퓨터 내에 작업할 프로젝트 폴더를 하나 만든다.

    2. README.md 파일을 하나 만든다. (내용은 자유)

    3. 폴더에 오른쪽 우클릭 후 git bash here을 클릭한다.(윈도우 기준)

    4. git bash 터미널 창에 git init 명령어를 입력한다. 

     

      $ git init

 

           - Initialized empty git repository라는 텍스트가 나오면 성공하며 프로젝트 폴더에는 .git이라는 폴더가

              자동으로 생성된다.

           - 이 폴더에는 버전들의 정보, 원격저장소의 주소 등이 저장되어 있고 이 .git 폴더를 로컬저장소라고 부른

             다. 

 

 

  [2. 정리]

       - git init 명령어를 통해 로컬 저장소를 만들면 그 때부터 이 폴더에서 버전 관리를 할 수 있다.  

 


 

   커밋(Commit) 하기   

 

 방금 생성했던 README.md 파일을 하나의 버전으로 만든다고 하면 Git에서는 이렇게 생성된 각 버전을 커밋(Commit)이라고 부른다.

 

 

  [1. 커밋 하기]

 

    1. git bash 명령어 창에서 다음과 같은 명령어들을 입력한다. (반드시 github 계정과 동일하게 입력)

 

       $ git config --global user.email "생성한 github "계정의 이메일"

       $ git config --global user.name"생성한 github "계정의 이름"

 

    2. 커밋에 추가할 파일을 선택하는 명령어를 입력한다.

 

       $ git add README.md

       - 수정된 파일을 모두 추가하고 싶다면 $ git add . 을 입력한다.

 

    3. 아직, 커밋할 파일만을 추가했지 진짜 커밋은 수행하지 않은 상태이다. 커밋을 할 때에는 상세 설명을 적을

        수 있으며 이 상세 설명을 적어놓음으로써 왜 이 파일을 생성했고 수정했는지 알 수 있고 해당 버전을 찾아 그

       버전으로 돌아가기에도 수월하다.

 

       $ git commit -m "README.md 파일 작성"

 

 

 

  [2. 수정하고 다시 커밋 하기]

 

    1. README.md 파일을 수정한다.

 

    2. 커밋에 추가할 파일을 선택하는 명령어를 입력한다.

       

        $ git add README.md

 

    3. 커밋 명령어를 입력한다. 

       

        $ git commit -m "README.md 파일 수정"

 

 

 

   다른 커밋으로 바꾸기   

 

 지금까지는 커밋이 2개가 생성이 되었고 README.md 파일은 두 번째 커밋의 내용이다. 이 파일을 다시 첫 번째 커밋 상태로 되돌리는 작업을 합니다.

 

  [커밋 바꾸기]

 

    1. 이제까지의 커밋 내역을 확인한다.

 

       $ git log

 

 

       - 두 개의 커밋 내역을 확인 할 수 있다.

       - 또한, git log 명령어는 최신 커밋부터 나타나는 것을 알 수 있다.

 

 

    2. 첫 번째 커밋으로 되돌리기 위해 첫 커밋 아이디의 앞 7자리를 복사하고 checkout 명령어로 해당 커밋으로

        되돌린다. 

 

       $ git checkout 89e861f

 

       

       - 다음과 같이 마지막 줄에 HEAD 절이 나오면 제대로 커밋된 것이다. 

       - 다시 두 번째 커밋으로 돌아가려면  $ git checkout b06801f 또는 $ git checkout - 을 사용한다.

 

 


 

   원격 저장소 생성 및 푸쉬(Push)  

 

  원격저장소는 git으로 버전 관리가 이루어질 github 웹 사이트 프로젝트를 위한 공용 폴더를 말한다. github에서는 레포지토리(Repository)라고 부른다. 

 

 

  [원격 저장소 생성하고 커밋 올리기]

 

    1. github에 로그인하고 상단 + 아이콘을 클릭한 후 [New Repository] 메뉴를 선택한다. 

    2. 옵션을 선택한 후 [Create Repository] 버튼을 클릭한다. 레포지토리가 생성되면 주소가 나온다.

        (필자는 https://github.com/daldalhada/git.git)

 

    3. git bash에서 로컬 저장소에 원격 저장소 주소를 알려주는 git remote add origin github 주소 명령어를

       입력한다.

 

 

    4. 로컬 저장소에 있는 커밋을 git push origin master 명령어로 원격 저장소에 올린다. 

 

 


 

   원격 저장소 커밋을 로컬 저장소에 내려받기(Pull)   

 

 원격 저장소의 코드와 버전 전체를 내 컴퓨터(로컬 저장소)에 내려받는 것을 클론(Clone)이라고 한다. 새로운 폴더(B)를 만들고 다음 명령어를 입력해 보자.

 

         $ git clone [git 주소] . 

 

 여기서 주의해야 할 점은 주소를 입력한 뒤 .을 붙이는 것인데 .을 붙이지 않으면 git이라는 새로운 폴더가 만들어지고 그 안에 파일들과 .git 폴더가 생성된다. 따라서, 반드시 .를 붙여서 현재 폴더 안에 작업할 수 있도록 해준다.

 

 클론 작업이 끝나면 원래 폴더(A)로 다시 바꾸고 README.md를 수정하고 다시 커밋하고 푸쉬해보자.

 

         1. $ git add README.md

         2. $ git commit -m "README.md 파일 수정2"

         3. $ git push origin master

 

  이 작업까지 끝나면 원격 저장소에 수정된 README.md 파일로 업데이트가 된다. 다시 새로운 폴더(B)로 바꾸어 pull 명령어를 사용하여 원격 저장소의 업데이트된 파일들을 로컬 저장소에 저장해보자.

 

         $ git pull origin master

 

 pull 작업이 완료되면 로컬 저장소의 파일들은 원격 저장소의 파일들과 동일한 버전이 된다.

'버전관리 > Git' 카테고리의 다른 글

1. 버전 관리란?  (0) 2020.08.27

 

   버전관리란 무엇인가?   

 

 한번쯤은 다들 Ctrl + Z를 이용하여 작업한 것을 전 단계의 시점으로 수정해본 적이 있을 것이다. 이전 단계로 되돌리는 것을 넘어서 내가 원하는 시점(버전)으로 이동할 수 있게 해주는 것버전 관리 혹은 소스 관리라고 한다.  이러한 "버전"을 통해서 시간적으로 변경 사항과 그 변경 사항을 작성한 작업자를 추적할 수 있다.

 

 

   버전관리가 왜 필요할까?   

 

 물론, 개인 컴퓨터에서 혼자 작업하고 변경하는 프로그램이라면 버전 관리가 필요없다. 개인이 작업해 놓은 것을 기억할 수 있고 남에게 알릴 필요도 없기 때문이다. 하지만, 팀 단위에서의 작업은 얘기가 달라진다. 팀 프로젝트에 참여 인원수가 많고 프로젝트의 범위가 넓어지고 기간이 길어질 경우에 에러가 발생했을 때의 지점을 확인하려고 하면 확인할 길이 막막해진다. 따라서, 여럿이 함께 작업하는 협업 프로젝트에선 버전 관리가 필요하다.

 


 

   Git의 등장   

 

 

 위에서 설명한 것들은 소스코드 버전 관리 시스템인 git을 통해 버전 관리가 가능해졌다. git은 데이터를 저장할 공간만 있으면 어디서나 사용할 수 있다. 이처럼 git으로 관리하는 프로젝트를 올려둘 수 있는 git 호스팅 사이트에는 github, gitlab, bitbucket 등 여러가지가 있다. 이 중에서도 github는 전 세계 최대 규모의 호스팅 사이트이다. github에 프로젝트를 오픈 소스로 만들면 전 세계 개발자와 협업할 수 있다. 

 

 

   Git 설치   

 

  (1) 윈도우

 

     1. https://git-scm.com/downloads에 접속해서 Download 버전 for Windows를 클릭한다.

     2. 설치 팝업창이 뜨면 [Next]버튼을 누르고 마지막 설치 화면에선 [View Release Notes]를 체크하지 않고

        [Finish] 버튼을 클릭해서 설치를 완료한다.

     3. git bash를 실행해 명령어 창에 git을 입력 후 제대로 출력되는지 확인한다. 

 

 

  (2) 맥/리눅스/유닉스

 

    1. https://git-scm.com/downloads에 접속해서 Download 버전 for 맥/리눅스/유닉스를 클릭한다.

    2. terminal을 실행해 명령어 창에 git을 입력 후 제대로 출력되는지 확인한다.

       (윈도우처럼 git bash를 설치하지 않고도 기본 터미널에서 CLI로 git을 다를 수 있다.)

'버전관리 > Git' 카테고리의 다른 글

2. 로컬, 원격저장소 만들고 활용하기  (0) 2020.08.27