[Git] 7~8강까지의 내용 정리

bacccine·2022년 4월 7일
0

Git

목록 보기
4/4

GitHub 기능(fork, pull request, .gitignore)부터 Git 명령어(cherry-pick, rebase)까지

GitHub fork → 원본 저장소를 복제해서 나만의 작업 공간 만들기

문제) 대규모 프로젝트에서 작업자 모두 자신의 branch를 만드는 경우 많은 branch가 생길 것
해결) branch 대신 GitHub fork를 이용하면 원본 저장소와 독립적인 복사 저장소를 만들 수 있다

fork에서 작업한 내역을 메인 Repository에 merge해달라고 요청하기

  • fork 저장소에서 작업한 내역을 메인 repository에 반영하고 싶을 때 pull request를 사용한다
  • 메인 저장소는 pull request만을 통해 merge를 허용하는 정책을 사용하면 무분별한 코드 변경을 방지할 수 있다
  • 내 GitHub 저장소에서 Pull requests > New pull request 버튼 > create pull request 버튼을 눌러서 생성 가능

.gitignore 파일

  • 변경사항을 추적하고 싶지 않은 파일, 확장자 등은 별도의 .gitignore 파일을 통해 관리할 수 있다
  • .gitignore 파일을 통해 불필요한 파일들을 추적대상에서 제거할 수 있다
  • *.log 등으로 입력한다면 해당 확장자인 파일들은 전부 추적 대상에서 제거된다
  • .gitignore에 등록된 파일들은 아무리 새롭게 추가되더라도 git status 명령을 찍어보면 추적되지 않는 걸 볼 수 있다

특정 commit만 다른 branch에 추가하기

  • 다른 branch 에 있는 특정 commit만 반영하려면 git cherry-pick "반영하고 싶은 commit hash" 명령 이용
  • 해당 명령을 사용하는 경우 예) 한 branch에서 다음 버전 기능을 개발 중인데 심각한 버그를 발견하여 이를 수정한
    수정 내역만 빠르게 master branch에 적용하고 싶을 때
  • 모든 branch의 로그를 확인하고 싶을 때 git log --branches 사용

base를 바꿔서 합치는(merge) 방법

  • 2개의 branch 를 합치는 명령어엔 (1) merge와 (2) rebase가 있다
  • merge 알고리즘엔 (1) Fast-forward merge 와 (2) 3-way merge가 있다

Fast-forward-merge

  • branch 생성 이후 추가 commit이 없을 때 별도의 추가 commit을 진행하지 않을 경우,
    추가적인 commit 메시지 없이 빨리감기 형태로 merge가 진행되는 방식
  • 예시

다음과 같이 도중에 dev 브랜치를 하나 파서 커밋을 한 다음 이를 master 에 합치는 걸 생각해보면
dev에서는 3개의 commit이 이루어졌지만 master에선 변화가 일어나지 않았다.
이 상태에서 master 브랜치에 dev 브랜치를 merge하게 되면 다음과 같이 빨리감기 효과가 나타난다
→ 3개의 commit 내역이 붙어서 merge 내역에 반영

추가적인 merge commit 메시지 없이 master 브랜치의 추가 merge 과정에서 dev 브랜치의 미래에
생성된 commit이 뒤 쪽에 붙는 형태로 merge가 일어난다.

  • 발생 시점) merge 대상이 되는 브랜치에서 merge 할 브랜치의 추가 commit 이 생긴 이후에
    대상 브랜치에선 새로운 내용이 추가되지 않을 경우 발생

3-way merge

  • branch 생성 이후 추가 commit이 있을 경우 2개의 merge를 수행하는 merge commit 을 별도로 생성한 이후
    merge 진행
  • 예시

이 상황에서 merge commit을 생성하게 된다면 master commit ─ master commit ─ branch commit을 참고해서
merge를 하게 된다. 이 때 merge를 했다란 commit 메시지가 생긴다

  • 대규모 SW 개발에서 merge commit이 지속적으로 생기면 나중에 history 관리가 어려워질 수 있다

rebase

  • merge commit 메시지가 생성되는 번거로운 상황에서 base를 다른 branch의 최신 commit으로 바꿔주어
    병합과정에서 별도의 merge commit이 생성되지 않게 만들어주는 명령어
  • git rebase rebase대상branch
  • fast-forward-merge 방식으로 merge가 되어 추가적인 merge commit message가 생성되지 않는다
  • base가 다른 branch의 최신 commit으로 변경된다는 건 즉 그 branch 입장에선 변경이 일어나지 않는 것에 해당
  • rebase 명령어는 대상 브랜치가 아니라 합쳐질 브랜치 위치에서 수행한다

0개의 댓글