2016-12-21 4 views
0

두 개의 가지가 있습니다. branch1에는 최근 변경 사항이 있고 다른 하나 (branch2)에는 리모컨의 최신 변경 사항이 포함되어 있습니다.git rebase <SHA1> 커밋되지 않은 것 같습니다.

SHA=$(git merge-base branch1 branch2) 

그때 내가

git checkout branch1 
git rebase ${SHA} 

을 리베이스 실행 나는 데 문제가이가 나타나지 않는다는 것입니다 :

그래서 나는과 같이 커밋 공유 가장 최근의를 얻을 수 있습니다 내가 뭘 branch1에서 커밋을 쪼개라. 그것은 커밋을 뭉개 버리고 내 시놉시스가 틀렸는가?

대화식 옵션과 함께 rebase를 사용하면 커밋을 스쿼시할지 여부를 지정합니다. 어쩌면 나는 REBASE 명령

git rebase -s ${SHA} 

아니면

git rebase --autosquash ${SHA} 
+0

Rebase는 기본적으로 스쿼시가 아닙니다. 어쩌면 당신은 rebase리스트를 편집 할 수있는 -i 플래그를 찾고 있습니다. – frlan

답변

2

그것을 부수 커밋을 발송해야한다과 같이 몇 가지 옵션을 사용할 필요가 내 시놉시스가 잘못되면

궁금?

아니요, 기본적으로 아니요.

개념적으로 리베이스는 분기가 항상 다른 커밋의 맨 위에있는 것처럼 가장합니다. 예를 들어, 여기에 기능이 떨어진 지사가 있습니다.

A - B - C - D - E [master] 
     \ 
      F - G - H [feature] 

우리는 git merge master 수 그러나 병합이 커밋 혼란이있을 것이다. 대신, 우리는 항상 feature을 마치`master의 끝 부분에있는 것처럼 다시 쓸 수 있습니다. git checkout feature

  • git rebase master
  • 이제 우리가

    • ... 이전 분기가 여전히 있음을

          F1 - G1 - H1 [feature] 
             /
      A - B - C - D - E [master] 
           \ 
            F - G - H 
      

      참고, 결국 정리됩니다.


      대신 찾고있는 것은 git merge --squash입니다.

      분기를 스쿼시하지 않는 것이 좋습니다. 이는 코드 고고학에 유용한 중요한 기록을 잃어 버리게됩니다 (즉, 왜 그런 식으로 쓰여졌는지 알아내는 것). 오타 수정과 같은 사소한 커밋을 제거하기 위해서만 스쿼시를 유지하십시오.

      대신 "기능 거품"을 권하고 싶습니다. 위와 같이 분기를 다시베이스하면 git merge --no-ff (Git이 빨리 감기가 아니라 병합되도록 함). 이

          F1 - G1 - H1 
             /   \ 
      A - B - C - D - E ------------ I [master] 
      

      당신은 선형 역사를 얻을 (git log 내가 표시됩니다 ... 결과, H1, G1, F1, E, D, ...)를 사용하면 F1, G1 및 H1과 관련된 커밋 정보를 자세히 유지할 수 있으며 커밋 메시지 I을 사용하여 분기가 무엇인지에 대해 설명 할 수 있습니다.

    +0

    SHA가 주어진 후 모든 커밋을 자동으로 스쿼시하는 방법이 있어야합니다 ....? 대화식으로해야 할 필요는 없습니다. 맞습니까? –

    +0

    @AlexanderMills 내가 말했듯이,'git merge --quash'. 또한 내가 말했듯이, 나는 스쿼시를 직접 사용하지 않으며 그것을 권장하지 않으므로 그것에 대해 더 많이 말할 수는 없습니다. – Schwern

    +0

    괜찮지 만 git merge - 어떤 컨텍스트에서 스쿼시를 사용합니까? 질문과 다른 컨텍스트 인 것 같습니다. 그렇다면 소집 할 수있는 설명을 추가하십시오. –