Ver1. 변화, 복제, 변조의 지옥이 특별매니저(git)

Edwin·2023년 1월 28일
1
post-thumbnail
  • 본내용은 (생활코딩) 강의를 기반으로 한 요약정리입니다.
    생활코딩 Git

01 git이란 무엇인가?

1) 정보 버전관리 시스템 체계

리눅스 개발자 중에 한 명인 리누스 토르발스는 2005년 Git(정보버전관리자)을 세상에 처음 소개하며 "The Information manager From Hell"라고 하였다. 생각해보자. 26년동안 약 1만명의 엔지니어가 2천만줄이 넘는 소스코드를 작성했다고 한다. 바로 소스코드가 거처를 삼은 곳이 '리눅스'이다. 토르발츠는 수많은 소스코드들의 관리를 위해서 git을 만들었다. git에는 3가지 큰 포인트가 있는데, 코린이에게 이 세가지 포인트는 git에 대한 큰 그림을 잡기에 좋은 핵심요소들이 될 것이다.

  • 첫째, 버전관리
  • 둘째, 백업하기
  • 셋째, 협업하기

git에 대해서 조금 사전에 공부하고 정리하는 입장에서 볼 때, git은 정말 엄청난 것이었다. 12년동안 신학관련레포트들을 생성하면서, 파일하나 만으로 기록했던 시절이 있었다. 글을 쓰다보니 어제 기록했던 글이 이상한 부분이 있어서 어제 부분을 쏵 지우고, 새롭게 그 위에 기록했다. 그리고 저장을 해버렸다. 그 순간 지워진 부분에서 기록했던 너무나 멋있는 문구가 있었는데 되살리지 못하는 상황이 되었을 때, 슬펐다. 그 후로는 파일을 ver1, ver2 등으로 복제하여 기록한 부분이 기억이 있다.

코드를 기록하는 부분에 있어서 git은 작게 보면, 이렇게 생성된 수많은 ver1, ver2, ver3 등을 생성함으로 프로젝트의 안전한 진행을 돕는다. 그러나 정말 단순하게 새로 생성한 버전만 관리했다면 git이 오늘날 개발자 세계에서 살아남지는 못했을 것이다. git을 사용하다보면 이러한 관리까지도 가능하다.

대표적으로 git은 ver1과 ver2 사이의 상관관계를 가시적으로 보여준다. ver2가 ver1에서 추가된 내용이 무엇인지, 그리고 삭제된 내용이 있다면 어떤 부분이 삭제 되었는지까지도 git은 보여준다. 여기서 가장 핵심은 ver1과 ver2가 가지고 있는 파일이 동일한 파일이라도, git은 해당 파일의 과거를 추적하여 현재의 상태와 비교해 줌으로, 코드를 관리하고 기록하는 부분에 있어서 효과적인 프로그램이 되었다. 뿐만 아니다. ver1에서 사용했던 파일들을 그룹화 하여 보여주고, ver2에서 파일을 추가하였다면 추가된 파일들을 그룹화 하여 보여준다. 즉 파일의 내용뿐 아니라, 파일의 추가제거 유무까지도 버전별로 확인이 하는하다는 것이다. 그러기에 git은 오늘날 실무에서 필수적으로 사용되는 프로그램 중 하나이다. git에 대해서 하나씩 개념을 정리하며 나아가 보자.

2) commit 버전 생성하기 및 관리하기

먼저 git은 오리지널, 즉 git 그 자체의 프로그램이 존재한다. 해당 프로그램은 GUI환경에서 다루는 프로그램이 아니라, window의 CMD(명령프롬프트), Mac의 Terminal에서 명령어로 직접 명렁을 선언하며 관리하는 프로그램이다. 오리지널 이외의 git관련 프로그램들은 이 명령 체계를 기반으로 그래픽화 한 프로그램들이다. Edwinstory에서는 이후에 SourceTree로 이를 살펴보고자 한다. 물론 VisualStudioCode에서 git을 다룰 수도 있는데, 이 방법 역시도 Edwinstory의 후속되는 글에서 살펴볼 예정이다.
Git 다운로드 하기

cmd 또는 Terminal에서 git을 제어하는 것은 다소 복잡하고 코린이에게는 어려운 부분이 분명 존재한다. 그러나 개발자들은 이것을 선호하는데, 이유는 쉽게 그래픽화된 프로그램들에서 사용할 수 없는 부분들을, 이 오리지널git은 제어할 수 있기 때문이다.

git을 사용하고자 하는 폴더로 들어가기

