Git 기초 명령어 사용법 정리
서론
https://inpa.tistory.com/category/GIT같은 블로그를 보면 Git에 대한 자세한 내용을 익힐 수 있다.
git의 개념이해와 git 명령어에 대한 정확한 이해와 사용법도 잘 정리되어있다.
그래서 이 글은 git에 대한 설명을 하기보다는
처음 git을 사용하는 사람들한테 필요한 명령어소개와 merge 충돌상황에 대해 간단한 예제를 보여준다.
Git 작동구조
처음쓰는 Git 기본 명령어
git init :
- 현재 폴더에서 git을 사용하겠다는 명령어. Git이 현재 폴더를 working directory로 인식.
현재 폴더에 .git 폴더가 생성된다.
git status :
- 현재 working directory의 파일 상태를 보여줍니다
git log
- 지금까지의 commit 역사를 보여줍니다.
git add '파일명'
- working directory(Unstageing Area)의 파일을 Staging Area로 이동시킨다
git commit -m "메세지"
-Staging Area에 있는 모든 파일을 Local Repository로 옮긴다
git push 'remote이름' 'branch 이름'
- Local Repository에 있는 모든 파일을 Remote Repository로 옮긴다
git pull 'remote이름' 'branch 이름'
- Remote Repository에 있는 내용을 Working directory로 옮긴다
git commit --amend -m "메세지"
- 바로 이전 commit 메세지의 내용을 변경한다.
git reset --옵션 커밋번호
- z커미커밋으로 되돌아간다.
git reset --옵션 HEAD^,^^, ~n
- HEAD로 부터 몇번째 커밋이전으로 되돌아간다.
(이후 unstaged 된거 restore 해야 됨)
git revert --옵션 커밋번호 / --옵션 HEAD^,^^, ~n
-reset 처럼 되돌아가지만, reset은 돌아가시점 이후의 커밋기록을 없앤다.
revert는 현재 HEAD에서 돌아갈시점의 상태로 새롭게 커밋한다.
(revert도 커밋이기때문에 돌아갈 시점전에 같은 파일을 건드렸다면 merge충돌난것처럼 작업해줘야한다.
git revert --시점 이지만 실제로는 '시점'이전상태로 되돌아간다.
git branch
- 현재 브랜치들을 확인한다.
git checkout '브랜치 이름'
- 브랜치로 이동한다
git branch '브랜치 이름'
- 현재 있는 브랜치에 새로운 자식브랜치를 만든다.
git branch -d '브랜치이름'
- 해당 브랜치를 삭제한다.
git merge -머지옵션 '자식브랜치이름' -m "메시지" (Merge Commit)
- 현재 브랜치에서 자식브랜치의 작업내용을 합친다.
머지의 3가지 상황인 Fast-Forward, No-Fast-Forward , Three-Way에 대해 이해하고 사용해야한다.
※Merge Commit이외의 Sqush Merge, Rebase Merge도 있지만
기본 merge인 Merge Commit에만 집중하자.
Merge 충돌상황과 해결
먼저 원하는 폴더에서 a.txt를 만들고 git init 명령어를 통해 git을 초기화 한다.
처음상태에서는 commit 로그가 없기 때문에 branch도 없는걸로 인식되기 때문에 커밋을 한번 해주자.
git add a.txt , git commit -m "initial commit a.txt'
그리고 git branch를 통해 현재 브랜치를 확인한다. 현재 master 브랜치에 있는 것을 알 수 있다.
git log에서 현재 커밋된 로그를 볼 수 있다. (앞의 6자리가 commit 이름이다.)
branch-a를 만들고 master브랜치에서 branch-a로 이동한다.
git branch로 master브랜치에서 branch-a로 이동한 것을 확인할 수 있다(초록색 표시)
그림은 branch-a로 이동만하고 commit을 안 했기 때문에 점선으로 표시했다
현재 branch-a에 있는 상태에서 a.txt를 수정하고 commit해보자.
이젠 master브랜치로 이동하자.master브랜치로 이동하면 a.txt는 빈 내용이다.
이 상태에서 a.txt를 수정하고 commit하자.
현재 master브랜치에서 자식브랜치인 branch-a를 merge해보자. merge는 Merge commit방법으로 한다.
branch-a가 갈라진 시기는 '04f034'이고 merge되기 전 '18a408' 커밋이 있었다.
이제 branch-a를 merge 할 때 master입장에서는 '18a408' 다음 커밋이 될 텐데
'18a408' , branch-a의 'a5f6c3' 도 다 a.txt를 건드렸기 때문에 충돌이 발생한다.
이 상태에서 a.txt를 키면 충돌내용이 적혀있다.
충돌내용을 적절히 원하는대로 수정한 다음 Merging상태에서 a.txt를 새로 커밋하면
수정한 내용을 가지고 merge 된다. (master브랜치 입장에서 merge도 하나의 새로운 커밋이다)
Merge가 끝났으면 필요없는 branch-a를 삭제하면 깔끔하게 master브랜치에서
작업을 이어가면 된다.