GIT & GitHub (4)

ByeolGyu·2024년 7월 26일

git

목록 보기
4/5

✔ Merge

1. Fast-forward Merge

: 병합 대상 브랜치가 현재 브랜치의 최신 커밋에서 출발한 경우 발생

  • 브랜치 포인터를 앞으로 이동시키기만 하면 됨
  • 병합 커밋이 생성되지 않고 충돌도 발생하지 않음

main브랜치에서 파생한 dev_ggr 브랜치에서 새로운 커밋 후
$ git checkout main 으로 main 브랜치로 이동
$ git merge dev_ggr 하면 main 브랜치에서 dev_ggr을 병합

2. Three-way Merge

: 병합하려는 브랜치들이 서로 다른 변경사항을 포함할 때 발생

  • Git이 새로운 병합 커밋을 만들어 두 브랜치의 변경사항을 합치며, 충돌이 발생할 수 있음
  • 사용자가 충돌을 수동으로 해결

1) 충돌 없을 때

main브랜치에서 파생한 dev_pwd 브랜치에서 새로운 커밋 후
$ git checkout main 으로 main 브랜치로 이동
main에서 새로운 커밋


→ 즉, dev_pwd에서도 main에서도 커밋이 생성 되어 있는 상태이기 때문에 충돌 발생 가능성 있음
main 에서 $ git merge dev_pwd 하면 VI 에디터 켜짐

여기에서 : wq 하면 빠져나옴

$ git log로 확인 가능

2) 충돌 발생시

main브랜치에서 파생한 dev_ggr 브랜치를 만들고
dev_ggr에서 파일을 수정한 후
git status 하면

커밋 후 checkout main
main 브랜치에서 동일 파일을 수정하면

→ 같은 파일을 dev_ggr 에서도, main에서도 수정한 상황에서
main에서 dev_ggr 통합

  • CONFLICT (content): Merge conflict in 초기세팅-main.txt을 통해 초기세팅-main.txt 파일에서 병합 충돌 발생을 알 수 있음
  • $ git status 로 충돌 파일 볼 수 있음

해당 파일에 들어가보면 아래처럼 충돌이 난 부분을 확인할 수 있음

  • <<<<< 현재 브랜치의 내용 ====== dev_ggr 브랜치의 내용 >>>>> 이 표시됨

  • 파일을 편집하여 충돌 표시를 제거하고, 어떤 내용을 유지할지 결정

  • 저장 후 add & commit

✔ git reset

: 특정 커밋으로 되돌림

1. --soft

: 커밋 로그 정보만 제거

  • 변경 사항은 staging(index)영역 & 작업 디렉터리에 남아있음
  • 최근 커밋을 취소하고, 변경 사항을 스테이징 상태로 유지하고 싶을 때 사용
  • 마지막 커밋의 로그 이름을 변경하고 싶을 때 사용

    커밋 로그만 사라지고 변경사항은 스테이징 상태로 유지 & 작업 디렉터리에 남아있음

2. -- mixed

: 커밋 로그 & staging 영역 제거

  • 변경 사항은 작업 디렉터리에 남아있음
  • 최근 커밋을 취소하고, 변경 사항을 다시 선택하고 커밋하고 싶을 때 사용
  • 작업 디렉터리의 소스파일을 수정해서 새롭게 커밋할 때

    스테이지 영역에는 올라가지 않음 코드 수정 후 스테이지 영역에 올리고 커밋하면 됨

3. -- hard

: 커밋 로그 & staging 영역 & 작업 디렉터리 내용 제거

  • 변경 사항을 모두 포기하고 특정 커밋 시점으로 완전히 되돌리고 싶을 때 사용

    커밋 로그 / 스테이징 영역 / 작업디렉터리 모두 제거
    - git reflog로 복구할 수 있으나 주의해서 사용해야함

✔ git reflog

: git 의 모든 커밋된 정보를 저장

  • 삭제 된 커밋정보도 가지고 있어 해당 커밋을 복구 가능

    삭제되었던 커밋이 복구 된 것을 확인 가능

✔ git rebase

: 여러 개의 커밋을 하나로 합치거나, 불필요한 커밋을 제거하거나 수정

  • Pull Request를 보내기 전 rebase해서 커밋 로그를 깔끔하게 정리해서 PR요청

1. Pick

: 커밋을 선택하여 그대로 유지한다는 의미

  • 각 커밋을 그대로 유지하고, 커밋 메시지를 변경하지 않으며, 순서도 변경하지 않음

2. Squash

: 여러 커밋을 하나의 커밋으로 합치고 싶을 때 사용

  • 스쿼시할 커밋의 내용은 이전 커밋에 병합

  • 스쿼시된 커밋의 메시지는 이전 커밋 메시지와 함께 편집 가능

  • $ git rebase -i HEAD~3 : Head부터 3개를 스쿼시

  • vi 에디터에서 head가 맨 아래 나오는 것 확인 가능

  • insert모드로 바꿔서 squash 할 부분의 pick을 지우고 s로 변경

  • :wq로 빠져나옴

  • 로그를 확인하고

  • 나머지 로그는 지우고 상단에 커밋 메세지를 작성함

  • log로 커밋이 합쳐진 것 확인 가능

profile
ByeolGyu

0개의 댓글