Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020
Visual Studio 2019 | Visual Studio 2022
Git은 각 새 커밋 이전 버전에 연결하여 분기 개발 기록을 자동으로 유지 관리합니다. 한 분기를 다른 분기로 병합할 기록이 덜 간단해질 수 있습니다. 예를 들어 빠른 전달되지 않는 병합 여러 선행 작업과 병합 커밋을 만들어 서로 다른 개발 라인을 결합합니다. 반대로 Git 리베이스는 병합 커밋을 만들지 않고 서로 다른 개발 라인의 기록을 재구성하여 커밋 기록이 더 간단해지지만, 병합 과정에 대한 정보는 손실됩니다. 병합 형식 선택은 병합 레코드를 보존할지 아니면 커밋 기록을 단순화할지에 따라 달라질 수 있습니다.
이 문서에서는 빠르게 전달되지 않는 병합 대신 rebase를 사용하는 경우를 설명하고 다음 작업에 대한 절차를 제공합니다.
- 로컬 브랜치 리베이스
- 리베이스 후 로컬 브랜치를 강제 푸시하십시오.
- 로컬 커밋을 합치기 위한 대화형 재베이스
Git 워크플로에 대한 개요는 Azure Repos Git 자습서를 참조하세요.
필수 조건
| 카테고리 | 요구 사항 |
|---|---|
| 프로젝트 액세스 | 프로젝트멤버입니다. |
| 권한 | - 프라이빗 프로젝트에서 코드 보기: 최소 기본 액세스. - 프라이빗 프로젝트의 코드 복제 또는 기여: 기여자 보안 그룹 또는 프로젝트의 해당 사용 권한의 구성원입니다. - 분기 또는 리포지토리 사용 권한 설정: 분기 또는 리포지토리에 대한 사용 권한 사용 권한 관리 - 기본 분기 변경: 리포지토리에 대한 정책 편집 권한 설정. - 리포지토리 가져오기: 프로젝트 관리자 보안 그룹의 구성원이거나, Git 프로젝트 수준에서 리포지토리 만들기 권한이 허용으로 설정된 경우. 자세한 내용은 Git 리포지토리 권한 설정을 참조 하세요. |
| 서비스 | 리포지토리가 활성화되었습니다. |
| 도구 | 선택 사항. az repos 명령어를 사용하세요: Azure DevOps CLI. |
비고
퍼블릭 프로젝트에서 이해 관계자 액세스 권한이 있는 사용자는 코드 보기, 복제 및 기여를 포함하여 Azure Repos에 대한 모든 권한을 갖습니다.
| 카테고리 | 요구 사항 |
|---|---|
| 프로젝트 액세스 | 프로젝트멤버입니다. |
| 권한 | - 코드 보기: 최소 베이직 접근 권한. - 코드 복제 또는 기여: 기여자 보안 그룹의 구성원이거나 프로젝트에서 해당 권한을 가진 경우. |
| 서비스 | 리포지토리가 활성화되었습니다. |
로컬 브랜치 리베이스
Git rebase을 사용하여 원본 분기의 커밋을 현재 로컬 분기(대상 분기)에 통합합니다. 원본 분기는 변경되지 않은 상태로 유지됩니다. 비교를 위해 Git 리베이스 및 기타 병합 형식은 다음 다이어그램에 표시됩니다.
git rebase를 사용할 때 커밋 전후를 보여 주는
Git 리베이스는 타겟 브랜치의 커밋 기록을 재배열하여 소스 브랜치의 모든 커밋을 포함하고, 마지막 공통 커밋 이후의 타겟 브랜치 커밋도 포함시킵니다. 이를 보는 또 다른 방법은 다시베이스가 원본 분기 기록 위에 있는 대상 분기의 변경 내용을 재생하는 것입니다. 특히 Git 리베이스는 기존 대상 브랜치의 커밋 시퀀스를 변경합니다. 다른 병합 전략은 해당 사항이 없습니다. 위의 다이어그램에서 commit K'는 K와 동일한 변경 내용을 포함하지만 C 대신 다시 커밋 E로 연결되므로 새 커밋 ID가 있습니다.
리베이스하는 동안 원본 브랜치의 변경 사항이 대상 브랜치의 변경 사항과 충돌하는 경우, Git에서는 병합 충돌을 해결하라는 메시지를 표시합니다. 병합 중에 병합 충돌을 해결하는 것과 동일한 방식으로 재베이스 중에 병합 충돌을 해결할 수 있습니다.
리베이스 대 노-패스트-포워드 병합
Git 리베이싱은 3방향 또는 true 병합이라고도 하는 빠르게 전달되지 않는 병합보다 간단하지만 정확한 커밋 기록을 생성합니다. 커밋 기록에서 병합의 레코드를 원하는 경우 빠르게 전달되지 않는 병합을 사용합니다.
기능 또는 버그픽스 분기에서 작업하는 유일한 사용자인 경우 rebase를 사용하여 최근 main 분기 작업을 정기적으로 통합하는 것이 좋습니다. 이 전략은 다른 사용자의 최근 작업을 계속 인식하고 발생하는 병합 충돌을 신속하게 해결하는 데 도움이 됩니다. 리베이스를 통해 새로운 기능을 최신 main 분기 작업에 기반하여 구현함으로써 선형 커밋 기록을 유지하는 데 도움이 됩니다.
Git 리베이스 및 사용 시기에 대한 자세한 내용은 리베이스 대 병합을 참조하세요.
리베이스 및 포스 푸시 지침
이전에 푸시한 로컬 분기를 다시 지정한 다음 기본 Git 푸시 명령을 다시 실행하면 푸시가 실패합니다. 기본 Git 푸시 명령은 빠른 전달 병합을 적용하여 로컬 분기를 원격 분기에 통합합니다. 다시베이스가 로컬 대상 분기의 기존 커밋 시퀀스를 변경하므로 해당 명령이 다시베이스 후에 실패하므로 원격 대응 항목의 기록과 더 이상 일치하지 않습니다. 이 시나리오에서는 원격 분기를 덮어써서 강제로 푸시하면 성공할 것입니다.
Git 리베이스 및 강제 푸시는 강력한 도구이지만, 이를 사용할지 여부를 결정할 때는 다음 지침을 염두에 두세요.
- 다른 사용자가 공유 분기를 사용하지 않는 한 푸시되고 다른 사용자와 공유된 로컬 분기를 다시 지정하지 마세요. 다시 기반이 되면 로컬 분기가 원격 분기의 기록과 더 이상 일치하지 않습니다.
- 로컬 버전의 원격 분기가 업데이트된 원격 분기 기록과 더 이상 일치하지 않으므로 다른 사용자가 사용 중인 원격 분기로 강제 푸시하지 마세요.
- 당신의 팀은 리베이스 및 강제 푸시의 사용 시나리오에 대해 동의해야 합니다.
팁 (조언)
공동 작업 검토 프로세스의 경우 끌어오기 요청 사용하여 새 작업을 원격 리포지토리의 기본 분기에 병합합니다.
다시베이스하는 방법
Visual Studio 2022는 Git 메뉴, Git 변경 내용 및 솔루션 탐색기 상황에 맞는 메뉴를 사용하여 Git 버전 제어 환경을 제공합니다. Visual Studio 2019 버전 16.8은 팀 탐색기 Git 사용자 인터페이스도 제공합니다. 자세한 내용은 Visual Studio 2019 - 팀 탐색기 탭을 참조하세요.
Git > 분기 관리 선택하여 Git 리포지토리 창을 엽니다.
Git 리포지토리 창에서 대상 분기를 마우스 오른쪽 단추로 클릭하고 체크 아웃선택합니다.
마우스 오른쪽 버튼으로 원본 분기를 클릭한 후, 대상 분기<를 >원본 분기<로 리베이스>를 선택합니다.
Visual Studio는 성공적으로 다시 기반이 된 후 확인 메시지를 표시합니다.
병합 충돌로 인해 다시베이스가 중단되면 Visual Studio에서 사용자에게 알립니다. 충돌을 해결하거나 리베이스를 취소하고, 리베이스 전 상태로 돌아갈 수 있습니다.
리베이스 후 로컬 브랜치를 강제 푸시하십시오.
이전에 푸시한 로컬 분기를 다시베이스하는 경우 후속 기본 Git 푸시가 실패할있습니다. 대신 로컬 분기를 강제로 푸시하여 원격 분기를 덮어쓰고, 커밋 기록을 일치시킬 수 있습니다.
경고
다른 사용자가 작업 중인 분기를 강제로 푸시하지 마세요. 자세한 내용은 리베이스 및 강제 푸시 지침을 참조하세요.
Visual Studio에서 강제 푸시하려면 먼저 강제 푸시 옵션을 사용하도록 설정해야 합니다.
도구>옵션>소스 제어>Git 전역 설정이동합니다.
푸시 허용 --force-with-lease 옵션을 선택합니다.
Git 푸시 --force-with-lease 플래그는 강제 푸시하려는 로컬 분기 내에 통합되지 않은 커밋이 있는 원격 분기를 덮어쓰지 않으므로 --force 플래그보다 안전합니다.
로컬 커밋을 합치기 위한 대화형 재베이스
일반적으로 로컬 기능 분기의 새 기능을 작업할 때 여러 커밋을 만듭니다. 새 기능을 게시할 준비가 되면 해당 커밋을 단일 커밋으로 통합하여 커밋 기록을 간소화할 수 있습니다. 대화형 리베이스를 사용하여 여러 커밋을 단일 커밋으로 squash를 수 있습니다.
Visual Studio 2022는 대화형 리베이스를 지원하지 않습니다. 대신 Git 명령줄을 사용합니다.
비고
Azure DevOps 사용자는 끌어오기 요청 중에 주제 브랜치의 커밋 기록을 압축하기 위해 squash 병합을 사용할 수 있습니다.