본문 바로가기

Git

Git - 동작 정리 (심화편)

- fast-forward (빨리감기)

: merge를 진행할 때의 방법중의 하나. pull은 fetch + merge의 두가지 동작이 이루어지는데 merge를 진행할 때 보통은 merge commit을 생성하여 합치지만, fast-forward merge는 단순하게 HEAD만 이동시켜서 코드를 업데이트 시켜준다.

 

- fast-forward merge

원격 저장소에서 pull을 해야하는 상황
fast-forward merge로 실행완료

- 3-way merge

원격저장소에서 pull을 해야하는 상황인데, 원격저장소의 내용에 없는 내용이 포함되어 있는 상황
이런 경우에는 3-way merge 방법을 통해 원격저장소에 새로운 merge commit을 만들어 낸다.

(출처: backlog.com/git-tutorial/kr/stepup/stepup3_1.html)

=> 두가지 merge방법 모두 conflict가 일어날 수 있으므로, conflict가 발생할 경우, 풀어주면서 merge를 진행하면 되겠지만, history상으로 보기 좋지 않을 것이다. 그래서 앞서 학습했던 rebase를 사용하는 경우에는 history가 깔끔히 정리가 될 것이다.

 

- fetch (가져오기)

: 원격 저장소의 내용만 받아오고, 로컬 저장소의 브랜치와 병합은 진행하지 않는다.

 

- Tag (태그)

: 커밋을 참조하기 쉽도록 알기 쉬운 이름으로 붙이는 것. 한번 붙인 태그는 브랜치처럼 위치가 이동되지 않고 고정됨.

태그는 이와같이 사용될 수 있다.

=> PR을 통해 코드를 Merge한 이후, 운영환경에 실제 배포를 했는데, 장애가 발생한다면, 어떤 특정 상태로 롤백시킬때 기준으로 삼도록 할 수 있음

=> 특정 APP버전에 맞도록 하는 배포코드 history관리성으로 사용할 수 있다.

  • 일반 태그(Lightweight tag)
    • 이름만 사용
  • 주석 태그(Annotated tag)
    • 이름, 설명, 서명, 이메일, 날짜 등의 정보를 사용

[command]

$ git tag [태그명]

: 태그를 추가한다.

$ git tag -am "주석내용" [태그명]

: 태그 추가시, 주석이 달린 태그를 추가한다.

$ git tag [옵션]

: 등록된 태그 목록을 본다

(!) tag 옵션

-n : 태그 목록 + 주석 내용 확인

$ git log --decorate

: 깃 history조회시, tag까지 확인

$ git tag -d [태그명]

: 태그를 삭제한다.

 

- commit --amend (커밋 메시지 수정하기)

: 직전 커밋의 메시지이름을 수정한다. (rebase처럼 commit hashkey가 변경됨)

[command]

$ git commit --amend

message창이 나타나는데, 수정할 내용을 입력한다.

 

- revert (커밋 되돌리기)

: 지정한 커밋 내용을 새로운 커밋을 통해서 되돌린다.

 

[command]

$ git revert [되돌릴 커밋 hashKey]

 

예제)

1] test222의 내용이 있는 커밋을 되돌려보자.

2] 명령어 입력 (명령어를 입력하게 되면, edit창이 노출되는데, 기본적으로는 Revert "되돌리는 커밋메시지"로 설정이 되는데, 메시지명도 변경이 가능하다.)

3] 커밋 되돌리기 완료. 새로운 커밋이 생성된 부분은, 작업했던 내용을 반대로 적용시켜준다.

 

- reset (되돌리기2)

: revert와 마찬가지로 커밋을 되돌리는 목적으로 사용한다. 하지만 revert와 다른점은, git의 HEAD를 자유롭게 이동하여 적용을 하기때문에, commit이력이 삭제될 수도 있다. 해당 기능을 사용할때는 주의를 해야한다.

 

[command]

$ git reset [type] [hashKey]

(!) [type] 설명

    --hard : stage, unstage에 있는 진행중인 작업모두 초기화가 되고, working directory의 HEAD를 지정한 [hashKey]의 상태로 이동(=변경)한다.

(!) working directory란? 각 commit들로 이루어진 브랜치 history들

    -- mixed (default값) : stage, unstage에 있는 진행중인 작업은 유지시키면서, working directory의 HEAD를 지정한 [hashKey]의 상태로 이동한다.

    -- soft : working directory의 HEAD를 지정한 [hashKey]의 상태로 이동시키면서, 현재커밋 ~ [hashKey] 사이에 변경된 내용들을 unstage 상태로 변경한다.

 

(!) [hashKey]를 sdjanv833fnvwskncu38sd98 <-- 이런 형태가 아닌, HEAD에서 n번째~의 형태로도 지정할 수 있다. 예를들어 git reset --hard HEAD~3 이라는 명령을 내리면, 현재 HEAD(일반적인 상황에서는 최신커밋 기준)에서 3번째 전으로 되돌아가라는 뜻이다.

HEAD~3 을 통해 로컬저장소 working directory가 이동된 모습.

 

- cherry-pick

: 특정 커밋 1개를 가져와서 커밋을 만든다.(=작업 복사)

    보통 다른 브랜치에서 내브랜치에 필요한 내용을 가져와서 적용시킨다. 자신의 브랜치의 커밋을 cherry-pick 할 수도 있지만, 99% 코드충돌이 발생할 것이다. 또한 다른 브랜치에서 작업내용을 가져오게되면, 나중에 cherry-pick 해온 브랜치와 merge를 하는 상황이 생기는 경우에 충돌이 일어날 가능성이 있으므로, 유의해야한다.

 

[command]

$ git cherry-pick [hashKey]

 

- interactive rebase (대화형 재배치)

: 대화형 재배치. commit history관리에 매우 유용하다.

 

[command]

$ git rebase -i [hashKey]

: 여기서, [hashKey]는 rebase할 범위를 지정할 기준점이며, 이 기준점 "이전~" 까지의 범위이다.

 

$ git commit --amend

: 커밋 내용을 편집한다. 이 명령어를 실행하면 커밋에 대한 편집기가 열린다.

 

$ git rebase --continue

: edit, squash 등 커밋 변경작업 진행시, 변경을 다 진행했으면 rebase를 계속 진행하라는 명령

 

$ git rebase --abort

: 현재 rebase 진행중인 작업을 중단시키는 명령

 

해당 내용은 개념적으로 접근이 조금 어려울 수 있으며, 설명이 길어질 수 있으므로 저보다 설명을 더 잘해주신 분의 링크로 대체하겠습니다.

(참고: beomseok95.tistory.com/231)

 

'Git' 카테고리의 다른 글

Git - SVN과의 비교  (0) 2022.03.10
Git - Branching Model  (0) 2021.02.25
Git - 동작 정리 (기본편)  (0) 2021.02.16