🌿git flow 브랜치 μ „λž΅μ„ μ‚¬μš©ν•˜μ—¬ μ•ˆμ „ν•˜κ²Œ ν”„λ‘œμ νŠΈ 관리해보기

ν”„λ‘œμ νŠΈλŠ” 첫 μ œμž‘μ΄ μ™„λ£Œλ˜μ—ˆμ„ λ•Œ μ’…λ£Œλ˜λŠ”κ²ƒμ΄ μ•„λ‹ˆλΌ, μƒˆλ‘œμš΄ μ‹œμž‘μ΄λΌκ³  λ³΄λŠ”κ²ƒμ΄ λ§žλŠ”κ²ƒ κ°™λ‹€.

μƒˆλ‘œμš΄ κΈ°λŠ₯이 μΆ”κ°€λ˜κ³ , 버그λ₯Ό μˆ˜μ •ν•˜κ³ , μ„±λŠ₯ν–₯상을 μœ„ν•΄ λ³΄μˆ˜μž‘μ—…μ„ ν•˜λŠ”μ μ—μ„œ 말이닀.

ν•˜λ‚˜μ˜ ν”„λ‘œμ νŠΈμ— μ—¬λŸ¬ μ‚¬λžŒμ΄ ν•¨κ»˜ μž‘μ—…μ„ ν•˜λ‹€λ³΄λ©΄ 각각의 생각과 μŠ΅κ΄€ μŠ€νƒ€μΌλ“€μ΄ μ½”λ“œμ— λ¬»μ–΄λ‚˜κ²Œ λ˜λŠ”λ° κ·ΈλŸ¬ν•œ 차이λ₯Ό λ‚˜μ˜λ‹€κ³  ν•˜λŠ”κ²ƒμ΄ μ•„λ‹ˆλΌ ν•˜λ‚˜μ˜ κ³΅ν†΅λœ κ·œμΉ™μ„ κ°–κ³ , μ½”λ“œλ₯Ό 리뷰해볼 ν•„μš”λ„ μžˆλ‹€.

μ—¬λŸ¬ 변경사항을 ν•˜λ‚˜μ˜ ν”„λ‘œμ νŠΈμ— λ³‘ν•©ν•˜κ³ , 이전 μ½”λ“œλ“€μ— λŒ€ν•œ 기둝을 λ‚¨κΈ°λŠ” λ“± 개발 ν™˜κ²½μ— μžˆμ–΄ ν˜‘μ—…μ„ μœ„ν•΄ 큰 도움을 μ£ΌλŠ”κ²ƒμ΄ 둜컬 μ €μž₯μ†Œμ˜ Git 원격 μ €μž₯μ†ŒμΈ Github이닀.

Git flow

κΉƒ ν”Œλ‘œμš°λ₯Ό κ²€μƒ‰ν•˜λ©΄ κ°€μž₯ 많이 λ‚˜μ˜€λŠ” 그림이 μžˆλ‹€.

1

μ²˜μŒμ— 그림을 λ³΄μ•˜μ„ λ•Œμ—λŠ” 무엇을 μ˜λ―Έν•˜λŠ”μ§€ 이해가 λ˜μ§€ μ•Šμ•˜μ§€λ§Œ, μ‹€μ œλ‘œ μ μš©ν•΄λ³΄λ‹ˆ μ–΄λŠμ •λ„ 감이 μž‘νžˆλŠ”κ²ƒ κ°™μ•˜λ‹€.

master

μ‹€μ œλ‘œ 배포되고 μžˆλŠ” μ†ŒμŠ€κ°€ μ €μž₯λ˜μ–΄μžˆλŠ” 브랜치 이닀.

develop

μ‹€μ œλ‘œ 배포되고 μžˆλŠ” μ†ŒμŠ€κ°€ μ•„λ‹Œ, μƒˆλ‘œμš΄ κΈ°λŠ₯듀이 μΆ”κ°€λ˜κ³ μžˆλŠ” λΈŒλžœμΉ˜μ΄λ‹€.

