오늘은 git에 대해서 공부했다.
git에 대해 많이 들어보긴 했지만 실제로 사용해보는 것은 처음이라 조금은 헤맸지만 점점 CLI에 익숙해지는 느낌이 들고 git에 대해서도 굉장히 편리하다는 느낌을 받았다.
작년에 교육을 받으며 프로젝트를 할때에는 코드를 usb로 받아 하나의 컴퓨터에서 복붙을 하면 합쳤었는데 그때 git을 사용했으면 더 편리했겠다는 생각도 들었다.
버전관리란 각 버전별로 변경된 이력들을 저장하는 작업이다.
각 버전별로 변경이력을 기록해 둔다면 이전 버전으로 돌아가야 할 경우 기록된 변경이력들을 이용해 쉽게 이전 버전으로 돌아갈 수 있을 것이다.
Git은 그러한 버전관리를 해주는 버전관리 시스템이다.
또한 Git으로 관리하는 폴더를 github라는 클라우드 기반 서비스를 이용해 여러 사람들과 공유하고 접근할 수 있다.
작업을 하는 폴더가 버전관리를 받게 하려면 해당 폴더를 git의 관리 아래에 두어야 한다.
git으로 관리되는 폴더를 git repository(깃저장소)라고 한다.
git repository는 local repository(로컬저장소)와 remote repository(원격저장소)가 있다.
로컬저장소는 내 컴퓨터의 깃저장소이며 주로 작업을 할때 원격저장소에서 받아온 파일을 로컬저장소에 저장한 후 진행한다.
원격저장소는 원격 온라인서버에 있는 깃 저장소이며 여러사람이 함께 공유가 가능하며 내 컴퓨터의 코드가 모두 삭제되어도 원격저장소에 저장된 코드를 내려받을 수 있다.
fork란 다른사람의 원격저장소에 저장된 코드를 나의 저장소에 옮겨오는 작업이다.
React는 페이스북 최초의 오픈소스 프로젝트로 github에 코드가 공개되어있다.
오픈소스란?
무상으로 공개된 소스코드 혹은 소프트웨어를 의미하며, 누구나 어떤 목적으로도 사용이 가능하며 재배포가 자유로운 라이센스이다.
누구나 열람하고 재배포가 자유로우므로 나의 로컬저장소에 옮겨와 작업을 할 수도있다.
그러기 위해선 먼저 나의 원격저장소로 React가 저장된 저장소를 옮기는 작업(fork)가 필요하다.

React의 코드가 저장된 github에서 사진에 보이는 우측상단의 fork버튼을 누르면 나의 원격저장소에 React의 코드를 옮겨올 수 있다.
fork를 이용해 나의 원격저장소에 코드를 옮겨왔다면 이젠 나의 로컬저장소에서 작업을 하기위해서는 원격저장소에서 나의 로컬저장소에 코드를 옮겨오는 과정이 필요하다.
이 과정을 clone이라한다.
CLI를 이용하여 clone과정을 진행할 수 있다.
git clone [저장소의 url]
저장소의 url은 내가 내려받고 싶은 저장소에서 확인 가능하다.
.png)
이렇게 나의 컴퓨터에서 코드를 작업한 다음에는 다시 원격저장소에 작업한 내용(수정한 내용)을 적용시켜야한다. 이 작업을 push라고 한다.
하지만 push를 하기 위해서는 몇가지의 과정을 거쳐야한다.
나의 작업공간에 있는 파일은 크게 Untracked,Tracked의 두가지 상태로 나뉜다.
Git이 해당 파일을 추적하는지(Tracked),추적하지 않는지(Untracked)의 기준으로 분류할 수 있다.
Untracked의 상태는 Git이 추적하지 않는 파일로 git의 관리하에 있는 폴더에 새로운 파일을 만드는 경우에 새로운 파일은 Untracked상태에 해당된다.
Tracked상태는 다시 Modified,Staged,Committed의 세가지 상태로 나뉜다.
- Untracked상태: Git이 추적하지 않는 파일
- Tracked상태: Git이 추적하는 파일
- Modified상태: 기존에 존재하던 파일을 수정했으나, 아직 로컬저장소에 커밋하지 않은 상태
- Staged상태: Git이 기존의 Modified상태의 파일의 수정사항을 확정하고, 이를 반영(commit)예정이라고 정보를 반영하여 staging area에서 대기중인 상태
- Committed상태: staging area에서 대기중이던 staged상태의 파일들을 모두 로컬저장소에 반영한 작업이 끝난 상태.
git status: status명령어는 현재 깃저장소의 상태를 알려주는 명령어이다.

