[Git] 버전관리의 본질

haejun-kim·2020년 7월 3일
0

[Git & Github] 

목록 보기
1/3
post-thumbnail

매번 혼자서 공부하고 코딩을 하다보니 git을 다뤄볼 기회가 많이 없었고, 그 필요성 또한 많이 느끼지 못해서 공부의 우선순위를 미뤄두었다. 그러다가 위코드 사전스터디를 진행하면서 각자의 과제를 깃에 올려도 보고 커밋도 해보는 등의 활동으로 점점 git의 필요성을 느끼게 되었다. 아직 명령어가 익숙치 않아 새로운 저장소를 만들 때 마다, 커밋을 추가할 때 마다 검색을 하고 찾아보고 하는것에 효율성이 떨어짐을 느끼던 찰나에 이번주차 사전스터디 과제가 깃에 대해 공부하는것인만큼 깃에 대해 공부를 하고 매번 찾아보는 일이 없도록 정리를 해놓으려고 한다.
공부한 사이트는 지옥에서 온 Git 여기서 이고잉님의 강의를 참고했다.


GIT = Version Control System

파일 이름의 변경 없이 버젼 관리, 백업, 리커버리, 협업이 가능한 시스템

실습 폴더 생성

먼저 프로젝트 실습을 할 폴더를 만들어준다.

mkdir gitfth

터미널을 열고 본인이 프로젝트 폴더를 만들고자 하는 위치로 들어가서 위의 명령어로 폴더를 생성해주고

cd gitfth

cd명령어를 통해서 해당 폴더로 들어간다.
참고로 pwd 명령어를 입력하면 현재 내가 위치한 디렉토리가 어디인지 표시해준다.

git init

컴퓨터에 있는 모든 파일들을 관리할 필요는 없기 때문에 버전 관리를 하려고 하는 디렉토리를 Git에 알려줘야한다. 프로젝트를 진행할 폴더로 먼저 진입한 후 git init를 입력한다.

git init : '현재 디렉토리에 내가 작업을 진행하겠다' 라는 것을 Git에 알려주는 기능

git init

를 입력하면

위와 같이 Initialized 된 것을 확인할 수 있다.

이 상태에서 현재 디렉토리의 파일 목록을 알려주는

ls -al

을 입력하면

.git이라는 디렉토리가 생긴것을 확인해주어야한다.
이 파일은 버전관리를 하게 되면 여러가지 정보들이 생성이 되는데 생성 된 정보들은 이 .git 디렉토리에 저장이 된다. 그러므로 '이게 뭐지?' 하면서 지워버리는 불상사는 없도록 하자. ( 지우게되면 마지막 소스코드는 남아있지만 그 전의 버전들에 대한것은 모두 지워진다. )

이제 컴퓨터에게 '이 디렉토리를 버전관리를 한다'라는것을 인식시켜주는 작업이 끝났다.

git add

인식을 시켜주었으니 파일을 생성해서 파일이 버전관리를 해보자.
f1.txt라는 파일을 생성하고 그 안에 숫자 1를 작성해보자.

파일 생성

vim이라는 에디터를 사용해서 파일을 생성할 수 있다. vim에디터는 대부분의 OS에서 설치가 되어 있으니 따로 설치가 필요하진 않다.

vim f1.txt


명령어를 입력하면 위와같은 화면이 출력된다. 위 상태에서는 어떤 값을 입력해도 아무 값도 입력되지 않는다. 그 이유는 현재 입력모드가 아니기 때문이다. i를 누르면

위와 같이 화면이 바뀐다. 이렇게 되면 이제 입력이 가능한 모드로 바꼈다는 뜻이다.
이 상태에서 이제 1을 입력하면 된다.

하고자하는 입력을 모두 마쳤으면 esc를 눌러주면 된다. 그럼 터미널창 하단에 표시되어있던 -- INSERT --표시가 사라지는 것을 확인할 수 있으며, 이는 입력모드가 종료되었다는 뜻이다. 다시 입력모드로 변경하고싶으면 다시 i를 눌러주면 된다.

