GitHub / BitBucket에서 병합 커밋 지옥을 피하는 방법


100

우리는 repo에서 다음과 같은 많은 커밋으로 끝납니다.

Merge branch 'master' of bitbucket.org:user/repo

이것은 개발자가 자신의 로컬 포크를 최상위 저장소에 동기화 할 때마다 발생합니다.

어쨌든이 병합 커밋 지옥이 모든 저장소 로그를 어지럽히는 것을 피할 수 있습니까? 어떤 식 으로든 pull-request를 시작할 때이를 피할 수 있습니까?

로컬 VM에서만 수행되는 경우 git rebase를 수행 할 수 있다는 것을 알고 있습니다. GitHub / BitBucket UI에 동등한 항목이 있습니까?

너희들은 어떻게하니?

답변:


135

병합하기 전에 기능 분기 리베이스

병합 커밋을 피하려면 모든 커밋이 빨리 감기인지 확인해야합니다. 다음과 같이 병합하기 전에 기능 브랜치가 개발 라인에 깔끔하게 리베이스하는지 확인하여이를 수행합니다.

git checkout master
git checkout -b feature/foo

# make some commits

git rebase master
git checkout master
git merge --ff-only feature/foo

Rebase에는 플래그를 사용한 대화 형 리베이스를 포함하여 많은 -i플래그가 있지만 가능한 한 단순하게 유지하고 병합시 모든 분기 기록을 보존하려는 경우에는 필요하지 않을 수 있습니다.

--ff-only깃발 사용

리베이스 외에도 --ff-only플래그를 사용하면 빨리 감기 커밋 만 허용됩니다. 대신 병합 커밋이면 커밋이 이루어지지 않습니다. git-merge (1) 매뉴얼 페이지는 다음과 같이 말합니다.

--ff 전용

현재 HEAD가 이미 최신 상태이거나 병합을 빨리 감기로 해결할 수있는 경우가 아니면 병합 및 0이 아닌 상태로 종료하는 것을 거부합니다.


1
이것은 훌륭한 대답입니다. 가능한 한 자주 rebase를 사용합니다. 그래도 --ff-only 플래그에 대해서는 몰랐습니다. 정말 멋진!
Leo Correa 2013 년

3
rebase 및 --ff 전용 조언에 감사드립니다. 그러나 내 질문에서 말했듯이 GitHub / BitBucket의 UI 내에서 어떻게 할 수 있습니까?
Niklas9 2013 년

3
@Niklas 원하는 작업을 수행하려면 CLI에 의지해야한다고 확신합니다. GitHub는 Git의 모든 기능을 노출하지 않습니다. 일부 기능과 일부 그래픽 및 소셜 네트워킹 부가 가치. 행운을 빕니다!
Todd A. Jacobs

3
이 프로세스에서 주목해야 할 점은 토픽 브랜치 (feature / foo)를 마스터로 다시 병합하기 전에 git pull origin master (리모컨을 사용하는 경우)를 사용하여 마스터 브랜치가 최신 상태인지 확인하는 것이 좋습니다. . 업데이트가 발견되면 마스터를 다시 마스터로 병합하기 전에 다시 한 번 마스터를 토픽 브랜치에 리베이스하십시오.
chikamichi 2013

19
@CodeGnome은 이것을 CLI에 "리 소팅"이라고 부르지 마십시오. 실제로 UI에 "리 소팅"하는 것에 대해 경고해야합니다!
Droogans

9

"Todd A. Jacobs"는 이미 언급 한 "rebase"개념입니다. 이것은 일을하는 더 자세한 방법 일뿐입니다.

마스터 브랜치에 있다고 가정 해 보겠습니다.

$ git branch
  * master

수정을 원하므로 마스터에서 분기되는 "fixbranch"를 작성하십시오.

$ git checkout -b fixbranch

이 지점에서 며칠 동안 일하고 몇 번의 커밋을 수행했을 것입니다.

커밋을 중앙 마스터 리포지토리에 푸시하고 싶었던 날! 마스터를 체크 아웃하고 중앙 마스터 저장소에서 최신 변경 사항 가져 오기

$ git checkout master
$ git pull origin master

마스터로 fixbranch를 리베이스하여 깨끗한 히스토리를 갖고 로컬 리포지토리 자체에있는 경우 충돌을 해결하십시오.

$ git checkout fixbranch
$ git rebase master

이제 fixbranch가 중앙 마스터로 업데이트되었습니다. fixbranch를 마스터 브랜치에 병합하겠습니다.

 $ git checkout master
 $ git merge fixbranch

끝났어! 로컬 마스터를 중앙 마스터로 푸시하겠습니다.

$ git push origin master

https://git-scm.com/book/en/v2/Git-Branching-Rebasing


이 답변에 감사드립니다.
lasec0203
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.