현재 test2.txt파일은 Untracked상태이고 test.txt파일은 Modified상태임을 알려주고 있다.
변경내용을 반영(commit)하기 위해서는 Modified상태의 파일을 staging area에 옮겨줘야한다.
add명령어는 Untracked상태인 혹은 Modified상태인 파일을 Staged상태로 바꾸어주는(staging area로 이동시키는) 명령어이다.
git add [파일이름] 명령을 이용해 해당 파일을 staging area에 옮길수 있다.(Staged상태로 바꿔줄수 있다.)
git add . 명령은 현재 위치에 있는 모든 Untracked상태, Modified상태의 파일을 Staged상태로 바꾸라는 명령이다.
이렇게 모든 Modified상태인 파일을 Staging area로 옮겨 Staged상태가 된다면 이제 우리는 commit을 할수 있다.
commit은 Staged상태인 파일을 Committed상태로 바꿔주는 명령어이다.(staging area에서 대기중인 파일의 변경사항을 로컬저장소에 반영하는 명령어)
commit은 Staged상태인 파일만을 로컬저장소에 반영하기 때문에 add를 통해 Staged상태로 바꾸지 않은 파일의 변경사항은 로컬저장소에 반영되지 않는다.
git commit: 현재 위치의 깃저장소에서 commit하라는 명령어이다. 아마 메세지를 남겨야하기 때문에 텍스트 에디터가 실행될 것이다.
git commit -m '[commit메세지]': 명령어를 이렇게 실행하면 -m뒤의 ''안의 텍스트를 commit메세지에 적용하여 commit된다.
commit을 할때 적어주는 메세지와 함께 변경내용을 log명령어를 통해 확인할 수 있다.
git log: commit을 한 시간과 사람, 메세지를 보여준다

git log -p: log명령보다 상세하게 commit마다 어떤 변경사항이 있는지도 보여준다.

commit을 한다는 것은 버전을 만든다는 의미와 같다.
log명령을 실행했을 때 나오는 commit고유번호와 reset,revert명령을 통해 로컬저장소를 이전버전으로 되돌릴 수 있다.
이렇게 commit으로 나의 로컬저장소에 변경사항을 적용시키면 드디어 push를 통해 원격저장소에 로컬저장소의 변경사항을 적용시킬 수 있다.
그전에 나의 로컬저장소의 내용이 어느 원격저장소에 저장이 되는지 알아보자.
git remote -v를 실행하면 현재 나의 로컬저장소와 연동되어있는 원격저장소의 목록이 나온다.
clone을 이용해 파일을 내려받은 사람은 기본적으로 내려받은 원격저장소의 주소가 origin이라는 이름으로 저장되어 있을 것이다.

처음에 조회했을 때에는 origin이라는 이름의 저장소만 연동되어 있지만 git remote add [저장소이름] [저장소url]을 실행하면 web이란 이름으로 새로운 원격저장소가 연동된 것을 확인할 수 있다.
git push [원격저장소이름] [브랜치이름]: 해당 이름의 원격저장소에 해당 브랜치의 마지막 commit(버전)을 적용시킨다.(대개 원격저장소는 origin이고 브랜치는 master이다. -> git push origin master)
위와 같이 git을 이용해 원격저장소와 로컬저장소를 사용해 작업을 하다모변 이런 경우가 있을 수 있다.
원격저장소에서 코드를 옮겨와 작업공간에서 작업을 한 후 다시 로컬저장소에 commit하여 push하려 했지만 이미 다른 누군가가 원격저장소에 push를 하여 내가 push를 할수 없는경우에는 어떻게 해야할까.

아마도 이런 메세지를 마주할 것이다.
이런 경우에는 pull명령을 이용해 원격저장소의 마지막 버전(commit)을 나의 로컬저장소에 적용시킨후에 push를 진행할 수 있다.
git pull [원격저장소이름] [브랜치이름]: 원격저장소의 마지막 커밋을 브랜치에 적용시키는 명령어이다.
pull을 통해 원격저장소의 커밋을 적용시킬때 보통은 자동으로 병합이 되지만 가끔씩 병합도중에 충돌을 일으키는 경우가 있다.

사진의 마지막에서 두번째 줄에 CONFLICT(충돌)이 일어났다고 알려주고 어느파일(test.txt)에서 충돌이 일어났는지 알려주고 있다.
마지막 줄에서는 Automatic merge(자동병합)이 실패했다고 알려주고 있다.
이 경우에는 code .명령어로 VS Code를 실행하면 쉽게 충돌부분을 찾고 어떤것을 적용할지 선택할 수 있다.

위의 사례는 시작을 할때 원격저장소에서 clone을 한후에 모든 작업이 진행되었다.
하지만 처음 작업을 내 컴퓨터에서 진행하고 git을 사용하여 작업내용을 관리하고 싶다면 init명령어를 이용해 작업폴더를 깃저장소로 바꿀수 있다.
터미널로 작업폴더로 이동해 git init명령을 실행한다.
git init명령을 실행하면 .git이라는 폴더를 생성하고 그 안에 git이 해당 폴더를 관리하기 위한 정보를 담는다.