파일 저장

입력을 모두 마쳤으니 입력한 내용을 모두 저장을 해야한다. 입력모드가 종료된 상태에서 :wq 를 커맨드창에 입력해주면 된다.

입력하고 나면

위와 같이 vim화면에서 나가진다.
이제 내가 생성한 파일을 확인해보자.

f1.txt라는 파일이 제대로 생성 되었다. 여기서 파일의 내용을 확인하고 싶다면 다시 vim f1.txt로 해당 파일에 접근해주는 방법도 있지만 접근하지 않고 내용을 확인하고 싶다면 cat f1.txt라는 명령어를 입력하면 파일 내부로 들어가지 않고도 파일에 저장되어 있는 내용을 확인할 수 있다.

git status

git status

명령어를 통해서 해당 디렉토리에서 파일의 상태를 확인할 수 있다.

현재 내가 생성한 f1.txt라는 파일은 Untracked files 라고 분류되어있다.
그 이유는 f1.txt라는 파일은 버전관리가 되고 있는 디렉토리인 gitfth안에 존재하지만 이 파일을 git에게 '버전관리를 시작해라!' 는 명령을 주기 전까지는 버전관리 작업을 수행하지 않기 때문이다.
여기서 버전관리를 시작하라는 명령을 주는 명령어가 바로 git add 명렁어다.

여기서

git add 파일명 or 디렉토리명

으로 버전관리를 시작 할 파일이나 폴더명을 지정할 수 있다. 지정이 아니라 현재 내가 위치한 디렉토리에 있는 모든 파일들을 버전관리를 시작하고싶다면

git add .

으로 명령어를 입력해주면 된다.
add후 다시 상태를 확인해보면

이렇게 상태가 변화된 것을 확인할 수 있다.

Commit - 버전 만들기

현재 f1.txt라는 파일이 트랙킹 되고 있는 상태까지 진행했다. 이제 이 파일을 실제 깃의 저장소에 커밋을 해보자.

git commit

터미널에

git commit

이라는 명령어를 입력하면 vim 에디터 화면이 출력된다.

위 화면에 사용자가 커밋을 할 때 어떤 수정사항이 발생했는지에 대한 내용 등을 입력하여 저장시킬 수 있다. vim이기 때문에 입력을 하려면 i를 눌러 입력모드로 변환해주어야한다.
숫자 1만 입력을 해보고 입력모드를 종료한 뒤 :wq명령어로 에디터를 종료시켜주면

위와 같은 메세지가 출력되면 이제 최초의 버전이 생성된 것이다.

이제 버전이 잘 만들어졌는지를 확인해보면 된다.

git log

git log

를 입력해보면

vim에디터 창에서 입력한 1이라는 버전 메세지가 출력됨과 동시에 누가 커밋했는지, 그사람의 이메일 주소는 무엇이고, 언제 버전을 만들었는지에대한 기록도 함께 확인할 수 있다.

위와 같이 굳이 vim까지 진입하지 않더라도

git commit -m "커밋 메세지"

와 같은 방법으로 더 간단하게 커밋을 할 수 있다.

git stage area

git에서 stage area라고 함은 '커밋을 한 파일들이 대기하고 있는 공간'을 뜻한다.

현재 f1.txt 파일을 복사해서 f2.txt 라는 파일을 만들어주었다.
그리고 위의 파일들을 각각 간단하게 내용을 수정해 준 후 현재 깃 상태를 확인해보면 (f2.txt는 add 를 해 준 상태)

이렇게 modified 상태라고 나온다. 현 상태에서 f1.txt 파일만 add, 및 commit을 해보자.

이런 결과가 나타날 것이다. 이 결과를 요약하면 f1.txt 는 현재 stage area 에 있는 상태인 것이다.

stage : commit 후 대기 상태의 파일들이 가는 곳
repository : commit이 된 결과가 저장되는 곳

diff & log - 변경 사항 확인하기