λΆˆμ™„μ „ν•˜μ§€λ§Œ, κ°€μž₯ μ΅œμ‹ μ˜ μ†ŒμŠ€λΌκ³  λ³΄λŠ”κ²ƒμ΄ λ§žλŠ”κ²ƒ κ°™λ‹€.

feature

developλΈŒλžœμΉ˜κ°€ μƒˆλ‘œμš΄ κΈ°λŠ₯듀이 μΆ”κ°€λ˜κ³ μžˆλŠ” ν•˜λ‚˜μ˜ ꡡ은 μ†ŒμŠ€λΌκ³  λ³΄μ•˜μ„ λ•Œ, κ·Έ μƒˆλ‘œμš΄ κΈ°λŠ₯듀이 μ‹€μ œλ‘œ 생성 λ˜λŠ” 브랜치라고 보면 될 것 κ°™λ‹€.

둜그인기λŠ₯ 개발, νŒμ—…κΈ°λŠ₯ 개발 λ“±λ“±

hotifx

배포가 되고 μžˆλŠ” master 브랜치의 μ†ŒμŠ€μ—μ„œ κΈ΄κΈ‰ν•œ 버그가 λ°œμƒν•˜μ˜€μ„ λ•Œ, κΈ‰ν•˜κ²Œ μˆ˜μ •μ„ ν•˜μ—¬ λ°˜μ˜ν•˜λŠ” 브랜치 라고 ν•œλ‹€.

생각해보면, κ°‘μžκΈ° λ°œμƒν•œ μ—λŸ¬λ₯Ό developμ—μ„œ λ°˜μ˜ν•œλ‹€κ³  ν•˜λ©΄, λ‹€μŒ μ—…λ°μ΄νŠΈκ°€ μžˆμ„ λ•Œ κΉŒμ§€ 버그가 μˆ˜μ •λ˜μ§€ λͺ»ν•  λΏλ”λŸ¬, λ°”λ‘œ μˆ˜μ •ν•˜λ”λΌλ„ μž‘μ—…μ€‘μΈ κΈ°λŠ₯듀이 μ™„μ„±λ˜μ§€ λͺ»ν•œ μ±„λ‘œ 남을 수 있기 λ•Œλ¬ΈμΈκ²ƒ κ°™λ‹€.

release

develop브랜치둜 μƒˆλ‘­κ²Œ μ—…λ°μ΄νŠΈ λ˜λŠ” μ†ŒμŠ€λ“€μ΄ λͺ¨λ‘ μ •λ¦¬λœλ‹€λ©΄, ν…ŒμŠ€νŠΈ 등을 μ§„ν–‰ν•˜λŠ” 브랜치라고 ν•œλ‹€.

κ³Όμ •λŒ€λ‘œ 진행해보기

2

κΈ€λ‘œ κΈ°λ‘ν•˜κΈ° μ „, μ‹€μ œλ‘œ λ°˜μ˜μ„ ν•΄λ³Έ 결과물이닀. κ°„λ‹¨ν•œ μˆ˜μ •μ„ 톡해 과정을 닀뀄보도둝 ν•˜μž.

λͺ…λ Ήμ–΄ μœ„μ£Όκ°€ μ•„λ‹Œ 과정을 μ€‘μ μœΌλ‘œ μ•Œμ•„λ³΄κΈ°μœ„ν•΄ μ†ŒμŠ€νŠΈλ¦¬λ₯Ό μ‚¬μš©ν•˜μ˜€λ‹€.

master, develop λ”°μ˜€κΈ°

3

