통합 vs 기반 재설정
8979 단어 teamworkproductivitygit
사람들이 Git를 사용하는 대부분의 방식은 개발자로서의 문화와 경험에서 나온다.합병과 재기초는 확실히 없지만 정해진 상황에서 항상 올바른 방법이 있다.어떤 경우, 사람들은 기준을 재설정하는 것이 더 적합하다는 것을 발견할 수도 있고, 합병은 결국 더 도움이 될 수도 있다.
병합
Git 문서:
git-merge - Join two or more development histories together
합병 조작의 용례는 전진하는 생각과 관련이 있다.공통 목표는 다음과 같습니다.
main
분기를 사용합니다.git checkout A # Could be "main", or "master"
git merge B # Update A with B
결합 커밋 M1을 사용하여 분기 B를 분기 A에 결합합니다.동일한 원칙에 따라 작업을 계속하거나 상향 합병을 준비하기 전에 부모 레벨로 테마 지점을 업데이트할 수도 있다.
git checkout B # A topic branch
git fetch remote A # Make sure to download the latest stuff
git merge remote/A # Update B with latest A
통합 커밋 M1이 있는 분기 A로 분기 B를 업데이트합니다.Git도 코드를 틈새 없이 통합하기 위해 최선을 다하지만, 때로는 코드를 한데 연결하는 데 도움을 필요로 할 뿐이다.이 시간들은 충돌이라고도 불린다.그러나 합병 제출의 장점 중 하나는 충돌이 합병 단계에서 해결되고 내부의 제출을 고려하지 않는다는 것이다.합병의 본질은 앞으로 추진하는 것이기 때문에 충돌이 처리되면 다시는 문제가 생기지 않는다.
git checkout A # Could be "main", or "master"
git merge B # Update A with B
# --- conflict resolution work ---
git add conflicting-file.txt # Mark conflict as resolved
git commit # Finish merging (by creating a merge commit)
분기 B를 분기 A로 결합하고 결합 커밋 M1에서 충돌을 해결합니다.또 다른 흔한 방법은 빠른 추진 전략으로 지점을 합병하는 것이다.위의 예를 고려하면 합병 프로세스가 합병 제출을 생성하지 않을 것입니다. 왜냐하면 지점 B의 맨 왼쪽 제출은 지점 B의 맨 오른쪽 제출 후에 만들어졌기 때문입니다.
git checkout A # Could be "main", or "master"
git merge --ff B # Update A with B with fast-forward strategy
빠른 속도로 분기 B를 분기 A로 결합합니다.합병에 들어가면 합병 과정의 역사가 더욱 뚜렷해 보이지만, 합병이 무엇인지 영원히 알 수 없다는 단점도 있다. 합병의 제출은 기본 제시 이후에만 부가되고, 그 아버지의 지점에 대한 정보는 포함되지 않기 때문이다.그러나 일부 팀은 이것이 열세라고 생각하지 않는다. 그들은 사실상 빠른 합병을 추진할 것이다. 따라서 자주 rebase 합병을 해야 한다.
중요한 기초
Git 문서:
git-rebase - Re-apply commits on top of another base tip
rebase 작업의 용례는 다시 쓰기와 정리에 대한 생각과 관련이 있습니다.공통 목표는 다음과 같습니다.
main
로 재설정하고 제출 기록을 다시 재생하여 분기의 최신 작업 업데이트 기능(테마) 분기를 사용합니다.git checkout A # Could be "main", or "master"
git merge --ff B # Hmmm no can do! B doesn't start after A
git checkout B # Go back to B
git rebase A # Reset to A then replay commits from B
git checkout A # Let's try again
git merge --ff B # Oh yeah
분기 B를 분기 A에서 베이스 주소를 재정의한 다음 빠른 속도로 분기 B를 분기 A로 결합합니다.위의 그림은 기본 작업의 가장 흔히 볼 수 있는 용례를 보여 줍니다. 가능한 한 깨끗한 방식으로 최신 역사 업데이트 테마 지점을 사용합니다.그러나'가장 깨끗하다'는 것은 비슷하지만 서로 다른 제출 대상으로 역사를 다시 쓰는 것을 의미한다는 것을 주의하십시오.
Rebasing a branch will, invariably, rewrite its history.
앞에서 말한 바와 같이 일부 팀은 깨끗한 선형 제출 역사만 좋아할 뿐이다. 이것은 사람들에게 재정의 기반을 파악하고 진속 전략과 시종일관 융합하도록 요구할 것이다.누군가가 지점의 기초를 다시 설정해야 할 때마다, 위의 예는 그들이 지점을 합병할 준비가 될 때까지 반복된다.
git checkout B # We already know we need a rebase
git rebase A # Let's see...
# --- conflict resolution work on commit B2 ---
git add conflicting-file.txt # Looks good now
git commit --amend # Commit with the "amend" option to fixup B2
git rebase --continue # Now we go
# --- conflict resolution work on commit B3 ---
git add another-conflicting-file.txt # Ouch
git commit --amend # Fixup B3
git rebase --continue # Done
분기 B를 분기 A에서 기지를 재정립하여 B로부터 약속된 충돌을 해결한 다음 빠른 속도로 분기 B를 분기 A에 통합합니다.충돌에 관해서, 재결정은 일반적으로 더 많은 작업을 필요로 한다. 왜냐하면 충돌은 제출 단계에서 해결해야 하기 때문이다.따라서 기초 지점에 변경이 도입되면 기초를 재설정하는 과정에서 충돌을 다시 해결해야 할 수도 있다.
기본 주소를 다시 정할 때 고려해야 할 또 다른 일은 다른 사람이 보낸 대상을 버리거나 다시 쓸 수 있다는 것이다. 일반적인 제출이든 충돌 해결 방안과 통합된 제출이든.이런 행위는 중대한 기반이 되지 않는 사람들의 작품을 방해하기 때문에 강력하게 반대한다.기지를 다시 설정하면 Git에서 지점이 원격 피어와 연결이 끊어진 것을 발견하면 지점에 경고해야 하기 때문에 지점을 강제로 밀어넣기
main
해야 원격으로 올릴 수 있다.git checkout B # Let's clean this up
git rebase A # Reset to A then replay commits from B
git push remote B # Upload rewritten history
# --- Branch A was updated by other people ---
git fetch remote # Make sure to download the latest stuff
git rebase remote/A # Reset to latest A then re-replay commits from B
git push remote B # Oops it doesn't work, histories differ!
git push --force remote B # Force-push branch B
분기 A에서 분기 B의 기본 주소를 재설정한 다음 분기 A에서 업데이트한 후 분기 A에서 분기 B의 기본 주소를 재설정합니다.기록을 고려하면, 베이스 리셋 작업은 비교적 새로운 역사 기록을 사용하여 지점을 업데이트하는 이벤트를 무시합니다. 지점을 리셋하면 선형 제출 로그가 남기 때문입니다.
기본 주소 및 기본 주소 재정의
깨끗하고 선형적인 역사를 유지하기 위해 하나의 지점을 강제로 밀어붙인 후 Git에 대해 경험이 많지 않은 사용자는 일반적인
git push --force
를 사용하여 지점의 최신 버전을 자신의 위로 끌어올려 혼란스럽고 필요로 하지 않는 합병 제출을 초래할 수 있다.이것은 클릭을 숨김 Git 명령으로 바꾸는 그래픽 사용자 인터페이스에서 특히 흔히 볼 수 있다.Merge remote-tracking branch 'origin/feature-x' into feature-x
이러한 상황을 방지하기 위해서 git pull
분기를 원격 상태로 초기화한 다음, 그 위에 업데이트된 제출을 다시 적용합니다. 이것은 보통 최초의 의도입니다.이 비헤이비어는 Git configuration에서 기본 비헤이비어로 설정할 수 있습니다.git config --global pull.rebase true
나 어떡하지?
이것은 당신의 목표가 무엇인지, 그리고 팀이 무엇을 동의하는지에 달려 있다.간단히 말하면:
Reference
이 문제에 관하여(통합 vs 기반 재설정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/emyller/merge-vs-rebase-63e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)