매번 혼자서 공부하고 코딩을 하다보니 git
을 다뤄볼 기회가 많이 없었고, 그 필요성 또한 많이 느끼지 못해서 공부의 우선순위를 미뤄두었다. 그러다가 위코드 사전스터디를 진행하면서 각자의 과제를 깃에 올려도 보고 커밋도 해보는 등의 활동으로 점점 git
의 필요성을 느끼게 되었다. 아직 명령어가 익숙치 않아 새로운 저장소를 만들 때 마다, 커밋을 추가할 때 마다 검색을 하고 찾아보고 하는것에 효율성이 떨어짐을 느끼던 찰나에 이번주차 사전스터디 과제가 깃에 대해 공부하는것인만큼 깃에 대해 공부를 하고 매번 찾아보는 일이 없도록 정리를 해놓으려고 한다.
공부한 사이트는 지옥에서 온 Git 여기서 이고잉님의 강의를 참고했다.
파일 이름의 변경 없이 버젼 관리, 백업, 리커버리, 협업이 가능한 시스템
먼저 프로젝트 실습을 할 폴더를 만들어준다.
mkdir gitfth
터미널을 열고 본인이 프로젝트 폴더를 만들고자 하는 위치로 들어가서 위의 명령어로 폴더를 생성해주고
cd gitfth
cd
명령어를 통해서 해당 폴더로 들어간다.
참고로 pwd
명령어를 입력하면 현재 내가 위치한 디렉토리가 어디인지 표시해준다.
컴퓨터에 있는 모든 파일들을 관리할 필요는 없기 때문에 버전 관리를 하려고 하는 디렉토리를 Git
에 알려줘야한다. 프로젝트를 진행할 폴더로 먼저 진입한 후 git init
를 입력한다.
git init : '현재 디렉토리에 내가 작업을 진행하겠다' 라는 것을
Git
에 알려주는 기능
git init
를 입력하면
위와 같이 Initialized 된 것을 확인할 수 있다.
이 상태에서 현재 디렉토리의 파일 목록을 알려주는
ls -al
을 입력하면
.git
이라는 디렉토리가 생긴것을 확인해주어야한다.
이 파일은 버전관리를 하게 되면 여러가지 정보들이 생성이 되는데 생성 된 정보들은 이 .git
디렉토리에 저장이 된다. 그러므로 '이게 뭐지?' 하면서 지워버리는 불상사는 없도록 하자. ( 지우게되면 마지막 소스코드는 남아있지만 그 전의 버전들에 대한것은 모두 지워진다. )
이제 컴퓨터에게 '이 디렉토리를 버전관리를 한다'라는것을 인식시켜주는 작업이 끝났다.
인식을 시켜주었으니 파일을 생성해서 파일이 버전관리를 해보자.
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
명령어를 통해서 해당 디렉토리에서 파일의 상태를 확인할 수 있다.
현재 내가 생성한 f1.txt
라는 파일은 Untracked files 라고 분류되어있다.
그 이유는 f1.txt
라는 파일은 버전관리가 되고 있는 디렉토리인 gitfth
안에 존재하지만 이 파일을 git
에게 '버전관리를 시작해라!' 는 명령을 주기 전까지는 버전관리 작업을 수행하지 않기 때문이다.
여기서 버전관리를 시작하라는 명령을 주는 명령어가 바로 git add
명렁어다.
여기서
git add 파일명 or 디렉토리명
으로 버전관리를 시작 할 파일이나 폴더명을 지정할 수 있다. 지정이 아니라 현재 내가 위치한 디렉토리에 있는 모든 파일들을 버전관리를 시작하고싶다면
git add .
으로 명령어를 입력해주면 된다.
add
후 다시 상태를 확인해보면
이렇게 상태가 변화된 것을 확인할 수 있다.
현재 f1.txt
라는 파일이 트랙킹 되고 있는 상태까지 진행했다. 이제 이 파일을 실제 깃의 저장소에 커밋을 해보자.
터미널에
git commit
이라는 명령어를 입력하면 vim
에디터 화면이 출력된다.
위 화면에 사용자가 커밋을 할 때 어떤 수정사항이 발생했는지에 대한 내용 등을 입력하여 저장시킬 수 있다. vim
이기 때문에 입력을 하려면 i
를 눌러 입력모드로 변환해주어야한다.
숫자 1
만 입력을 해보고 입력모드를 종료한 뒤 :wq
명령어로 에디터를 종료시켜주면
위와 같은 메세지가 출력되면 이제 최초의 버전이 생성된 것이다.
이제 버전이 잘 만들어졌는지를 확인해보면 된다.
git log
를 입력해보면
vim
에디터 창에서 입력한 1
이라는 버전 메세지가 출력됨과 동시에 누가 커밋했는지, 그사람의 이메일 주소는 무엇이고, 언제 버전을 만들었는지에대한 기록도 함께 확인할 수 있다.
위와 같이 굳이 vim
까지 진입하지 않더라도
git commit -m "커밋 메세지"
와 같은 방법으로 더 간단하게 커밋을 할 수 있다.
git
에서 stage area
라고 함은 '커밋을 한 파일들이 대기하고 있는 공간'을 뜻한다.
현재 f1.txt 파일을 복사해서 f2.txt 라는 파일을 만들어주었다.
그리고 위의 파일들을 각각 간단하게 내용을 수정해 준 후 현재 깃 상태를 확인해보면 (f2.txt는 add 를 해 준 상태)
이렇게 modified 상태라고 나온다. 현 상태에서 f1.txt 파일만 add
, 및 commit
을 해보자.
이런 결과가 나타날 것이다. 이 결과를 요약하면 f1.txt 는 현재 stage area 에 있는 상태인 것이다.
stage : commit 후 대기 상태의 파일들이 가는 곳
repository : commit이 된 결과가 저장되는 곳
지금까지 버전을 만들었다면 이제는 버전을 만들었을 때, 버전 만든것의 효용을 가져와보자.
과거 버전과 현재 버전에서의 코드상에서 어떤 차이점이 생겼는지 확인할 수 있는 방법이다.
git log
를 사용하는 명령어와 diff
라는 명령어를 사용해서 확인가능하다.
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
를 통해 로그를 확인하게 되면 각 커밋 상태에서의 고유의 ID값을 확인할 수 있다.
위 내용에서 노란 글씨로 commit 뒤에 써져있는 복잡한 글자들이 바로 각 커밋 상태에서 가지고 있는 고유의 ID값이다. 이 값을 사용해서도 로그를 확인할 수 있다. ID값을 복사해서
git log ID값
을 입력해주면
입력한 ID값부터 그 전 버전까지의 로그 상태를 보여준다.
위와 같이 ID를 통해서 로그를 확인할 수 있었다. 근데 나는 위 상태에서 버전3과 버전1의 상태의 차이에 대해서 알고싶다면 바로 diff
라는 명령어를 사용하면 된다.
git diff (버전3 commit ID값)..(버전1 commit ID값)
이런 방법으로 소스코드상의 차이점을 확인할 수 있다. 이 기능은 커밋을 하기 전에 커밋하려는 기능에 문제가 있는지 없는지 마지막으로 확인할 수 있는 기회를 제공한다.
과거로 돌아간다는 의미는 커밋을 취소한다는 의미이다.
현재 버전 5까지 만들어놨는데, 버전5,4를 삭제하고 버전3으로 돌아가고 싶다고 가정해보자.
버전 3의 commit ID값을 복사한 후 아래의 명령어를 입력한다.
git reset (버전 3의 commit ID값) --hard -> 리셋하고자하는 시점의 아이디값
이제 로그를 확인해보면
이제 버전 4,5가 커밋이 취소가 되면서 사라짐 동시에 버전 3의 소스코드 상태로 돌아갔음을 확인할 수 있다.
Git에서는 웬만한 정보들은 삭제하지 않기때문에 현재 reset
을 했을 경우 사용자의 눈에는 없어진것처럼 보이지만 해당 정보는 삭제되지 않고 남아있기 때문에 필요시에는 복구가 가능하다는데 이건 추후에 사용하게 되면 그때 공부하면서 포스트해야겠다.
추가로, 리셋하는 기능을 하는 명령어는 reset
말고도 revert
라는 명령어가 있다. revert
는 리셋처럼 커밋을 취소하는 기능이지만 리셋처럼 커밋을 날려버리는 것이 아니라 커밋을 취소하면서 새로운 버전을 생성하는 기능이다. 이부분에 대한 내용 또한 사용하게 될 기회가 있다면 그때 자세히 공부하면서 정리 할 예정이다.