λ§Œμ•½, 개인 ν”„λ‘œμ νŠΈλΌλ©΄ 개인 ν”„λ‘œμ νŠΈλ₯Ό μ—°κ²°ν•΄μ£Όκ³ , 이미 μƒμ„±λ˜μ–΄μžˆλŠ” ν”„λ‘œμ νŠΈκ°€ μžˆλ‹€λ©΄, fork, clone의 과정을 κ±°μ³μ„œ κ°€μ Έμ˜€λ„λ‘ ν•œλ‹€.

이미 진행쀑인 ν”„λ‘œμ νŠΈλΌλ©΄ 이 첫 과정이 μ§„ν–‰λœ μƒνƒœμΌ 수 도 μžˆλ‹€.

진행쀑인 ν”„λ‘œμ νŠΈκ°€ μ•„λ‹ˆλΌλ©΄ μ²˜μŒμ—λŠ” master 브랜치만 μ‘΄μž¬ν•˜λŠ” μƒνƒœμΌ 것이닀.

μ†ŒμŠ€νŠΈλ¦¬μ˜ 우츑 상단에 μžˆλŠ” κΉƒ ν”Œλ‘œμš°λ₯Ό λˆŒλŸ¬μ„œ κΈ°λ³Έ λΈŒλžœμΉ˜λ“€μ„ 생성해주도둝 ν•˜μž.

4

μ•žμœΌλ‘œ μƒμ„±λ˜λŠ” λΈŒλžœμΉ˜λ“€μ˜ κΈ°λ³Έ 접두어λ₯Ό 섀정해쀄 수 μžˆλ‹€.

λ”±νžˆ 뭘 μˆ˜μ •ν•  ν•„μš” 없이 확인을 눌러주자.

5

master, develop λΈŒλžœμΉ˜κ°€ 생성됨을 확인해 λ³Ό 수 μžˆλ‹€. μ΄λ•Œ, masterλŠ” 원격과 둜컬 λ‘˜ λ‹€ μ‘΄μž¬ν•˜λŠ” μƒνƒœμ΄μ§€λ§Œ, develop은 λ‘œμ»¬μ—λ§Œ μƒμ„±λœ κ²ƒμ΄λ‹ˆ pushλ₯Ό 톡해 λ‚˜μ˜ 원격에도 브랜치λ₯Ό 생성해주도둝 ν•˜μž.

κΈ°λŠ₯ μΆ”κ°€λ₯Ό μœ„ν•œ feature

ν˜„μž¬ 배포되고 μžˆλŠ” μ†ŒμŠ€μΈ matser와 개발이 이뀄지고 μžˆλŠ” develop브랜치λ₯Ό λͺ¨λ‘ λ‘œμ»¬μ—μ„œ 확인할 수 있게 λ˜μ—ˆλ‹€.

μ•žμœΌλ‘œ μš°λ¦¬λŠ” developλΈŒλžœμΉ˜μ—μ„œ ν•„μš”ν•œ κΈ°λŠ₯듀을 μΆ”κ°€μ μœΌλ‘œ κ°œλ°œμ„ ν•˜κΈ° μœ„ν•΄ feature 브랜치λ₯Ό 생성해야 ν•œλ‹€.

μ•„κΉŒμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 우츑 μƒλ‹¨μ˜ κΉƒ ν”Œλ‘œμš° λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ μ΄λ²ˆμ—λŠ” μ˜ˆμƒλœλŠ” λ™μž‘μ„ μ œμ‹œν•΄μ£ΌλŠ” νŒμ—…μ΄ ν™œμ„±ν™” λœλ‹€.

6

μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜κΈ° μœ„ν•¨μ΄κΈ° λ•Œλ¬Έμ—, μƒˆ κΈ°λŠ₯ μ‹œμž‘μ„ 눌러주고 μ ν•©ν•œ κΈ°λŠ₯λͺ…을 μž‘λͺ…해주도둝 ν•˜μž.

7

확인을 λˆ„λ₯΄λ©΄ featureλΈŒλžœμΉ˜μ— μž‘λͺ…ν•œ μ„ΈλΆ€ λΈŒλžœμΉ˜κ°€ μƒμ„±λœκ²ƒμ„ λ³Ό 수 μžˆλ‹€.

