git

git 정리1

Posted by yunki kim on April 4, 2021

commit:

  커밋은 깃 저장소에 디렉토리에 있는 모든 파일에 대한 스냅샷을 기록하는 것이다. 깃은 가능한 커밋을 가볍게 유지하고자 하기 때문에 커밋때 마다 이전 버전과 다음 버전과의 차이점(delta)만을 기록한다. 그때문에 커밋은 그 위에 있는 부모커밋을 가리킨다. 

branch:

  브랜치는 특정 커밋에 대한 참조이다. 브랜치는 하나의 커밋과 그 부모 커밋들을 포함하는 작업내역이다.

  브랜치를 새로 생성할때는 git branch <new_branch>를 사용하면 된다. 하지만 단순히 브랜치를 만들고 커밋을 하면 새로 생성된 브랜치로 커밋이 되지 않는다. 이는 새로 생성된 브랜치로 이동을 하지 않았기 때문이다. 새로운 브랜치로 이동을 하기 위해서는 git checkout <branch_name>을 사용하면 된다.

merge:

  두개의 서로 다른 브랜치를 합친다. 이는 두개의 부모를 카리키는 커밋을 만들어 낸다. 두개의 무보가 있다는 의미는 한 부모의 모든 작업내역과 나머지 부모의 모든 작업, 그리고 두 부모의 모든 부모들의 작업내역을 포함한다는 의미를 가지고 있다. 현재 사용하고 있는 브랜치가 a이고 b라는 브랜치와 a를 합치고 싶다면 git merge b를 사용하면 된다. 그러면 a에 b가 합쳐진다

Rebase:

  커밋들을 모아서 복사한 뒤 다른 곳에 떨군다. 이는 커밋들의 흐름을 보기 좋게 한다는 장점이 있다. 리베이스를 사용하면 저장소의 커밋 로그와 이력이 깔끔해 진다. 현재 브랜치가 a이고 b로 리베이스하고 싶다면 git branch b를 사용하면 된다.

Head:

  현재 체크아웃된 커밋을 의미한다. 항상 작업 트리의 가장 최근 커밋을 가리킨다. 작업트리에 변경을 주는 작업은 대부분 HEAD를 변경하는 것으로 시작한다. 통상적으로 헤드는 브랜치의 이름을 가리키고 있다.커밋을 하면 해당 브랜치의 상태가 바뀌고 이 변경은 HEAD를 통해서 확인 가능하다.

  head 분리:

    head를 분리한다는 것은 헤드가 브랜치 대신 커밋에 붙는것을 의미한다. main이라는 브랜치가 c1이라는 커밋을 가르키고 있을때 git checkout c1을 하면 헤드가 main에서 c1으로 이동한다.

상대참고

  깃에서 다른 곳으로 이동할때 통상적으로 해시값을 입력하는 방식을 사용할 수 있다. 이때 해시값 전체를 다 입력하는 대신 해시가 커밋의 고유한 값인것 만을 증명할 수 있을 만큼의 해시만 입력해도 된다. 

  하지만 해시를 이용하지 않고 브랜치 또는 HEAD에서 출발해서 다른 지점에 도달해 작업을 할 수 있다. 

     1. ^: 브랜치의 부모를 찾는다. main^는 메인 브랜치가 가리키는 커밋의 부모를 체크아웃 한다, HEAD도 이와같은 방식으로 이동할 수 있 다. 사용법: git checkout <branch name | HEAD>^

    2. ~: 여러개의 부모를 한번에 올라갈 수 있다. 사용법: git checkout <branch name | HEAD>~<number>

  브랜치 강제로 옮기기

    다음과 같은 명령어를 사용해 브랜치를 특정 커밋에 직접적으로 재지정할 수 있다.

    git branch -f <branch name> HEAD~<num>

작업 되돌리기

  깃에서는 reset, revert를 통해서 깃에서 변경한 내용을 되돌릴 수 있다.

  reset은 브랜치가 예전의 커밋을 가리키게 한다. 따라서 마치 애초에 커밋하지 않은 것 처럼 예전 커밋으로 브랜치를 옮긴다. 하지만 reset의 경우 히스토리를 고쳐쓰기 때문에 다른사람이 작업하는 브랜치에서 사용할 수 없다. 이떄는 revert를 사용하면 된다.

   사용법: git reset <branch name | HEAD>~<num>

  revert는 변경분을 되돌리고 되돌린 내용을 다른 사람들과 공유한다. 이 내용은 새로운 커밋에 기록된다. 이 내역은 되돌리기를 원하는 커밋과 반대되는 내용이다. revert를 하면 다른사람에서 변경 내역을 push할 수 있다. 

  사용법: git revert <branch name | HEAD>