지금까지 버전을 만들었다면 이제는 버전을 만들었을 때, 버전 만든것의 효용을 가져와보자.

  • 차이점 또는 과거 시점에서의 변경 사항을 확인 할 수 있다.
  • 과거로 돌아갈 수 있다.

차이점 확인하기

과거 버전과 현재 버전에서의 코드상에서 어떤 차이점이 생겼는지 확인할 수 있는 방법이다.
git log를 사용하는 명령어와 diff라는 명령어를 사용해서 확인가능하다.

git log -p

git log 의 명령어 뒤에 여러가지 옵션을 줘서 git log가 동작하는 방법을 바꿀 수 있다.
이중에서 git log -p를 사용해보자.
git log -p : 각각의 커밋과 커밋사이의 소스상의 차이점을 확인할 수 있다.
명령어를 입력하면 위와같은 화면이 출력되는데, 3이라는 커밋메세지를 입력한 버전과 4라는 커밋메세지를 입력한 버전에서의 소스코드상에서 차이점을 diff 이하의 부분에서 알려준다. 이 중에서 +++라고 표시되어있는 라인이 버전 4에서의 f1.txt 파일 내용을 가르키는 것이고, ---로 표시되어있는 라인이 버전 3에서의 f1.txt 파일을 가르키는 것이다.
따라서, 버전 4에서의 f1.txt 파일은 f1.txt : 2 라는 뜻이며, 버전 3에서의 f1.txt파일은 -source : 2였다는 뜻이 된다.

git log (commit ID값)

git log를 통해 로그를 확인하게 되면 각 커밋 상태에서의 고유의 ID값을 확인할 수 있다.

위 내용에서 노란 글씨로 commit 뒤에 써져있는 복잡한 글자들이 바로 각 커밋 상태에서 가지고 있는 고유의 ID값이다. 이 값을 사용해서도 로그를 확인할 수 있다. ID값을 복사해서

git log ID값

을 입력해주면

입력한 ID값부터 그 전 버전까지의 로그 상태를 보여준다.

diff

위와 같이 ID를 통해서 로그를 확인할 수 있었다. 근데 나는 위 상태에서 버전3과 버전1의 상태의 차이에 대해서 알고싶다면 바로 diff라는 명령어를 사용하면 된다.

git diff (버전3 commit ID값)..(버전1 commit ID값)

이런 방법으로 소스코드상의 차이점을 확인할 수 있다. 이 기능은 커밋을 하기 전에 커밋하려는 기능에 문제가 있는지 없는지 마지막으로 확인할 수 있는 기회를 제공한다.

과거로 돌아가기 - reset

과거로 돌아간다는 의미는 커밋을 취소한다는 의미이다.
현재 버전 5까지 만들어놨는데, 버전5,4를 삭제하고 버전3으로 돌아가고 싶다고 가정해보자.

버전 3의 commit ID값을 복사한 후 아래의 명령어를 입력한다.

git reset (버전 3의 commit ID값) --hard -> 리셋하고자하는 시점의 아이디값


이제 로그를 확인해보면

이제 버전 4,5가 커밋이 취소가 되면서 사라짐 동시에 버전 3의 소스코드 상태로 돌아갔음을 확인할 수 있다.
Git에서는 웬만한 정보들은 삭제하지 않기때문에 현재 reset을 했을 경우 사용자의 눈에는 없어진것처럼 보이지만 해당 정보는 삭제되지 않고 남아있기 때문에 필요시에는 복구가 가능하다는데 이건 추후에 사용하게 되면 그때 공부하면서 포스트해야겠다.

추가로, 리셋하는 기능을 하는 명령어는 reset말고도 revert라는 명령어가 있다. revert는 리셋처럼 커밋을 취소하는 기능이지만 리셋처럼 커밋을 날려버리는 것이 아니라 커밋을 취소하면서 새로운 버전을 생성하는 기능이다. 이부분에 대한 내용 또한 사용하게 될 기회가 있다면 그때 자세히 공부하면서 정리 할 예정이다.

0개의 댓글