git을 설치했다면, cmd 또는 Terminal로 들어가서 git을 실행하고자 하는 폴더로 들어간다.

  • ls
    ls를 선언하면, cmd 또는 Terminal의 현재 위치에 존재하는 폴더 및 파일들의 목록을 확인할 수 있다.
  • cd folderName
    작업하고자 하는 폴더를 위의 명령을 통해서 들어갈 수 있다.
  • mkdir Newfolder
    작업하고자 하는 폴더에 들어왔다면, git을 실행할 폴더를 생성해주자.
  • pwd
    현재 git을 실행할 Newfolder의 위치를 확인하고, 이제 본격적으로 git을 시작하자.
  • git init .
    뒤에 도트(.)까지가 명령어이다. 이제부터 해당 폴더는 git이 버전관리를 시작할 것이다. cmd 또는 Terminal에서는 "initialzed empty git repository in..." 이 선언되며, 초기화되어 비어있는 저장소가 생성된다.
  • ls -al
    그리고 생성된 Newfolder에 존재하는 폴더 및 파일을 확인할 수 있는데 -al을 덧붙이면, 숨겨있는 보여지지 않는 파일들까지 전부 확인할 수 있다. 그러면 그 가운데 생성된 git을 볼 수 있다.
  • cd git
    git 폴더를 확인했다면, 해당 파일로 들어가자. 이제 git을 사용할 준비가 끝났다. 앞으로 기록할 버전들이 이곳에 저장될 것이기 때문이다. 만약 해당 git 폴더를 삭제하면, 버전정보들이 살아지기 때문에 유의해야 한다.

git에 대한 기초용어 정리하기

첫째, Working tree 이다. 버전관리가 시작되지 않은 날 것 그대로의 파일들이 놓여 있는 공간 정도로 이해하자.

둘째, Staging Area 이다. 후에 살펴보겠지만 명령어(git add fileName.확장자)어로 버전관리를 시작할 파일들의 목록을 저장소로 보내는 통로 정도로만 이해하자.

셋째, Repository 이다. 통로로 보내진 파일들이 버전관리를 시작하기 위해서는 저장소라는 공간으로 완전히 이주되어야 한다. 즉 통로에서 약간의 승인 절차를 통해서 저장소로 들어가는데, 그 절차는 명령어(git commit -m "버전명")를 통해서 이 과정이 이뤄진다.

git 버전 생성하기

  • nano NewFile.txt
    nano는 (생활코딩에서 사전에 설치한) 리눅스 에디터 가운데 하나이다. 이 명령을 통해서 새로운 메모를 생성할 수 있다. 그 안에 내용들을 입력할 수 있는데, ctrl+x 를 누르면 해당 내용을 저장할 수 있다. 이때 정말 저장할 것인지 리눅스는 질문을 사용자에게 하는데 y 를 입력하면 최종적으로 저장된다.
  • touch NewFile.txt
    새로운 파일을 생성할 수도 있다.
  • is -al
    이제 익숙한 명령어이다. 즉 해당위치의 폴더 안에 있는 폴더 또는 파일들을 확인해 볼 수 있을 것이다.
  • cat NewFile.txt
    cat은 리눅스의 명령어인데, 파일을 cmd 또는 Terminal에서 간략하게 내용을 살펴보는 명령어이다.
  • git status
    git이 현재 실행된 상태인지 질문하는 명령어인데, 아직 우리는 git을 실행하지 않았기 때문에, "Not commits yet"이라는 명령어를 볼 수 있다.

  • git add NewFile.txt
    이제 버전관리를 실행하기 위해서 Working tree 에 있는 파일을 Staging Area 로 보내보자. 방법은 해당 명령어를 통해서 가능하다. "changes to be committed" 를 통해서 버전으로 생성될 파일들의 목록에 NewFile.txt이 포함된 것을 확인 할 수 있을 것이다.

  • git commit -m "NewFile에 대한 버전명1"
    버전관리를 할 사용자가 지정하여 붙이는 "NewFile에 대한 버전명1"을 기록하면, Staging Area 통로에 있던 파일들이 Repository 로 이주하며, git의 버전관리가 시작된 것을 볼 수 있다.

  • git status
    이제는 버전이 생성되었기에, "nothing to commit, working tree Clean", Working tree 가 깨끗하게 비워진 상태인 것을 볼 수 있다. 만약 Staging Area 로 보내지 않은 파일이 있다면, 해당 명령어에서 확인 할 수 있다.

  • git log
    생성된 git의 버전을 확인할 수 있으며, 명령어를 통해서 들어온 공간에서 나갈 때는 Q를 명령어로 입력해야 한다.

git 새로운 버전, 다음 버전 생성하기 - 파일의 추가, 삭제 등의 변화

