2017-03-14 3 views
0

master에서 분기하여 새로운 branch branchA에서 작업했습니다. branchA에서 몇 가지 커밋을 수행하고 master를 병합 한 다음 branchA에 병합하여 최신 변경 사항을 업데이트했습니다. 이제 마스터에 병합하기 전에 커밋을 한 커밋으로 스쿼시하고 싶습니다. 어떻게해야합니까? 나는 git merge --squash이 커밋을 스쿼시 할 수 있음을 알고 있습니다. 그러나 코드 검토 승인을 기다리고 있기 때문에 지금 병합하고 싶지 않습니다. master를 branchA에 병합했기 때문에 rebase를 사용하는 것도 좋지 않습니다. 커밋을 스쿼시하는 좋은 방법이 있는지 궁금합니다. 감사!마스터에 병합하기 전에 커밋을 스쿼시하는 방법은 무엇입니까?

+0

이미 커밋을 보냈으므로 이미 공개 했으므로 스쿼시에 늦지 않았습니까? 새로운 브랜치를 생성하여 검토를 위해 밀어 넣고 이전 검토 요청을 포기하거나 원격 서버에서 스쿼시를 허용하고'--force'를 사용하여 밀어 넣을 수 있습니다. 여러분의 장소에서'리뷰 '가 무엇을 의미하는지에 따라 메시지의 명료 함을 밝히고, 내용을 커밋 할 수 있습니다. –

+0

@ArkadiuszDrabczyk 예, 공개되었습니다. 하지만 마스터에 병합되기 전에 하나의 정리 만 커밋하고 싶습니다. – litaoshen

답변

0

업데이트 : 추가 의견 branch 그래서 당신이

밀어 된 사건에 대해 말

X --- X --- X --- X --- X <--(master) 
     \   \ 
     A --- B --- M1 --- C <--(branch) 

그것은 당신이 완료되면 같은 소리 당신이 원하는

X --- X --- X --- X --- X --- ABC <--(master) 

ABCmaster 분기에 입력 할 준비가되지 않았습니다.

나는 A, B, M1C이 한번도 입력되지 않았다고 가정합니다. 이 가정이 거짓이라면 나는 어떤 방법 으로든 그들을 과장하지 않을 것입니다.

그래서 내 첫 번째 생각은 코드 검토를 기다린 후 스쿼시 병합을 수행하는 것입니다. A ... C을 버릴 예정이라면 어떤 차이가 있습니까?

하지만 어떤 이유로 그것을 좋아하지 않아 및 정말 방법이 목표에 대해, - 스쿼시를 사전하려는 경우이 얻을 수있는 몇 가지 방법이 있습니다

X --- X --- X --- X --- X <--(master) 
         \ 
          ABC <--(branch) 

. 여기에 하나는 다음과 같습니다

git checkout master 
git checkout -b temp 
git merge --squash branch 
git branch -f branch 
git checkout branch 
git branch -d temp 

그러나 의견의 논의를 기반으로, 그것은 지금 A, B 같은 소리하고 C 커밋이 추진되고있다. 그것이 사실이라면, 기술을 부수기위한 단점이 있습니다.

이 경우 가장 좋은 조언은 병합 커밋시 좋은 커밋 메시지를 작성하고 기록을 볼 때 git log --first-parent을 사용하는 것입니다. 이 경우 분기의 ​​개별 커밋은 로그 출력에 표시되지 않으며 squilled 커밋 인 것처럼 전체 분기를 나타내는 단일 커밋 (병합 자체)을 볼 수 있습니다.

하지만 그 조언을 따르고 싶지 않고 실제로 변경 사항을 채워야하는 경우 여기에 거래가 있습니다. branch에서 계속 작업하는 사람에게는 문제가 있습니다. 그리고 "아무도 그렇게하지 말아야한다"고 말할 수 있습니다. 그리고 팀이 아무도 그렇게하지 않는다는 데 동의하면 성공할 것입니다. 그러나 branch이 공유 된 저장소에 존재하기 때문에 아무 일도 일어나지 않습니다. 그리고 나서 을 쓰면 기껏해야입니다. 지저분한 갈등 해결에 대처해야합니다.

위의 단계를 수행한다고 가정 해보십시오. 당신이 (origin/branchbranch에서 연결할 수 없기 때문에)가 실패합니다 branch을 밀어하려고하면 당신이 정말이 것은

X --- X --- X --- X --- X <--(master) 
     \   \  \ 
     \   \  ABC <--(branch) 
     \   \ 
      A --- B --- M1 --- C <--(origin/branch) 

입니다. 푸시를 강요 할 수 있으며, 수행하자마자 C을 가리키는 로컬 branch 참조를 가진 사람은 문제가 발생할 것입니다. 그것들을 시정 할 수는 없지만, 누군가가 "잘못"수정하면 특히 혼란 스러울 수 있습니다.

branch을 강제로 누르지 않아도되도록 피할 수 있습니다. branch 버전을 마스터에 병합 할 수있을 때까지 기다린 다음 master을 누르고 로컬 branch을 삭제합니다.

X --- X --- X --- X --- X --- ABC <--(master) 
     \   \ 
     A --- B --- M1 --- C <--(origin/branch) 

이제 원격 origin/branch 참조의 삭제를 강제하더라도, 다른 DEVS는 여전히가있을 수 있습니다 현지 branch 참조 C에서 지적했다. 그리고 그 역사가 master으로 병합되지 않았기 때문에 (ABC은 병합되지 않은 단일 커밋으로 마스터를 업데이트하기 위해 생성되었습니다) branchmaster으로 병합 (추가 변경)하면 문제가 발생합니다.

당신은 전략 "우리"또는 branchmaster의 조상이라고 힘내을 보여 뭔가를 사용하여 병합 후속와 영리 얻을 수 ...하지만 그 시점에서, 당신은뿐만 아니라 그냥 보통의 병합을 할 수도 왜냐하면 합병은 일반적인 병합과 마찬가지로 A, BC을 기본 로그 기록 master에 그려 넣기 때문입니다. 즉이를 제외하기 위해 --first-parent을 사용할 수 있습니다.

이 모든 경우에도 입니다. 불필요한 번거 로움이 있습니다. 이것이 최선의 방법이되는 이유입니다. 일단 커밋이 공유되면이를 역사의 일부로 남겨 두십시오.