featureλΈŒλžœμΉ˜λŠ” μ—¬λŸ¬ κ°œλ°œμžκ°€ ν•¨κ»˜ λΉ„μŠ·ν•œ κΈ°λŠ₯을 κ°œλ°œν•˜κΈ° μœ„ν•΄ 원격에 μƒμ„±λ˜μ–΄μžˆμ„ 수 도 있고, λ‘œμ»¬μ—λ§Œ 생성될 수 도 μžˆλ‹€κ³  ν•œλ‹€.

8

μƒˆλ‘œμš΄ κΈ°λŠ₯을 μœ„ν•œ μ†ŒμŠ€μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³ , ν•„μš”μ•„ 따라 ꡬ뢄지어 ν•΄λ‹Ή 둜컬 λΈŒλžœμΉ˜μ— 컀밋을 ν•  것이닀.

9

μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€ 및 μ»€λ°‹κΉŒμ§€ μ™„λ£Œκ°€ λ˜μ—ˆλ‹€λ©΄ ν•΄λ‹Ή λΈŒλžœμΉ˜λŠ” 역할을 λ§ˆλ¬΄λ¦¬ν•˜μ˜€κΈ° λ•Œλ¬Έμ— μ•„κΉŒμ˜ κΉƒ ν”Œλ‘œμš° λ²„νŠΌμ„ 눌러 κΈ°λŠ₯ 마무리λ₯Ό μ‹œμΌœμ£Όλ„λ‘ ν•˜μž.

10

develop 병합

둜컬 developκ³Ό feature을 병합해주기 μ „, λ‚˜λ³΄λ‹€ λ¨Όμ € μž‘μ—…μ΄ μ™„λ£Œλœ λ‹€λ₯Έ κ°œλ°œμžλ“€μ˜ 변경사항이 반영된 원격 develop에 λ°˜μ˜λ˜μ—ˆμ„ 수 있기 λ•Œλ¬Έμ—, pull을 μ‚¬μš©ν•˜μ—¬ 둜컬 develop을 μ΅œμ‹ ν™” μ‹œμΌœμ£Όκ³  병합 ν•˜λ„λ‘ ν•˜μž.

μœ„μ—μ„œ 마무리λ₯Ό μ‹œμΌœμ£Όκ²Œ 될 경우, 둜컬의 develop에 feature 브랜치의 μž‘μ—…λ‚΄μš©λ“€μ΄ λ³‘ν•©λ˜κ³ , ν•΄λ‹Ή λΈŒλ ŒμΉ˜λŠ” μžλ™μœΌλ‘œ μ œκ±°κ°€ λœλ‹€.

11

아직 둜컬의 developμ—λ§Œ 병합이 μ΄λ£¨μ–΄μ‘ŒκΈ° λ•Œλ¬Έμ—, λ‚˜μ˜ μ›κ²©μ—μžˆλŠ” develop에도 λ³‘ν•©λœ 컀밋듀을 λ°˜μ˜μ‹œμΌœμ€„ ν•„μš”κ°€ μžˆλ‹€.

12

λ‚˜μ˜ 원격 develop에 변경사항을 pushν•΄μ€€λ‹€.

13

pull request μž‘μ„±

λ‚˜μ˜ 원격 develop λΈŒλžœμΉ˜μ—λŠ” λ‘œμ»¬μ—μ„œ μž‘μ—…ν•œ μƒˆλ‘œμš΄ κΈ°λŠ₯듀이 μΆ”κ°€λœ μƒνƒœμ΄λ‹€.

λ”°λΌμ„œ μ•„λž˜μ™€ 같이 변경사항에 λŒ€ν•΄ pull requestλ₯Ό μž‘μ„±ν•  수 μžˆλŠ” μ•Œλ¦Όμ΄ 뜰 것이닀.

14