위에서 작업했던 nano 애디터파일을 수정해보자.

  • nano NewFile.txt
    nano 애디터로 들어가서 내용을 수정해보자.
  • git config --global core.editor "nano"
    cmd 또는 Terminal에서 사용하고 있는 애디터를 변결할 때 사용되는 명령어이다. 각자 자신의 취향에 따라서 애디터는 설정하면 되며, 주의할 점은 global을 선언했기에, 해당 cmd 또는 Terminal의 기본설정 애디터 전체가 변경되는 것을 기억하자.
  • git status
    changes not staged for commit, 버전을 형성하기 위한 stag에 선택되지 않은 파일이 있다고 등장할 것이다.
  • git add NewFile.txt
    방법은 동일하다. Working tree 에 있는 파일을 Staging Area 로 보낸다.
  • git add .
    또는 추가할 파일이 더 있다면, 위의 명령어로 해당위치에 있는 모든 파일을 Staging Area 로 간편하게 보낼 수도 있다.
  • git commit -m "NewFile에 대한 버전명2"
    "NewFile에 대한 버전명2"을 기록하면, Staging Area 통로에 있던 파일들이 Repository 로 이주하며, git의 새로운 버전의 git버전이 시작되는 것을 볼 수 있다.
  • git commit -am "NewFile에 대한 버전명2"
    git add과 git commit을 한 번에 수행하는 명령어도 있다. 그런데 주의해야 할 것이 있다. 새로운 버전을 생성할 때, git이 이전에 추적하지 않았던 새롭게 추가할 대상의 파일들이 있다면, 해당 명령어로는 새로운 버전에 추가할 수 없으니, 반드시 git add 부터 순차적으로 실행해야 한다.
  • git log
    이제 git으로 생성한 "NewFile에 대한 버전명1"과 "NewFile에 대한 버전명2"를 확인 할 수 있다.

3) 버전관리 백업하기

백업은 내 저장소에만 파일을 관리하는 것이 아니라 복제하여 다른 곳에서 관리하는 것을 말한다. 백업을 하는 이유는 여러가지이나, 이유는 하나이다. 어떤 상화에 의해서 내 저장소가 파괴될 수 있다는 것이다. 백업의 방법에는 추가로 컴퓨터를 구매하는 방법도 있겠지만, 많이 사용되는 방법으로는 백업을 제공해주는 사업자와 계약하는 것이다. 대표적인 사업자가 github이다. git프로그램에서 Publish Repoasitory를 생성함으로 이를 할 수 있으며, 내컴퓨터에 있는 자료들이 Githup에 생성된다. 이를 통해서 (원격저장소에서) 동일하게 생성된 버전들을 동기화 하여 관리할 수 있다.

백업과 관련된 용어(1) push

push는 내컴퓨터저장소에 있는 버전관리 체계를 GitHup.com 에 자료를 동기화하는 과정을 말한다.

백업과 관련된 용어(2) Pull

PULL은 동기화된 GitHup에서 다른컴퓨터로 자료를 가져오는 행위를 말한다. 이를 통해서 내컴퓨터 저장소에 있던 git 버전관리 체계는 내컴퓨터 저장소를 포함하여 3곳에서 관리할 수 있게 된 것이다.

애플트리니티 - 아이클라우드와 git의 백업

마치 이렇게 이해되면 되지 않을까? 내용적인 측면보다, 이해의 측면에서 살펴보자. 즉 내게 아이폰/맥북/아이패드가 있다고 하자. 3개의 기계는 동일한 AppleID로 로그인이 되어있고 아이클라우드에 메모장 공유를 허용해놓았다. 그렇다면 3개의 기계 중 한 곳에서 메모를 추가하거나 삭제하거나 수정하면, 다른 2개의 기계에서도 동기화를 통해서 해당 과정의 내용을 공유한다. git의 push와 pull에 대한 이해는 이렇게 여기면 될 것 같다.

4) 버전관리 협업하기

PULL을 통해서 동기화된 GitHup의 내용을 다른사용자와 공유하면, 협업이 가능해진다. 코린이 정도에서 이 정도면 될 것이다.

5) 오리지널 git의 추가적인 명령어(1) 생성된 파일 읽기

  • log --stat
    각 버전들의 소속 파일과, 얼마의 내용이 추가되었는지 간략하게 확인할 수 있다.
  • git diff
    workingtree에서 수정변경한 파일의 변경사항을 확인할 수 있다. 삭제된 내용과 추가된 내용을 파악할 수 있다. 즉 마지막 버전과 working Tree 사이의 파일을 비교검토할 수 있다는 점이다.
  • git reset --hard
    작업하던 상황에서 새로운 버전을 생성하지 않은 상태에서 해당 명령어를 실행하면, 추가로 작업했던 내용에서 마지막 버전의 상태로 돌아갈 수 있다.
  • git -p
    각 버전의 파일마다 상세한 diff상태(workingtree에서 수정변경한 파일의 변경사항)를 확인 할 수 있다.

