[Weekly Paper] Git

Jerry·2025년 7월 8일

Questions

Q. git rebase와 git merge의 차이점을 설명하고, 각각 어떤 상황에서 사용하는 것이 적절한지 설명해주세요.

A.

git rebase

  • 한 브랜치의 커밋 히스토리를 다른 브랜치의 HEAD 커밋 이후로 재배치하는 명령어입니다. 즉, 현재 브랜치의 시작점을 다른 브랜치의 최신 커밋으로 변경합니다.
  • merge하는 대신 커밋 히스토리를 직선형으로 유지하며 재배치합니다.

커밋 히스토리가 아래와 같고 현재 checkout된 브랜치가 "topic"일 때:

      A---B---C topic
     /
D---E---F---G main

다음 명령어 중 하나의 결과는:

git rebase main
git rebase main topic

다음과 같음:

              A'--B'--C' topic
             /
D---E---F---G main

이 때, A와 F가 동일한 커밋일 경우(Committer Information(name, email)은 달라도 됨)
rebase의 결과는 다음과 같음:

               B'--C' topic
              /
D---E---F---G main
  • -i | --interactive 옵션을 활용하여 커밋 메시지 수정, 순서 변경 등 세밀한 작업 수행이 가능합니다. git rebase -i HEAD~npick(p), squash(s) 키워드를 통해 여러 커밋을 하나의 커밋으로 합칠 때 주로 사용합니다.

git merge

두 브랜치 간의 변경 사항을 현재 브랜치에 병합하는 명령어입니다. git merge topic 일 때, topic 브랜치는 변경이 없으며, 현재 브랜치(예: main)에 topic의 변경 사항이 적용된 merge 커밋이 생성됩니다.

커밋 히스토리가 아래와 같고 현재 checkout된 브랜치가 "topic"일 때:

	  A---B---C topic
	 /
D---E---F---G main

다음 명령어의 결과는:

git merge main

다음과 같음:

	  A---B---C---H topic
	 /           /
D---E---F---G--- main

rebase와 merge의 차이점

  • rebase와 merge는 두 브랜치의 변경 내역을 한 브랜치에 통합한다는 공통점이 있습니다.
  • rebase의 경우 새로운 커밋이 생성되지는 않으며, 커밋 히스토리가 직선형으로 분기 없이 재배치됩니다.
  • merge의 경우 merge 커밋이 생성되며, 커밋 히스토리에서 언제 분기되고 merge됐는지 알 수 있습니다.

사용 적절한 상황

git rebase

  • 로컬에서 커밋 히스토리를 깔끔하게 정리하고 싶을 때 (git rebase -i HEAD~n)
  • main 브랜치에 변경 사항을 반영하기 전에 히스토리를 직선형으로 정리할 때 (github에서 rebase and merge를 실행하면 rebase된 후 fast-forward merge 됩니다.)
  • 리모트 레포지토리에 아직 공개되지 않았거나 혼자 개발하고 있는 브랜치여서 커밋 히스토리가 변경되어도 괜찮을 때

git merge

  • 현재 작업 브랜치에 쌓인 변경 내용을 그대로 유지하며 merge할 때
  • merge commit이 필요할 때
  • 리모트 레포지토리의 커밋 히스토리를 변경시키면 안될 때

Q. git fetch와 git pull의 차이점을 설명하고, 각각을 사용하는 것이 적절한 상황을 설명해주세요.

A.

git fetch

  • 원격 레포지토리의 변경 사항을 로컬 레포지토리의 origin/[branchName]들에 업데이트만 하고 로컬 브랜치들은 변경하지 않습니다.
  • 이후 사용자는 직접 git merge 또는 git rebase를 통해 변화 내용을 현재 checkout된 브랜치에 적용할 수 있습니다.
  • --all 옵션으로 모든 원격 레포지토리의 변경 사항을 가져올 수 있습니다.

git pull

  • git fetch origin [branchname]을 수행한 후 자동으로 현재 checkout된 브랜치에 merge합니다. (--rebase 옵션으로 rebase 가능)
  • git pull origin nextgit fetch origin nextgit merge origin/next를 합쳐놓은 것과 같습니다.(체크아웃된 브랜치에 origin/next의 변경 사항을 merge)

fetch와 pull의 차이점

  • git pullgit fetchgit merge (또는 git rebase)를 합쳐 놓은 명령어입니다.
  • git fetch는 모든 브랜치의 변경 사항을 가져올 수 있습니다.

사용 적절한 상황

git fetch

  • 리모트 레포지토리의 변경 내역을 검토하고 싶을 때
  • 아직 로컬 작업에 merge하지 않고 변경 내용을 확인하고 싶을 때
  • 모든 브랜치의 변경 사항을 가져올 때

git pull

  • 리모트 레포지토리의 변경 내용을 바로 내 작업에 반영하고 싶을 때

Reference

profile
Backend engineer

0개의 댓글