git은 단순히 협업 툴? 이런 용도로 다들 인식하지만 난 혼자서 맨땅에 대가리 박으며 공부를 한 터라, 사실 협업이란게 무의미했다. 그래서 맨처음엔 아예 시작도 안했는데 어느순간 필요성이 느껴진 이유가, 바탕화면에 코드 파일들이 아주 더럽게 넘쳐나서부터이다. 재사용되는 코드가 있는데, 계속 뭔가 덧붙여져서 원본 파일 찾기도 매우 힘들었음. 참고로 난 깃을 코딩을 시작한지 약 1년? 정도 지나서야 깃을 깔짝깔짝 만져봤던것같다.
사실 포스팅을 읽으면 왜 이런 기본적인걸 포스팅까지하지? 라는 의문점이 들테지만 나도 예전에 깃을 처음 접했을때, 굉장한 이질감을 느꼈던 이유가 왜써야하는지 잘 못느꼈기때문이었음. 떄문에 과거의 나같은 코찔이들을 위해 포스팅을 할거다.
때문에 활용방법 위주로 포스팅하려고 한다. 이번 포스팅 주제인 백업용도로 사용하기는 내가 거의 3년정도동안 계속 쓴 방법& 지식수준이다. 최근들어 취직준비하니까 협업용, 브랜치 등을 포스팅 시리즈에 포함했지만 내 깃레포들 보면 브랜치조차 없는걸 확인가능하다. 진짜 이 포스팅 내용정도의 git 지식으로만 코딩을 3년동안함.. 혼자 코딩하면 깃을 백업용으로만 쓰는것으로 충분하다고 생각한다.
주 활용도는 1. 백업용으로 코드 보관하는거 2. base템플릿 저장용 이렇다.
깃으로 관리하는 폴더로 지정하기 - .git
일단 깃을 설치하고 이런건 포스팅들이 넘쳐나니까 제쳐두고,
내가 원하는 디렉토리를 깃으로 관리하려면 설정을 해야한다.
pwd
현재 git-step1-posting이라는 디렉토리에 있다.
ls
현재 mycode.js라는 파일 하나가 존재함. 좀따 쓰려고 만들어둔거임
이 디렉토리를 깃으로 관리하는 디렉토리로 만들려면
git init
이명령어를 쳐야한다. 물론 깃이 설치되어있어야함.
ls -al
설치후 다시 파일 목록을 숨김파일까지 전부 뜨게 확인해보면
이렇게 .git이라는 디렉토리가 생긴걸 확인할 수 있다.
이제 git-step1-posting 디렉토리는 git으로써 관리할 수 있는 디렉토리가 되는거다.
# 왜 이런걸 코드 하나하나 설명하는거임?
git clone 레포지토리주소
아래에 쓸 기능인 clone으로 내 레포의 react base를 통쨰로 가져와보면,
얘도 .git이라는 디렉토리가 존재한다.
근데 내가 이 코드에 나만의 코드를 덧붙이고 수정해서 다른 레포지토리에 내 커스텀 코드들을 따로 저장해서 관리 하고싶다면?
이전에 있던 커밋들도 싹다 지워졌으면 좋겠고..
그렇다면
rm -rf .git
으로 이 디렉토리를 통째로 삭제한 후
git init
을 치면 다시 새로운 .git디렉토리가 생기고 새로운 git으로 이 디렉토리를 관리하겠다고 해줄수 있다.
깃때문에 오류생기고 귀찮아지면 그냥 저 .git 디렉토리 통째로 지워주면된다.
그럼 아예 깃으로 관리안하는 디렉토리가 되어버린다는것.
그냥 컴퓨터 뻑나면 재부팅하는거라고 생각하면 됨. 여기에 git init을 쳐서 새로운 깃으로 관리하게해서 새로운 레포에 넣거나 할 수 있다는거임.
참고로 깃을 처음배울때 뭔ㅅㅂ 이런 개똥같은걸 좋다고 배우라고 하지? 할정도로 오류가 많았는데, 이걸 알았다면 디렉토리 한 100개는 덜 만들었을듯 하다.
참고로 .git이 여러개 있으면 에러뜨는경우도 있다. git init을 난사해버리면 얘가 에러 엄청 띄움. 이럴떄 이 개념을 알고있다면 해결이 가능하겠지?
디렉토리 변화 기록하기. add, commit
add는 스테이징이다, commit은 스테이징된 기록들을 기록하는 지점이다 이러는데, 다필요없고
그냥 이거 add, commit 두개 쌍으로 같이다닌다고 생각하면 됨.
git add .
git commit -m 'first commit'
이렇게 쓰면 된다.
(이렇게 같이 쓰는데 누구는 이거 귀찮아서 아예 두 명령어 한번에 쳐주는 bashrc파일같은거 수정하고 하는사람도 있음.)
그만큼 그냥 달고 살아야 하는 커맨드다.
이거 치면 그냥 현재 깃으로 관리하는 파일들 상태를 기록하겠다 라는 말이다.
그래도 양심상 조금 설명을 붙이자면, add다음에는 디렉토리나 파일을 특정해서 해당 파일들을 스테이징하겠다는건데, 그냥 쩜 으로 쓴건 모든 디렉토리 파일 다 스테이징 하겠다는거임. 쩜으로 걍 전체 스테이징하고, 스테이징하기 싫은건 그냥 git ignore파일로 관리하면 된다. 그냥 'add .' 으로 다 하면 된다는거임.
commit을 치면, 이렇게 뭐가 뜨는데, 이전 커밋과 비교해서 몇개의 파일이 변했고 빠졌는지 간략하게 소개해줌
참고로 난 이렇게 source control branch라는 vs코드? 익스텐션이었나? 암튼 이걸로 확인하는데, 시각화해줘서 나름 유용하다. diff 이런 이상한 명령어 배우지말고 그냥 익스텐션 깔고 사용하는게 정신건강에 매우 이롭다..
# 이전 commit으로 돌아가려면?
난 사실 거의 안썼다.. 3년정도 코딩하면서..
거의 개인프로젝트다보니 틀린부분을 어떻게든 코드를 노려봐서 찾아내서 고쳤었음..
그래도 알아낸 방법을 간단하게 소개하자면
현재 second commit을 한 상태인데 난 first commit으로 돌아가고싶다.
git log
돌아가려는 commit의 해시문자열을 알아야한다. git log명령어를 치면 알아낼 수 있음.
저기 체크한 문자열이 해시문자열이다.
난 vs코드 익스텐션을 쓰기때문에 저기 그래프에서 원하는 커밋에 마우스올리면 저렇게 해시문자열 복사할수 있게 되어있음.
커밋에 대한 아이디같은거임.
git reset --hard <해시문자열>
이렇게 하면
아까 second commit할때 추가된 pig muzzi라는 코드는 사라지고
second커밋 또한 깃그래프에서 사라진걸 확인 할 수 있음.
--hard옵션을 붙여서 아예 기록자체에서 사라져버린거다. 복구못함.
난 그냥 남자답게 --hard옵션을 붙이는데 다른 방법들이 더 있다. 알아서 찾아보도록..
(사실 몇번 되돌아갔다가 충돌 졸라나서 코드 통쨰로 날아간적이 많아서 겁나서 못함 ㅠㅠ)
백업을 해보자 / github
깃은 그냥 로컬에서만 쓰기에도 좋지만, github이 있기에 git이 존재한다고 생각한다.
깃허브라는 오픈 스토리지같은 서비스에 아예 내 코드를 통째로 저장 할 수 있다. 그러면 내 컴퓨터가 터지거나 다른컴퓨터에서 내 코드를 갖고오고싶을때 갖다 쓸 수 있을거다. 그냥 단순 파일저장하는 스토리지 서비스라고 생각해도되는데 코드에 특화되어있는게 장점이다. (물론 단순 스토리지 서비스라기보단 cicd를 돕는 git action이라던가 다양한게 많기는 하다. git의 세계는 무궁무진함)
소스패널에서도 이전 디렉토리에서 커밋해놨던 커밋기록이 통쨰로 받아왔다. .git디렉토리도 통쨰로 가져왔기때문임.
위에서 썻듯이, 커밋기록이있으면 해당 커밋으로 돌아갈수 있다.
혹시나 민감한 정보가 들어가있는 commit을 했다가 지우고 다시 commit했다고 하더라도,
공개 레포지토리는 누구나 clone할 수 있다. 즉 민감한 파일이 있던 commit으로 돌아가서 탈취할 수 있다는 소리임.
때문에 해당 커밋 기록을 지우거나 아예 레포지토리랑 .git디렉토리를 통째로 지워버리고 다시 push하는게 안전하다.
이런 구조로 이해할 수 있음. push는 백업, clone은 restore같은 느낌?
어떤식으로 사용하니?
제목부터 백업용이라고 써두는데, 진짜 백업용으로 자주 쓴다.
만약 내 프로젝트를 새로운 컴퓨터나 vm에서 런타임으로 돌리고싶을때 github에 저장해둔 코드 통쨰로 가져와서 코드를 실행하는 식으로 말이다. 이건 뭐 다들 쓰는 방식일테니까 대충 이정도로 쓰고,
또하나의 활용방법은 (개꿀팁임)
base라는 레포지토리를 만들어둔다.
예를들어 front는 react, backend는 nodejs express로 돌아가는 투티어구조의 프로젝트를 만들고 싶다.
근데 이전에도 이미 이런 구조로 프로젝트를 진행했었다.
프론트 백 서로 api통신 프록시 설정, 단축어설정 다 되어있고, 뭐 필요한 모듈 패키지 동작되는 코드 추가되어있고 뭐 이런식의 내가 직접 짠 재활용이 가능한 코드를 base레포지토리로 지정해놓고 해당 프레임워크나 언어로 새로운 프로젝트를 만들고 싶은데, 이 작업을 매번 설치하고 코드 다시 짜고 할필요가 base레포지토리를 만들어두면 바로생략가능함.
이런 그림형식으로 하는거임.
이러면 매번 프로젝트 할때마다 새로 설치 다 하고 코드 서로 동작되게 셋팅하고 할 필요가 없는거다.
그리고 자주쓰는 git ignore양식은 저런 사이트에 가면 본인 언어나 프레임워크 선택하면 알아서 잘 뽑아줌.
Conclusion
사실 위에적은 pull, reset등 명령어는 거의 쓰지도 않는다. 그냥 난 백업용도로만 써왔어서 필요가 거의 없었고 내가 아는 지식상에서만 코드를 관리하는게 오히려 실수나 큰 사건없이 코딩을 꾸준하게 해준것같음. 가끔은 하드코딩이라도, 무지로인한 사건사고를 막는점은 더 좋다고 생각한다. 이번엔 취직하려고하다보니, 자세히 공부하고 적는것이지만 혼자 코딩하려는 사람들은 이 포스팅에서 딱 저것들만 알아도 무리없이 코딩할 수 있을것이다. 암튼 깃이 처음 배우면 매우 짜증나고 뭐가뭔지모르겠지만 쓰다보면 매우 편하고 공짜 스토리지용로도 쓰기 좋으니까 익혀두는게 좋다.