카테고리 없음

Git 기본 명령어 및 개념 정리

우디혜 2021. 2. 16. 01:56

⁕ 아직 채워야할 내용들이 많다.

 

git add <파일명>
git commit
git commit -a // add 명령 생략하고 자동 스테이징 + 커밋
git push
git pull // fetch + merge
git fetch {원격저장소} {브랜치} // 원격 저장소와 브랜치 생략 시 모든 원격 저장소에서 모든 브랜치를 가지고 온다.


add - 파일들을(변경사항 아님)을 스테이지에 추가

commit - 스테이지에 있는 내용을 커밋한다

push - 커밋 내용을 원격저장소로 옮기기

pull - 원격저장소의 내용을 가져오고 working디렉토리의 내용과 다르면 merge 한다 (Patch +_ merge)

fetch - 원격 저장소의 브랜치와 커밋들을 로컬 저장소와 동기화

 

git checkout <브랜치명>
git checkout -b <브랜치명>

checkout- 브랜치가 가리키고 있는 내용을 워킹 트리에 반영 == ( switch + restore )

 

git switch <브랜치명> // 현재 브랜치를 dev라는 브랜치로 변경
git restore <변경사항이 있는 파일 이름> // 파일의 변경사항을 복구함

switch- 작업중인 브랜치를 바꾼다 == head 를 바꾼다
restore - 
작업파일 복원

 

git stash {list | pop | apply | drop}
// stash 리스트를 확인하거나
// stash 저장내용을 현재 브랜치에 복구하고 stash에서 드랍시키거나(가장 먼저 저장되었던 친구)
// stash 저장내용을 현재 브랜치에 복구하되 stash에서 드랍시키지 않거나(가장 먼저 저장되었던 친구)
// stash 저장내용을 드랍하거나 (stash id로 특정하지 않는다면 가장 먼저 저장되었던 친구가 드랍)

stash - 임시저장 명령, 브랜치를 바꾸기 전에 작업중인 파일을 임시저장 - 참고
(커밋을 하고싶지는 않지만 현재 상태를 잠시 저장해두고 싶을 때 사용)

 

병합과 리베이스

git merge <타겟브랜치명>
git rebase <타겟브랜치명>

 

초기 상태

초기 브랜치와 커밋 정보가 왼쪽과 같다고 가정하면

초기 상태에서 병합을 실행한 모습

 

 

 

 

 

 

 

 

 

 

3-way 병합 (3-way Merge)

 

병합은 두 브랜치가 가리키고 있는 커밋들을 합치는 명령이다.


초기 상태에서 머지를 할 경우 새로운 머지 커밋 c4가 생성된다.


이때 두 브랜치가 가리키는 마지막 커밋만을 고려해주면 되기 때문에 최대 한 번의 충돌이 발생한다. (rebase는 여러 번 발생할 수 있다)

 

 

 

 

 

 

 

 

 

재배치(rebase)

 

현재 브랜치를 다른 브랜치 아래로 배치시키는 명령이다.

 

공통 조상인 c1을 기준으로 working과 master는 서로 다른 흐름을 가지고 있기 때문에 c1 아래의 c3부터 master가 가리키고 있는 커밋까지(지금은 c3밖에 없지만)를 working 브랜치가 가리키는 커밋, c2 아래로 위치시킨다.

 

커밋 흐름이 깔끔해진다는 장점이 있지만, 공통 조상 아래부터 master가 가리키는 커밋까지 여러 커밋에서 충돌이 발생할 위험이 있다. 때문에 rebase는 되도록 협업 시에는 사용하는 것을 지양하자. 혼자 작업할 때만 사용하는 것이 좋다.

 

 

 

 

커밋에 대한 오해

커밋은 차이점이 아니라 **스냅사진(Snapshot)**이다. 이전의 SVN(subversion)과 같은 버전관리 시스템에서는 변경 사항들만 저장했지만 Git(깃)은 전체를 저장하는 방식이다. SVN은 버전을 보여줄 때 파일이 만들어졌던 맨 처음까지 거슬러 올라가 바뀐 부분들을 모두 반영하는 연산을 진행해야하기 때문에 프로젝트 규모가 커지게되면 비효율적이다. 변경 사항이 100번이면 100번 연산을 진행해야하기 때문이다. Git(깃)처럼 스냅샷으로 파일정보를 저장하게되면 바로 앞의 커밋과 비교하는 연산만 진행하면 되기 때문에 훨씬 효율적이다.

브랜치

브랜치는 커밋 노드들의 포인터다!

그리고 현재 작업 중인 브랜치 혹은 커밋 노드를 가리키는 포인터를 HEAD 포인터라고 한다.

 

깃 사용과 관련된 팁

1. gitignore 사용 - 불필요한 파일은 커밋하지 않는다. (gitignore.io 를 참고하면 편리하다)

2. 커밋 메세지는 최소 3분 정도는 투자해서 구체적으로 작성하라

 

* reset과 revert도 자세히 알아보자 - 참고