6) 오리지널 git의 추가적인 명령어(2) 버전 변경 및 삭제

  • git log
    먼저 아래의 사진은 git로그를 통해서 살펴본 생성한 버전들의 상세한 생성일과, 버전의 이름이다. 사진의 출처는 생활코딩 강의의 유튜브 내용의 일부이다. 그래서 저자가 egoing이고, 버전명은 Message1~3이다. 그리고 노란색 된 알고리즘으로 기록된 내용은 해당버전의 git의 고유 id라고 생각하면 된다. 이후에 이 id를 통해서 검색을 하고 제어를 할 수 있다.

HEAD -> master 은 git에서 관리하는 버전 중에 가장 최후의 값에 할당하는 명시적 표현이다. 여기서 질문이 생긴다. Message2로 돌ㄹ아고 싶다면 어떻게 하면 될까? 여기서 기억할 것이 위에서 말한 id값이다. 돌아가고 싶은 버전의 id값을 복사하고, 해당 화면에서 나가자.(Q 입력)

  • git checkout e706e06...a58
    해당 명령어를 선언하면, 선언한 id값의 버전으로 회기할 수 있다.
  • git log
    다시 git의 버전을 확인해 보면, 해당 id 이후 작성된 버전들이 삭제 되었으며, HEAD 가 변경된 것을 볼 수 있다. 그러나 master 라는 항목은 보이지 않는 것을 볼 수 있는데, git checkout을 했지만, 이후 버전을 삭제하지는 않은 상태이기 때문이다. 즉 다시 master 버전으로 돌아갈 수 있다는 말이다.

  • git checkout master
    해당 명령어를 선언하면, 다시 master버전이 복구된 것을 확인할 수 있고, is -al을 선언하면 master 버전의 파일들이 다시 복구된 것을 확인할 수 있다.

이와 같은 작업을 통해서 현재와 과거를 오고가는 시스템이 git이다. [

  • git reset --hard e706e06...a58
    위와 같은 명령어를 통해서 hard id(버전)으로 master까지 지정하는 것이 가능하다. git checkout과 다르게, git reset --hard는 버전을 완전하게 삭제하는 것이다. 즉 최종본이 변경되었기에, 삭제된 파일을 복구할 수 없다.
  • git reset --help
    해당 명령어는 hard 이외에 사용할 수 있는 명령어들을 살펴볼 수 있으니 참고하자.
  • git revert "최종본의 역순으로"
    해당 명령어는 최종본으로부터 해당과정을 skip/pass 한다는 의미를 지니고 있다. 즉 버전1, 버전2, 버전3이 있다고 할 때, 버전3을 스킵한다는 것은 버전2를 최종본으로 보여준다는 의미이다. 그러나 버전3을 삭제하지 않고 저장소에서는 보관하고 있기에, 돌아갈 수 있음을 기억하자. 그러나 해당 명령어는 버전3 -> 버전2 - > 버전1로 순차적으로 명령을 실행해야 한다. 버전3 -> 버전1로 바로 실행하면, 충돌이 발생할 수 있음을 기억하자.

7) 오리지널 git의 추가적인 개념

gitignore

저장소에는 넣고 싶지 않지만, 파일을 따로 보관하고 싶은 별도의 창고를 지칭한다고 알아두자.

branch

버전을 저장할 때, 전체 파일이 아니라 조각으로 분리한 파일의 저장본 정도로 생각하자.

tag

commitId를 보았을 때, 숫자와 문자의 합성어로 상당히 복잡한 구성으로 되어 있는 것을 볼 수 있는데, 이를 간략하게 설정하는 것도 가능하다.

backup

git으로 백업하는 것은 쉽지 않다. 그러나 백업은 언제나 사용자들의 실수를 바로잡을 수 있는 여러번의 기회를 제공해 준다는 점에서 그냥 넘어갈 수 없는 부분이다. 내컴퓨터에서 다루기 어렵다면, 웹드라이버에 업로드 해서라도 반드시 백업하는 것이 추천된다.

이것으로 git에 대한 전판적인 이해를 마치고자 한다. 다음 글은 실제로 git을 사용하기인데, 필자는 이번에 부트캠프에 참여하게 되었고, 해당 부트캠프에서 사용하게 될 SourceTree 프로그램을 통해서 git을 활용하고자 한다. 이후의 글에서는 VisualStudioCode에서 git을 다루는 것까지 살펴보고자 한다.

author. EDWIN
data 23/01/28

profile
신학전공자의 개발자 도전기!!

1개의 댓글

comment-user-thumbnail
2023년 2월 10일

영찬님 통해서 깃 공부하고있습니다..!!ㅠㅠ 감사드립니다! 항상 부족함을 느끼네요.. 하하.. 정리 너무 잘하셔서 잘 보고있어요!

답글 달기