programing

git pull --rebase는 언제 사용해야 합니까?

newstyles 2023. 5. 24. 21:45

git pull --rebase는 언제 사용해야 합니까?

나는 사용하는 몇몇 사람들을 알고 있습니다.git pull --rebase기본적으로 그리고 절대 사용하지 말라고 주장하는 다른 사람들.병합과 재배치의 차이를 이해한다고 믿지만, 저는 이것을 다음의 맥락에 넣으려고 노력하고 있습니다.git pull병합 커밋 메시지를 많이 보고 싶지 않은 것입니까, 아니면 다른 문제가 있습니까?

저는 무엇에 대해 다른 관점을 제공하고 싶습니다.git pull --rebase사실은, 가끔 길을 잃는 것 같기 때문입니다.

Subversion(또는 적이 Subversion(또는 CVS)의 수 .svn update커밋할 변경 사항이 있지만 업스트림 변경 사항으로 인해 커밋이 실패할 경우svn update전복은 업스트림 변경사항을 사용자의 변경사항과 병합하여 진행되며 충돌이 발생할 수 있습니다.

이 한은 Subversion입니다.git pull --rebase최신 버전과 관련하여 로컬 변경사항을 다시 작성하는 작업은 "기본" 부분입니다.이 했면이라더신을 했다면.svn diff합니다.svn diff그 후, 두 디프의 차이는 기본 재배치 작업이 수행한 것입니다.

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

이 옳은 일을 하는 입니다.--rebase왜냐하면 그것이 당신이 실제로 의미론적으로 하고 있는 일이기 때문입니다.사용자와 다른 사용자가 의도한 분기의 선형 내역을 해킹하고 있습니다.당신의 밀어내기 시도에 앞서 다른 사람이 우연히 밀어냈다는 사실은 무관하며, 그러한 타이밍의 사고가 각각 역사에 병합을 초래하는 것은 역효과를 낳는 것으로 보입니다.

어떤 이유에서든지 실제로 지점이 될 필요성을 느낀다면, 그것은 제 생각과는 다른 우려입니다.한, 에는, 지만당이합형표하변현화고하한는자욕, 제생에각행은동기없하본, 적신는인구적가극병의태당신,git pull --rebase.

프로젝트의 역사를 관찰하고 이해해야 하는 다른 사람들을 고려해 주십시오.역사에 수백 개의 병합이 곳곳에 흩어져 있기를 원하십니까, 아니면 의도적으로 다양한 개발 노력의 실제 병합을 나타내는 선택된 몇 개의 병합만 원하십니까?

당신은 야합다니해를 사용해야 .git pull --rebase

  • 변경사항은 별도의 분기를 사용할 수 없습니다.

정말로 -- 그렇다면 왜 안 될까요?이는 더 명확하며 커밋에 논리적인 그룹화를 부과하지 않습니다.


네, 설명이 좀 필요할 것 같습니다.Git에서는 여러분도 아시다시피 분기와 합병을 권장합니다.변경사항을 가져오는 로컬 분기와 원격 분기는 실제로 서로 다른 분기입니다.git pull그들을 합병하는 것입니다.자주 누르지 않고 일반적으로 여러 변경 사항이 완료된 기능을 구성하기 전에 누적되기 때문에 합리적입니다.

하지만 때로는, 어떤 이유로든, 원격 및 로컬이라는 두 가지가 하나의 지점이 되는 것이 더 낫다고 생각할 수도 있습니다.SVN 때처럼.바로 여기서git pull --rebase경기가 시작됩니다.더 이상 병합하지 않고 원격 분기 위에서 커밋합니다.그것이 실제로 그것에 관한 것입니다.

위험한지 여부는 로컬 지점과 원격 지점을 분리할 수 없는 하나로 취급하고 있는지 여부입니다.때로는 합리적인 경우도 있습니다(변경사항이 작거나 강력한 개발의 시작 단계에 있는 경우, 작은 커밋으로 중요한 변경사항이 발생하는 경우).그렇지 않을 때도 있습니다(일반적으로 다른 분기를 만들곤 했지만 너무 게을렀기 때문에).하지만 그것은 다른 질문입니다.

이를 설명하는 가장 좋은 방법은 다음과 같습니다.

  1. 앨리스는 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. 앨리스는 그렇습니다.git push origin master빠른 병합이 아니기 때문에 거부됩니다.
  9. Alice는 오리진/마스터의 로그를 보고 커밋이 자신의 로그와 관련이 없음을 확인합니다.
  10. 앨리스는 그렇습니다.git pull --rebase origin master
  11. Alice의 병합 커밋이 풀리고 Bob의 커밋이 풀리며 Bob의 커밋 후 Alice의 커밋이 적용됩니다.
  12. 앨리스는 그렇습니다.git push origin master그리고 모든 사람들은 미래에 로그를 볼 때 쓸모없는 병합 커밋을 읽을 필요가 없어 행복합니다.

병합되는 특정 분기는 예제와 관련이 없습니다.이 예에서 마스터는 릴리스 분기 또는 개발 분기만큼 쉽게 될 수 있습니다.핵심은 Alice & Bob이 로컬 브랜치를 공유 원격 브랜치에 동시에 병합하고 있다는 것입니다.

제 생각에 당신은 사용해야 할 것 같습니다.git pull --rebase동일한 분기에서 다른 사용자와 공동 작업하는 경우.당신은 당신의 업무 → 커밋 → 커밋 사이클 → 당신이 당신의 업무를 추진하기로 결정했을 때, 당신의 추진은 거절됩니다. 왜냐하면 같은 분기에 병렬적인 업무가 있었기 때문입니다.이 시점에서 는 항상pull --rebase커밋을 평탄화하기 위해 스쿼시를 사용하지 않지만 추가 병합 커밋을 피하기 위해 기본값을 변경합니다.

Git에 대한 지식이 증가함에 따라 제가 사용했던 다른 버전 제어 시스템보다 훨씬 더 많은 역사를 보게 될 것입니다.작은 병합 커밋이 많은 경우, 역사에서 발생하는 더 큰 그림에 대한 초점을 잃기 쉽습니다.

이것은 실제로 내가 리베이스(*)를 하는 유일한 시간이며, 나머지 워크플로우는 병합 기반입니다.하지만 여러분의 가장 빈번한 책임자들이 이것을 하는 한, 역사는 결국 훨씬 더 나아 보입니다.

(*) Git 과정을 가르치는 동안, 저는 특정 상황에서 피쳐 분기를 재배치하는 것을 옹호했기 때문에 학생에게 이것으로 저를 체포하게 했습니다.그리고 그는 이 대답을 읽었습니다;) 그러한 근거를 제시하는 것도 가능하지만, 그것은 항상 미리 준비된/합의된 시스템에 따라야 하며, 따라서 "항상" 적용되어서는 안 됩니다.그리고 그 때 저는 보통 하지 않습니다.pull --rebase중 어느 에 대한 질문입니다, 둘그질문내,용다니입의이것하;)