κ°œλ°œν•œ κΈ°λŠ₯에 λŒ€ν•΄ κ°„λž΅ν•˜κ²Œ μ„€λͺ…ν•˜λŠ” 글듀을 μž‘μ„±ν•˜κ³  requestλ₯Ό 보내도둝 ν•œλ‹€.

ν˜„μž¬λŠ” 개인 ν”„λ‘œμ νŠΈλΌμ„œ λ°”λ‘œ λ‚˜μ˜ 원격 master λΈŒλžœμΉ˜μ— 보내도둝 ν•˜μ˜€λ‹€.

μ•„λ§ˆ, ν˜‘μ—…μ„ ν•˜μ—¬ cloneν•΄μ˜¨ μƒνƒœλΌλ©΄ λ‚˜μ˜ 원격 developμ—μ„œ 원본 원격 develop으둜 μš”μ²­μ„ λ³΄λ‚΄λŠ” ν˜•νƒœμΌ 것이닀.

15

μš”μ²­ν•œ requestλŠ” μ•„λž˜μ™€ 같이 확인을 ν•  수 있고, μ μ ˆν•œ μ½”λ“œλ¦¬λ·°λ“±μ„ 톡해 μ΅œμ’… μŠΉμΈκΆŒν•œμžκ°€ pull requestλ₯Ό μŠΉνžŒν•˜κ²Œ 될 것이닀.

14

μ΅œμ’…μ μœΌλ‘œ 승인이 된 requestλ₯Ό 확인할 수 μžˆλ‹€.

merge μ’…λ₯˜

  • git merge μ’…λ₯˜
    • merge : λΈŒλžœμΉ˜μ— 기둝된 λͺ¨λ“  컀밋을 μœ μ§€ν•œ μ±„λ‘œ 병합함
    • squash : λΈŒλžœμΉ˜μ—μ„œ μž‘μ—…ν•œ 컀밋듀을 단 ν•˜λ‚˜μ˜ μ»€λ°‹μœΌλ‘œ λ¬Άμ–΄μ„œ 병합함.

      λΈŒλžœμΉ˜μ— 기둝된 μ§€μ €λΆ„ν•œ? λˆ„μ λœ 컀밋듀을 μ •λ¦¬ν•˜μ—¬ λ³‘ν•©ν•˜λŠ” λŠλ‚Œ

dev -> masterλŠ” μΌλ°˜λ¨Έμ§€λ‚˜ rebase머지가 μ’‹λ‹€κ³  함. μž₯κΈ° μœ μ§€μ€‘μΈ 브랜치 κ°„ squashλŠ” conflictκ°€ λ°œμƒν•œλ‹€λŠ”κ²ƒ κ°™μŒ.

둜컬 μ΅œμ‹ ν™”

λ§Œμ•½ forkλ₯Ό 톡해 루트 ν”„λ‘œμ νŠΈλ₯Ό κ°€μ Έμ™€μ„œ κ°œλ°œμ„ ν•˜λŠ” 상황일 경우, λ‚΄ 둜컬의 개발 ν™˜κ²½μ„ μ΅œμ‹ μƒνƒœλ‘œ μœ μ§€ν•  ν•„μš”κ°€ μžˆλ‹€. 이런 μƒν™©μ˜ 루트 ν”„λ‘œμ νŠΈλ₯Ό upstream이라고 λΆ€λ₯΄λ©° ν•΄λ‹Ή μ €μž₯μ†Œλ₯Ό 원격 μ €μž₯μ†Œμ— μΆ”κ°€λ₯Ό 해쀄 ν•„μš”κ°€ μžˆλ‹€.

