ProgramingTip

언제 git pull --rebase를 쓰고 있습니까?

bestdevel 2020. 9. 29. 08:13
반응형

언제 git pull --rebase를 쓰고 있습니까?


나는 git pull --rebase기본적으로 사용 하는 사람들 과 절대 사용하지 않는다고 주장하는 사람들을 알고 있습니다. 나는 병합과 리베이스의 차이점을 이해하고 믿지만 git pull. 병합 커밋 메시지를 많이보고 싶지 않은 문제가 있습니까?


다음과 같은 경우 git pull --rebase에 경우에 합니다.

  • 귀하의 변경 사항은 별도의 지점이 필요하지 않습니다.

실제로-그렇다면 왜 안 검증? 더 명확하고 커밋에 라우팅 그룹부과하지 않습니다 .


좋아, 약간의 설명이 필요하다고 생각합니다. 아시다시피 Git에서는 분기 및 병합을 권장합니다. 변경 사항을 가져 오는 로컬 브랜치와 원격 브랜치는 실제로는 다른 브랜치이며 git pull병합에 관한 것입니다. 자주 푸시하지 않고 일반적으로 기능을 구성하기 전에 많은 변경 사항을 축적하기 때문에 합리적입니다.

그러나 거기에는 어떤 두 가지가있는 것이 원격 및 로컬 가지가 하나의 지점 이면 더 좋을 생각합니다 . SVN 에서처럼. 여기에서 작동 git pull --rebase합니다. 더 이상 병합하지 않습니다. 실제로 원격 지점에서 커밋합니다 . 그것이 실제로 무엇인지입니다.

위험한지 아닌지 여부는 로컬 및 원격 지점을 분리 할 수없는 취급하는지 여부입니다. (변경 사항이 적거나 강력한 개발을 시작할 때 작은 커밋으로 중요한 사항을 가져 오는 경우). (보통 다른 브랜치를 만들었지 만 그렇게하기에는 너무 게으른 경우). 그러나 그것은 다른 질문입니다.


"git pull --rebase"가 실제로 의미하는 바에 대해 다른 관점을 제공하고 싶습니다. 가끔 길을 잃는 것처럼 보이기 때문입니다.

Subversion (또는 CVS)을 사용해 본 적이있는 "svn update"동작에 익숙한 것입니다. 커밋 할 변경 사항이 업스트림 변경으로 인해 커밋이 실패하면 "svn update"가됩니다. Subversion은 업스트림 변경 사항을 귀하의 변경 사항과 병합하여 진행하여 충돌을 해결할 수 있습니다.

Subversion이 방금 한 사전 존재로 "pull --rebase"였습니다. 최신 버전에 최후의 로컬 변경 사항을 다시 구성하는 작업이 "리베이스"부분입니다. 실패한 커밋 시도 전에 "svn diff"를 수행하고 결과 diff를 나중에 "svn diff"의 출력과 비교 한 경우 두 diff 차이는 리베이스 작업이 수행 한 것입니다.

이 경우 Git과 Subversion의 주요 차이점은 Subversion에서 "사용자"변경 사항은 작업 복사본에서 커밋되지 않은 변경 사항으로 만 존재하는 반면 Git에서는 로컬로 실제 커밋이 것입니다. 즉, Git에서 역사를 갈라 놓은 것입니다. 당신의 역사와 상류의 역사는 갈라졌지만 당신은 공통의 조상을 가지고 있습니다.

내에서, 당신의 로컬 브랜치가 업스트림 브랜치를 반영하고 지속적인 생각 개발을 지속적인 경우에, 올바른 일은 항상 "rebase"입니다. 왜냐하면 그것이 의미 론적으로 실제로 하는 일 입니다 . 당신과 다른 사람들은 의도 된 선형 기록을 해킹하고 있습니다. 다른 누군가가 당신이 밀어 내기 전에 약간 밀어 붙였다는 사실은 부적절하며, 시끄러운 타이밍 사고가 역사에 합쳐지는 것은 비생산적인 것처럼 보이게됩니다.

어떤 분기에 분기가 될 사건이 실제로 필요하다고 느낀다면 그것은 제 생각에 다른 관심사입니다. 그러나 병합의 형태로 변경 사항을 욕구가없는 한 기본 동작은 "git pull --rebase"강화합니다.

프로젝트의 역사를 관찰하고 이해해야하는 다른 사람들을 고려하십시오. 여러 개의 여러 개의 병합으로 역사가 산재 해지기를 원하고, 아니면 의도적으로 다양한 개발 노력의 병합을 여러 가지 병합 만 원하고 있습니까?


