# 동기화와 충돌

> 여러 컴퓨터에서 고쳤을 때 aisync가 무엇을 지키고 무엇을 묻는지 설명합니다.

## 기본 흐름

```sh
aisync push default     # 이 컴퓨터에서 고친 것을 올립니다
aisync diff default     # 받으면 무엇이 바뀌는지 봅니다
aisync pull default     # 리포의 최신 내용을 받습니다
```

## 다른 사람이 먼저 올렸을 때

리포에 새 커밋이 있어도 그 커밋이 이 프로필을 건드리지 않았다면 그대로 그 위에 올립니다. 다른 프로필을 고쳤거나 토큰만 바꾼 커밋 때문에 막히지 않습니다.

이 프로필이 리포에서 바뀌었다면 먼저 받으라고 합니다.

```text
error: profile default changed in the repo since your last pull.
  aisync pull default    gets it; your local edits stay unless the same file changed on both sides
```

## 받을 때 내 수정은 지켜집니다

받기를 할 때 파일마다 상태를 봅니다.

| 상태 | 이 컴퓨터 | 리포 | 받기가 하는 일 |
|---|---|---|---|
| `update` | 그대로 | 바뀜 | 리포 것으로 바꿉니다 |
| `keep` | 바뀜 | 그대로 | 내 수정을 그대로 둡니다. 다음 push에 올라갑니다 |
| `conflict` | 바뀜 | 바뀜 | 멈추고 어느 쪽을 남길지 묻습니다 |
| `replace` | 처음 받는데 이미 파일이 있음 | | 백업한 뒤 바꿉니다 |

## 같은 파일을 양쪽에서 고쳤을 때

```text
error: these changed both here and in the repo:
  conflict file   CLAUDE.md  (changed here and in the repo)
  take the repo's version: aisync pull --force default   (yours is backed up first)
  keep yours:              aisync push --force default   (replaces the repo's version)
```

- 리포 것을 받으려면 `pull --force`. 내 파일은 `.aisync/backup/`에 남습니다.
- 내 것을 남기려면 `push --force`. 리포의 그 프로필 내용을 내 것으로 덮습니다.

두 내용을 합쳐야 한다면 백업 폴더의 내 파일을 보고 손으로 합친 뒤 올리세요.

## 새 파일과 새 서버 추가하기

push는 지난번에 받은 파일과 서버만 다시 읽습니다. 새로 만든 것은 직접 추가합니다.

```sh
aisync push default --add skills/deploy
aisync push default --add-server notion
```

새 서버에 평문 토큰이 있으면 올리기를 멈춥니다. `--secrets`를 붙이면 그 토큰을 암호화 저장소로 옮기고 참조로 바꿔 올립니다. 이 컴퓨터의 `.claude.json`도 함께 참조로 바뀝니다.