λ˜ν•œ, 진행쀑인 featureλΈŒλžœμΉ˜μ—μ„œ upstream develop에 μΆ”κ°€λœ κΈ°λŠ₯이 ν•„μš”ν•˜λ‹€λ©΄ pull ν•΄μ„œ μ‚¬μš©ν•˜μž

  1. μ €μž₯μ†Œ - 원격저μž₯μ†Œμ— 경둜 μΆ”κ°€
    • λŒ€λΆ€λΆ„ 이름을 upstream이라고 ν•œλ‹€ 함
  2. 쒌츑 μ›κ²©νƒ­μ˜ upstreamμ—μ„œ κ°€μ Έμ˜€κΈ° 진행
    • upstream repository에 μƒμ„±λ˜μ–΄μžˆλŠ” λΈŒλžœμΉ˜λ“€λ„ ν•˜μœ„μ— λͺ¨λ‘ ν‘œμ‹œλ˜λ‹ˆ, ν˜„μž¬ λΈŒλžœμΉ˜μ— λ§žλŠ” upstream λΈŒλžœμΉ˜μ—μ„œ pull 해야함
    • 개인 ν”„λ‘œμ νŠΈλΌλ©΄ ν”„λ‘œμ νŠΈμ—μ„œ μ΅œμ‹  κ°œλ°œν™˜κ²½μ„ κ°–κ³ μžˆλŠ” 브랜치
  3. λ§Œμ•½, upstreamμ—μ„œ κ°€μ Έμ˜€λ €λŠ” 쀑, μž‘μ—…ν•΄λ†“μ€ μ½”λ“œλ“€μ΄ 컀밋 λŒ€κΈ°μ€‘μΈ μƒνƒœλΌλ©΄ μž‘μ—…ν•΄λ†“μ€ μ½”λ“œλ“€μ„ stash에 μ €μž₯해놓은 λ‹€μŒ upstreamμ—μ„œ pullν•œλ‹€.
    • 컀밋을 해도 λ¬΄λ°©ν•œκ²ƒ κ°™μŒ. 단 pushλŠ” μ ˆλŒ€ γ„΄γ„΄
    • 이전 컀밋과, pullν•˜μ—¬ 좔가될 컀밋쀑 μΆ©λŒλ˜λŠ” 뢀뢄이 μžˆλ‹€λ©΄ 해결이 ν•„μš”ν•œ 뢀뢄이라고 λ³΄μ—¬μ€Œ
  4. 이후 stash에 μ €μž₯해놓은 μ½”λ“œλ₯Ό λ‹€μ‹œ ν˜„μž¬ 브랜치둜 κ°€μ Έμ˜€κ³ , 좩돌 νŒŒμΌμ€ 직접 ν•©μΉ˜κΈ°
    • 동일 파일 λ‚΄ 변경사항이 μžˆκ±°λ‚˜, pullν•œ λΈŒλžœμΉ˜μ—μ„œ μ—…λ°μ΄νŠΈλœ λ‚΄μš©μ΄ μžˆλ‹€λ©΄ 좩돌이 λ°œμƒν•  텐데(λŒ€λΆ€λΆ„ μƒκΈ°λŠ” λ“―), 잘 병합해주면 큰 문제 μ—†μŒ
  5. μ—…λ°μ΄νŠΈ ν•œ branchλ₯Ό origin branch으둜 pushν•œλ‹€μŒ, μ΅œμ’…μ μœΌλ‘œ λ³‘ν•©λ˜μ–΄μ•Ό ν•  λΈŒλžœμΉ˜μ— pull requestλ₯Ό μƒμ„±ν•˜μ—¬ 전달함.
    • pull requestλ₯Ό 생성할 λ•Œ, upstream의 브랜치, μžμ‹ μ˜ 브랜치 λ“± λͺ¨λ“  브랜치λ₯Ό 선택할 수 있음
    • λ‹Ήμ—°νžˆ, 동일 branchλ‘œλŠ” 전달 x, λŒ€μƒ λΈŒλžœμΉ˜λž‘ 차이가 없을 κ²½μš°μ—λ„ λ³€ν™”κ°€ pull requestκ°€ μž‘μ„±λ˜μ§€ μ•ŠλŠ”λ‹€.