아마도 그것을 설명하는 가장 좋은 방법은 다음과 가능합니다.

  1. Alice는 토픽 브랜치 A를 생성하고 이에 대해 작업합니다.
  2. Bob은 관련없는 토픽 브랜치 B를 생성하고 이에 대해 작업합니다.
  3. 앨리스는 git checkout master && git pull합니다. 마스터는 이미 최신 상태입니다.
  4. 밥은 git checkout master && git pull합니다. 마스터는 이미 최신 상태입니다.
  5. 앨리스는 git merge topic-branch-A
  6. 밥은 git merge topic-branch-B
  7. 밥은 git push origin master앨리스보다 먼저
  8. Alice는을합니다 git push origin master. 이것은 빨리 감기 병합이 아니기 때문에 거부됩니다.
  9. Alice는 오리진 / 마스터의 로그를보고 커밋이 자신과 관련이 없음을 확인합니다.
  10. 앨리스는 git pull --rebase origin master
  11. Alice의 병합 커밋이 풀리고 Bob의 커밋이 풀링되고 Alice의 커밋이 Bob의 커밋 적용됩니다.
  12. Alice는합니다 git push origin master. 모든 사람은 로그를 볼 때 쓸모없는 병합 커밋을 읽을 필요가있는 점에 만족합니다.

병합되는 특정 분기는 예제와 관련이 없습니다. 이 예제의 마스터는 릴리스 분기 또는 개발 분기가 될 수 있습니다. 요점은 Alice와 Bob이 분기를 공유 원격 분기에 병합 병합 것입니다.


git pull --rebase같은 지점에서 다른 사람들과 협업 할 때 사용해야한다고 생각합니다 . 작업 → 커밋 → 작업 → 커밋주기에 있으며 작업을 푸시하기로 결정하면 동일한 브랜치에 병렬 작업이 있었기 때문에 푸시가 거부됩니다. 이 시점에서 나는 항상pull --rebase. 나는 스쿼시를 사용하지 않지만 (커밋을 평평하게하기 위해) 추가 병합 커밋을 피하기 위해 리베이스합니다.

Git에 대한 지식이 늘어남에 따라 내가 사용한 다른 버전 제어 시스템보다 역사를 더 많이 보게됩니다. 작은 병합 커밋이 많으면 역사에서 일어나고있는 더 큰 그림의 초점을 잃기 쉽습니다.

이것은 실제로 내가 rebasing (*)을 수행하는 유일한 시간이며 나머지 워크 플로는 병합 기반입니다. 그러나 가장 빈번한 커미터가 이것을하는 한, 역사는 결국 훨씬 더 좋아 보입니다.

(*) Git 과정을 가르치는 동안 특정 상황에서 기능 브랜치를 리베이스하도록 옹호했기 때문에 학생이 저를 체포했습니다. 그리고 그는이 답변을 읽었습니다.) 그러한 리베이스도 가능하지만 항상 사전 준비된 / 합의 된 시스템에 따라야하며 "항상"적용되어서는 안됩니다. 그리고 그 당시 나는 일반적으로 pull --rebase어느 쪽도 하지 않습니다 .


나는 이유가 지금까지 생각하지 않습니다 하지 사용 pull --rebase- 내가 특별히 내 수 있도록 힘내에 코드를 추가 git pull항상 상류 커밋에 대해 리베이스에 명령을.

역사를 살펴볼 때, 그 기능에 대해 작업하는 사람 / 걸이 동기화를 중단 한시기를 아는 것은 결코 흥미롭지 않습니다. 그 / 그녀가하는 동안 남자 / 여자에게 유용 할 수 있지만 그게 reflog목적입니다. 다른 모든 사람들에게 소음을 더하고 있습니다.


기억해라:

  • pull = 가져 오기 + 병합
  • pull --rebase = 가져 오기 + rebase

따라서 분기를 처리하려는 방식을 선택하십시오.

병합과 리베이스의 차이점을 아는 것이 좋습니다. :)


나는 그것이 개인적인 취향에 달려 있다고 생각합니다.

변경 사항을 적용하기 전에 어리석은 실수를 숨기고 싶습니까? 그렇다면 git pull --rebase완벽합니다. 나중에 커밋을 몇 개 (또는 하나) 커밋으로 스쿼시 할 수 있습니다. (푸시되지 않은) 기록에 병합이있는 경우 나중에 병합하는 것이 쉽지 않습니다 git rebase.

나는 개인적으로 모든 어리석은 실수를 게시하는 것을 신경 쓰지 않기 때문에 리베이스 대신 병합하는 경향이 있습니다.


git pull --rebase공동 작업자로부터 기록 재 작성을 숨길 수 있습니다 git push --force. 다른 사람이 똑같이하기 전에 커밋을 푸시하는 것을 잊은 경우 git pull --rebase 에만 사용하는 것이 좋습니다 .

당신은 아무것도를 저 지르지 않은, 그러나 당신의 작업 공간은 깨끗하지 않은 경우 git stash에 전에 git pull. 이렇게하면 히스토리를 조용히 다시 쓰지 않습니다 (일부 작업을 조용히 삭제할 수 있음).

참고 URL : https://stackoverflow.com/questions/2472254/when-should-i-use-git-pull-rebase

반응형