[git] git 장인이 되고싶다

git은 버전 관리 소프트웨어다. 코드 짜다가 실수를 하면 되돌릴 수 있고, 코드의 히스토리를 알 수 있다. git을 잘 다룰 줄 알아야 프로젝트할 때 고생스럽게 짜둔 코드를 날려먹어서 팀의 민폐종자가 되지 않을 수 있따..duldul
git 장인이 되는 그날을 위해.. 가보자고🙌
►코딩애플의 매우 쉽게 알려주는 git & github을 참고해 작성했습니다.
(무료) 매우쉽게 알려주는 git & github - 코딩애플 온라인 강좌
누구나 마음 한켠엔 나만의 웹서비스를 만들고 싶어합니다. 프론트엔드는 어찌저찌 하겠는데 서버 만드는게 어렵고 귀찮다고요? 그렇다면 Firebase를 쓰십시오. 구글이 웹서버를 대신 만들어
codingapple.com
git 설치하기
windows에서는 git windows를 검색해서 대충 다운받고 설치하면 된다고 한다.. 나는 맥OS라 잘 몰?루
맥에서는 homebrew를 먼저 설치하고 brew install git을 입력하면 끗
git을 설치하고 나서는 git --version으로 잘 설치되었는지 확인하고
다음과 같은 명령어로 유저 이름을 세팅한다.
git config --global user.email "홍길동@naver.com"
git config --global user.name "홍길동"
git 기본 사용법
작업할 폴더에서 터미널을 열고 git init을 입력하면 그 폴더에서 git을 사용할 수 있게 된다.
폴더에 파일들을 생성하고 작업을 마쳤다면 git에 저장을 한다.
git add 파일명
git commit -m '아무 메세지'
//여러 파일을 한꺼번에 스테이징
git add 파일명1 파일명2
//작업 폴더의 모든 파일을 스테이징
git add .
//스테이징된 파일들을 확인
git status
//스테이징 취소
git restore --staged 파일명
//커밋 내역 확인
git log --all --oneline
git log --all --oneline --graph
git add는 staging area에 파일을 더하는 작업을 하는 것이고, git commit은 repository에 파일을 저장하는 것이다.
위와 같은 코드로 지금까지의 작업 내용을 스테이징하고, 레포지토리에 저장하고, 상태를 확인할 수 있다.
커밋 내역 비교하기
git diff
git difftool
git difftool 커밋아이디
git difftool 커밋아이디1 커밋아이디2
git diff를 입력하면 이전 커밋 내역과 현재 파일을 비교해 볼 수 있다.
git difftool을 입력하면 좀 더 시각적으로 편리하게 차이점을 볼 수 있다. hjkl키가 방향키, :q, qa로 종료
git difftool 커밋 아이디를 입력하면 특정 커밋과의 차이점을 비교할 수 있다.
그러나 터미널에서 수정 내용을 보는 것이 불편하기 때문에 그냥 에디터에서 익스텐션 설치하라.
branch 만들고 병합하기
branch는 커밋의 복사본이라 할 수 있다. 새로운 기능을 추가할 때 지금까지 작업한 내용은 안전하게 보관하고 새롭게 복사본을 만들어서 작업하면 편안한 마음으로 새빨간 에러창을 마주할 수 있다. 언제든 돌아가면 되니까..!
git branch 사본이름
git switch 사본이름
git branch로 브랜치를 생성하고, git switch로 개별 브랜치로 이동한다.
브랜치를 생성하기 전에는 main 브랜치에 있었던 것이므로 git switch main을 하면 메인 브랜치로 돌아갈 수 있다!
브랜치에서 원하던 작업을 마친 뒤에 main 브랜치로 그 변경사항을 적용하려면 병합을 하면 된다.
병합을 할 때는 병합을 하는 메인 브랜치로 가서 병합 명령을 한다.
git merge 병합될 브랜치명
이때 서로 다른 파일이나 다른 줄에서의 작업이 이뤄졌다면 상관이 없지만 서로 충돌되는 수정사항이 있다면 confilct가 생긴다. conflict를 해결할 때는 원하는 코드만 남기고 git add - git commit을 순서대로 해주면 된다.

브랜치와 병합 작동방식
3-way-merge
병합할 브랜치들에 각각 신규 커밋이 1회 이상 있는 경우 3-way-merge가 일어난다.

fast-forward merge
만약 메인 브랜치에는 새로운 커밋이 없고 신규 브랜치에만 커밋이 있는 경우에는 신규 브랜치를 그냥 메인 브랜치로 새롭게 명명하게 된다. 이 경우는 fast-forward merge라고 한다. 만약 이렇게 하는 것이 싫다면 git merge --no-ff 브랜치명으로 강제로 3-way merge를 시킬 수도 있다.

참고로, 브랜치를 병합했다고 해서 브랜치가 삭제되는 것은 아니다.
//merge 완료된 브랜치 삭제
git branch -d 브랜치명
//merge 안 한 브랜치 삭제
git branch -D 브랜치명
위와 같은 명령어로 merge 여부에 따라서 브랜치를 삭제할 수 있다.
rebase and merge
rebase는 브랜치의 시작점을 다른 커밋으로 옮기는 것이다. 메인 브랜치의 가장 최신 커밋으로 브랜치를 rebase한 뒤 fast-forward merge하는 방법으로 브랜치를 머지해 줄 수도 있다.

왜 이런 식으로 하냐? 3-way merge를 하면 너무 복잡해질 수 있고, 간단하과 짧은 브랜치들은 rebase를 했을 때 더 깔끔해지기 때문이다. 다만 conflict가 많이 발생할 수 있다는 점은 주의해야 한다.
일반 병합를 할 때는 중심 브랜치로 이동해서 병합해 주지만, rebase해서 병합하고 싶다면 새로 생성된 브랜치로 이동해서 명령을 수행한다. 명령어는 다음과 같다.
git rebase 중심브랜치명
squash and merge
모든 브랜치에 대해서 3-way merge를 하면 나중에 매우 복잡해지고 브랜치에서의 커밋 내역도 메인에 병합돼 버려서 메인 브랜치의 커밋 내역이 뭐였는지 알아보기 어려워질 수 있다. 이를 방지하기 위해서는 rebase를 하거나 squash and merge를 할 수 있다. squash and merge는 새 브랜치에 있던 변경사항들만 가져와서 main 브랜치에 붙여주는 것이다.
git switch main
git merge --squash 브랜치명
git commit -m '메세지'
파일 복구
파일 복구는 파일 단위로 되돌리는 restore과 커밋 단위로 되돌리는 revert, 특정 커밋으로 모든 것을 되돌리는 reset이 있다.
//파일을 최근 커밋으로 되돌리기
git restore 파일명
//파일을 특정 커밋으로 되돌리기
git restore --source 커밋아이디 파일명
//스테이징 취소
git restore --staged 파일명
git revert 커밋아이디(한 개 이상 입력 가능)
//가장 최근의 커밋 취소
git revert HEAD
revert를 하면 해당 커밋에서 적용된 변경 사항만 취소된 새로운 커밋을 생성한다.
git reset --hard 커밋아이디
reset을 하면 특정 커밋으로 모든 것을 되돌릴 수 있다. 협업을 할 때는 다른 사람이 작업한 코드도 모두 삭제해 버리는 위험이 있을 수 있으니 사용하지 말 것!