merge

git merge branchname ν˜„μž¬ λΈŒλžœμΉ˜μ— 이후에 기재된 브랜치의 λ³€κ²½λœ μ»€λ°‹λ‚΄μš©λ“€μ„ ν•˜λ‚˜λ‘œ λ¬Άμ–΄μ„œ λ³‘ν•©ν•œλ‹€.

이 λ•Œ, μ΄ν›„μ˜ λΈŒλžœμΉ˜μ™€ fast-forward의 관계라면 κ·Έλƒ₯ λ”°λΌκ°€λŠ” ν˜•μ‹μœΌλ‘œ λ™λ“±ν•œ μœ„μΉ˜μ— μ„œκ²Œλ˜μ–΄ λ³‘ν•©λ˜μ—ˆλ‹€λŠ” μ»€λ°‹λ©”μ‹œμ§€λ₯Ό 남길 수 μ—†κΈ° λ•Œλ¬Έμ—(μƒˆλ‘œμš΄ 컀밋좔가가 μ•„λ‹ˆλΌ κ·Έλƒ₯ λ”°λΌκ°€λŠ” λŠλ‚Œ) λŒ€λΆ€λΆ„ μ˜λ„μ μœΌλ‘œ git merge --no-ff branchnameλ₯Ό 톡해 ν•œλ‹¨κ³„ μΆ”κ°€λœ 컀밋을 λ‚¨κΈ°λŠ” 편 이라고 ν•œλ‹€.

fast-forward

별닀λ₯Έ 컀밋이 좔가될 ν•„μš” 없이 이후 μ»€λ°‹μ˜ μœ„μΉ˜μ— λ™λ“±ν•˜κ²Œ 이동할 수 μžˆλŠ” μƒνƒœλ₯Ό μ˜λ―Έν•˜λŠ”κ²ƒ κ°™λ‹€.

λŒ€μ²΄λ‘œ 병합과 같은 μž‘μ—…μ„ μˆ˜ν–‰ν•˜μ˜€μ„ λ•Œ μžˆλŠ” 일인데, 병합을 ν•˜μ˜€λ‹€λŠ” 컀밋 λ©”μ‹œμ§€λ₯Ό 남기기 μœ„ν•΄ --no-ffλ₯Ό 톡해 fast-forwardμž‘μ—…μ΄ μ•„λ‹Œ 컀밋을 남길 수 μžˆλ„λ‘ ν•œλ‹€λŠ”κ²ƒ κ°™λ‹€.

rebase

git rebase branchname ν˜„μž¬ λΈŒλžœμΉ˜μ— μžˆμ—ˆλ˜ λ³€κ²½λœ μ»€λ°‹λ‚΄μš©λ“€μ„ 이후에 기재된 브랜치의 컀밋 변경사항듀 뒀에 이어뢙인닀.

마치 이후에 기재된 λΈŒλžœμΉ˜μ—μ„œλ§Œ μž‘μ—…μ„ ν•œ 것 처럼 보여진닀.

μ†”μ§νžˆ μ•„μ§κΉŒμ§€ ν•„μš”λ₯Ό 잘 λͺ¨λ₯΄κ² λ‹€.

release

λ³€κ²½λœ λͺ¨λ“  μž‘μ—…μ΄ 반영된 develop브랜치λ₯Ό κΈ°μ€€μœΌλ‘œ release브랜치λ₯Ό checkoutν•œλ‹€.

μ΄λ•Œ λ°œμƒν•˜λŠ” 버그듀은 release λΈŒλžœμΉ˜μ— λ°”λ‘œ λ°˜μ˜ν•˜κ³ , λ§ˆμ°¬κ°€μ§€λ‘œ developλΈŒλžœμΉ˜μ—λ„ merge ν•΄μ€€λ‹€.

;`git checkout devlop` || ;`git checkout release`
;`git merge --no-ff release/fixes`

