소스 제어 워크플로

Android 코드로 작업하려면 Git(오픈소스 버전 제어 시스템) 및 Repo(Git 위에서 실행되는 Google에서 만든 저장소 관리 도구)가 필요합니다. Repo 및 Git 간의 관계에 관한 설명은 소스 제어 도구를 참고하고 각 도구의 지원 문서 링크를 확인하세요.

흐름

Android 개발에는 다음과 같은 기본 워크플로가 포함됩니다.

  1. repo start를 사용하여 새 주제 브랜치를 시작합니다.
  2. 파일을 수정합니다.
  3. git add를 사용하여 변경사항을 스테이징합니다.
  4. git commit을 사용하여 변경사항을 커밋합니다.
  5. repo upload를 사용하여 검토 서버에 변경사항을 업로드합니다.

업무

Android 코드 저장소에서 Git 및 Repo를 사용하려면 다음과 같은 일반적인 작업을 수행해야 합니다.

명령어 설명
repo init 새 클라이언트를 초기화합니다.
repo sync 클라이언트를 저장소에 동기화합니다.
repo start 새 브랜치를 시작합니다.
repo status 현재 브랜치 상태를 표시합니다.
repo upload 검토 서버에 변경사항을 업로드합니다.
git add 파일을 스테이징합니다.
git commit 스테이징된 파일을 커밋합니다.
git branch 현재 브랜치를 표시합니다.
git branch [branch] 새 주제 브랜치를 생성합니다.
git checkout [branch] HEAD를 지정된 브랜치로 전환합니다.
git merge [branch] [branch]를 현재 브랜치로 병합합니다.
git diff 스테이징되지 않은 변경사항의 차이를 표시합니다.
git diff --cached 스테이징된 변경사항의 차이를 표시합니다.
git log 현재 브랜치의 기록을 표시합니다.
git log m/[codeline].. 푸시되지 않은 커밋을 표시합니다.

Repo를 사용하여 소스를 다운로드하는 방법에 관한 내용은 소스 다운로드Repo 명령어 참조를 확인하세요.

클라이언트 동기화

사용 가능한 모든 프로젝트의 파일을 동기화하려면 다음을 실행합니다.

repo sync

선택한 프로젝트의 파일을 동기화하려면 다음을 실행합니다.

repo sync PROJECT0 PROJECT1 ... PROJECTN

주제 브랜치 만들기

버그나 새로운 기능에 관한 작업을 시작할 때와 같이 변경을 시작할 때도 언제든지 로컬 작업 환경에서 주제 브랜치를 시작할 수 있습니다. 주제 브랜치는 원본 파일의 사본이 아닙니다. 로컬 브랜치를 만들고 가벼운 작업으로 전환하는 특정 커밋을 가리키는 포인터입니다. 브랜치를 사용하여 작업의 한 측면을 다른 측면과 분리할 수 있습니다. 주제 브랜치 사용에 대한 흥미로운 문서는 주제 브랜치 분리를 참고하세요.

Repo를 사용하여 주제 브랜치를 시작하려면 프로젝트로 이동하여 다음을 실행합니다.

repo start BRANCH_NAME .

후행 구두점( .)은 현재 작업 중인 디렉터리의 프로젝트를 나타냅니다.

새 브랜치가 만들어졌는지 확인하려면 다음을 실행하세요.

repo status .

주제 브랜치 사용

특정 프로젝트에 브랜치를 할당하려면 다음을 실행하세요.

repo start BRANCH_NAME PROJECT_NAME

모든 프로젝트 목록은 android.googlesource.com을 참고하세요. 이미 프로젝트 디렉터리로 이동했다면 마침표를 사용하여 현재 프로젝트를 나타냅니다.

로컬 작업 환경의 다른 브랜치로 전환하려면 다음을 실행하세요.

git checkout BRANCH_NAME

기존 브랜치 목록을 보려면 다음을 실행하세요.

git branch

또는

repo branches

두 가지 명령어 모두 현재 브랜치의 이름 앞에 별표(*)가 붙은 기존 브랜치의 목록을 반환합니다.

파일 스테이징

기본적으로 Git은 프로젝트에서 생긴 변경사항을 확인하지만 추적하지 않습니다. Git이 변경사항을 유지하도록 하려면 커밋에 포함할 변경사항을 표시하거나 스테이징해야 합니다.

변경사항을 스테이징하려면 다음을 실행합니다.

git add

이 명령어는 프로젝트 디렉터리 내의 파일 또는 디렉터리를 위한 인수를 허용합니다. 이름과 달리 git add는 단순히 파일을 Git 저장소에 추가하는 것에 그치지 않고 파일 수정과 삭제를 스테이징하는 데도 사용할 수 있습니다.

클라이언트 상태 보기

파일 상태를 나열하려면 다음을 실행하세요.

repo status

커밋되지 않은 수정(커밋에 표시되지 않은 로컬 수정)을 보려면 다음을 실행하세요.

repo diff

커밋된 수정(커밋에 표시되고 위치가 지정된 수정)을 보려면 현재 위치가 프로젝트 디렉터리인지 확인한 다음 cached 인수를 사용하여 git diff를 실행하세요.

cd ~/WORKING_DIRECTORY/PROJECT
git diff --cached

변경사항 커밋

커밋은 Git의 버전 관리의 기본 단위이며 디렉터리 구조의 스냅샷과 전체 프로젝트의 파일 콘텐츠로 구성됩니다. 이 명령어를 사용하여 Git에서 커밋을 만듭니다.

git commit

커밋 메시지를 입력하라는 메시지가 표시되면 AOSP에 제출된 변경사항에 관한 짧지만 유용한 메시지를 제공하세요. 커밋 메시지를 추가하지 않으면 커밋이 실패합니다.

Gerrit에 변경사항 업로드

최신 버전으로 업데이트한 다음 변경사항을 업로드하려면 다음을 실행합니다.

repo sync
repo upload

이러한 명령은 커밋된 변경사항 목록을 반환하고 검토 서버에 업로드할 브랜치를 선택하라는 메시지를 표시합니다. 브랜치가 하나뿐이면 간단한 y/n 메시지가 표시됩니다.

동기화 충돌 해결

repo sync 명령어가 동기화 충돌을 반환하면 다음을 실행하세요.

  1. 병합되지 않은 파일을 확인합니다(상태 코드 = U).
  2. 필요한 경우 충돌 영역을 수정합니다.
  3. 관련 프로젝트 디렉터리로 변경합니다. 영향을 받은 파일을 추가하고 커밋한 다음 변경사항을 리베이스합니다.
    git add .
    git commit
    git rebase --continue
    
  4. 리베이스가 완료되면 전체 동기화를 다시 시작합니다.
    repo sync PROJECT0 PROJECT1 ... PROJECTN
    

클라이언트 정리

Gerrit에 변경사항을 병합한 후 로컬 작업 디렉터리를 업데이트하고 repo prune을 사용하여 안전하게 비활성 주제 브랜치를 삭제합니다.

repo sync
repo prune

클라이언트 삭제

모든 상태 정보는 클라이언트에 저장되므로 파일 시스템에서 디렉터리만 삭제하면 됩니다.

rm -rf WORKING_DIRECTORY

클라이언트를 삭제하면 검토를 위해 업로드하지 않은 모든 변경사항이 영구적으로 삭제됩니다.