다음을 기억하십시오.

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

따라서 분기를 처리할 방법을 선택합니다.

merge와 rebase의 차이점을 아는 것이 좋을 것입니다 :)

제 생각에는 사용하지 않을 이유가 전혀 없다고 생각합니다.pull --rebase나는 특히 Git에 코드를 추가하여 그것을 허용하기 위해.git pull항상 업스트림 커밋에 대해 기본 재배치하는 명령입니다.

역사를 살펴볼 때, 기능을 작업하는 남자/여자가 언제 동기화를 멈추었는지 아는 것은 결코 흥미롭지 않습니다.그것은 그/그녀가 그것을 하는 동안 남자/여자에게 유용할 수 있지만, 그것이 바로 그것입니다.reflog을 위한 것입니다.그것은 다른 모든 사람들에게 소음을 더해줄 뿐입니다.

git pull --rebase 쓰는 것을 숨길 수 있습니다.git push --force을 사용하는 것이 좋습니다.git pull --rebase 다른 사람이 커밋을 수행하기 전에 커밋을 푸시하는 것을 잊었다는 것을 알고 있는 경우에만 해당됩니다.

이 아무것도, 단지 만당이아무당작않깨공다면지끗하단간지이업약, 신의신도만것저.git stash git pull이렇게 하면 기록을 자동으로 다시 작성할 수 없습니다(일부 작업이 자동으로 삭제될 수 있음).

개인적인 취향으로 요약된다고 생각합니다.

변경 사항을 적용하기 전에 어리석은 실수를 숨기고 싶으십니까?그렇다면,git pull --rebase. 에 몇 번 한 번의 커밋으로 할 수 .나중에 커밋을 몇 개(또는 한 개)의 커밋으로 압축할 수 있습니다.만약 이 여러분의 않은), (으)ㄹ 수 있는 것은 .git rebase나중에 하나

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

깃풀 사용법

  • git pull원격에서 커밋을 사용하여 로컬 작업 분기를 업데이트하고 모든 원격 추적 분기를 업데이트합니다.

  • git pull --rebase원격에서 커밋을 사용하여 로컬 작업 분기를 업데이트하지만 병합 커밋을 방지하면서 원격에서 모든 새 커밋이 발생한 후 로컬 커밋이 발생하도록 기록을 다시 작성합니다.

  • git pull --force이 옵션을 사용하면 충돌로 인해 가져올 수 없는 옵션을 사용할 때 특정 원격 추적 분기를 강제로 가져올 수 있습니다.Git가 현재 분기를 원격 추적 분기와 일치하도록 덮어쓰도록 하려면 Git 재설정 사용에 대해 아래를 읽으십시오.

  • git pull --all모든 리모컨 가져오기 - 포크 또는 여러 리모컨이 있는 다른 사용 사례에서 작업하는 경우 유용합니다.

이 시나리오에서는 오리진 코드가 변경되어 커밋을 푸시할 수 없는 상황을 설명합니다.코디의 설명은 이해하기 쉽습니다.저는 시나리오를 설명하기 위해 도표를 그리고 그것이 도움이 되기를 바랍니다.제가 틀렸다면 고쳐주세요.

여기에 이미지 설명 입력

한 가지 사례는 비트 버킷 PR로 작업하는 경우입니다.다음 사례를 통해 이해해 보겠습니다.

PR이 열려 있습니다.

그런 다음 당신은 BitBucket GUI를 통해 PR 원격 브랜치를 최신 Master 브랜치로 재배치하기로 결정했습니다.이 작업은 PR의 커밋 ID를 변경합니다.

GUI를 사용하여 원격 분기의 위치를 변경합니다.먼저 PC의 로컬 분기를 원격 분기와 동기화해야 합니다.

이우경git pull --rebase마법처럼 작동합니다.

나 뒤에git pull --rebase로컬 분기와 원격 분기의 기록이 동일한 커밋 ID를 가집니다.

이제 PR 분기에 새 커밋/변경 사항을 추가하면 됩니다.

원격 분기/비트 버킷 PR에 강제나 어떤 것도 사용하지 않고 새 커밋을 멋지게 푸시할 수 있습니다.

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