release브랜치의 μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ masterλΈŒλžœμΉ˜μ—μ„œ mergeν•΄κ°„λ‹€.

;`git checkout master`
;`git merge --no-ff release`

배포용 releaseκ°€ λ³‘ν•©λœ masterλΈŒλžœμΉ˜μ— ν•΄λ‹Ή release의 번호인 tagλ₯Ό 달아주도둝 ν•œλ‹€.

hotFix

λ§Œμ•½, 배포된 μƒνƒœμ— κΈ΄κΈ‰ν•œ 버그가 λ°œμƒν–ˆλ‹€λ©΄, master λΈŒλžœμΉ˜μ—μ„œ λ°”λ‘œ hotfixesλΌλŠ” 브랜치λ₯Ό λ”°μ„œ μž‘μ—…μ„ ν•˜κ³ , masterλΈŒλžœμΉ˜μ— 직접 λ³‘ν•©ν•˜κ³  μ†Œμˆ˜λ₯Ό μΆ”κ°€ν•˜μ—¬ νƒœκ·Έλͺ…을 μ—…λ°μ΄νŠΈν•œλ‹€

1.1, 1.2 …

λ‹Ήμ—°νžˆ hotfixes λΈŒλžœμΉ˜λŠ” κ°œλ°œμ€‘μΈ developλΈŒλžœμΉ˜μ—λ„ λ³‘ν•©λœλ‹€.

μ•„μ‰¬μ› λ˜ 점

개인 ν”„λ‘œμ νŠΈλ₯Ό 가지고 μ§„ν–‰ν•˜μ˜€κΈ° λ•Œλ¬Έμ— 쀑간쀑간 μ •ν™•ν•˜μ§€ μ•Šμ€ 뢀뢄이 μžˆμ„ 수 μžˆλ‹€.

특히 pull request λ‹¨κ³„μ˜ 경우, μ™ΈλΆ€ λΈ”λ‘œκ·Έμ˜ κΈ€μ΄λ‚˜ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ ν…ŒμŠ€νŠΈν•΄λ³Έκ±Έ 기반으둜 μž‘μ„±λ˜μ—ˆλ‹€.

μ΄λŸ¬ν•œ 과정을 톡해 μ΅œλŒ€ν•œ μ›λ³Έμ˜ μ†ŒμŠ€μ½”λ“œμ— 직접적인 μˆ˜μ •μ΄ λ°”λ‘œλ°”λ‘œ μ΄λ€„μ§€λŠ”κ²ƒμ„ λ§‰μ•„μ„œ μ΅œλŒ€ν•œ μ•ˆμ „ν•˜κ²Œ μž‘μ—…μ„ μ§„ν–‰ν•˜κ³ μž ν•˜λŠ” λŠλ‚Œμ΄ λ“€μ—ˆλ‹€.

λ˜ν•œ, μ΅œμ’… μ†ŒμŠ€μ½”λ“œμ— λ³‘ν•©ν•˜κΈ° μ „ 기쑴의 κ·œμ²™μ΄λ‚˜, μ ν•©ν•˜μ§€ μ•Šμ€ λ°©μ‹μœΌλ‘œ μƒμ„±λœ μ½”λ“œλ₯Ό λ¦¬λ·°ν•˜μ—¬ 사전에 μˆ˜μ •κ³Όμ •μ„ 거칠수 μžˆλ‹€λŠ” 점 λ˜ν•œ 큰 이점인것 κ°™λ‹€.

μ™„λ²½νžˆ λ™μΌν•œ ν™˜κ²½μ—μ„œ 해보지 λͺ»ν•œμ μ€ μ•„μ‰½μ§€λ§Œ, 흐름에 λŒ€ν•œ μ΄ν•΄μ—λŠ” 큰 도움이 된 것 κ°™λ‹€.

μ°Έκ³ 


@SangMin
πŸ‘† H'e'story

πŸš€GitHub