로컬 브랜치에서 여러 파일이 수정된 상태에서 그중 하나만 커밋해 원격에 올리는 절차, 스테이징 상태와 원격과의 차이를 확인하는 명령, git fetch 뒤 "have diverged" 가 뜰 때의 처리 방법을 정리한다. push 는 파일이 아니라 커밋을 올리므로 나머지 파일을 커밋하지 않으면 원격에 반영되지 않는다.
git branch --show-current
git add a.txt
git status
git commit -m "수정 내용 요약"
git log origin/development..HEAD --stat
git push origin development
git add . 는 나머지 파일까지 올라가므로 파일명을 명시한다. 한 파일 안에서도 일부 변경만 커밋하려면 git add -p a.txt 로 hunk 단위로 고른다. 커밋 후 나머지 파일은 working directory 에 modified 로 남는다.
스테이징 상태는 git status 의 "Changes to be committed"(스테이징됨) 와 "Changes not staged for commit"(미스테이징) 으로 구분한다. git status -s 는 앞 두 칸이 각각 스테이징 영역과 working directory 상태다.
M a.txt ← add 완료
M b.txt ← 수정만 되고 add 안 됨
MM c.txt ← add 후 다시 수정
git diff --cached --name-only 는 스테이징된 파일 목록, git diff --cached 는 그 내용이다. 실수로 add 한 파일은 git restore --staged b.txt 로 스테이징만 해제한다. 커밋 뒤 git log -1 --stat 로 어떤 파일이 들어갔는지 확인하고, push 전이라면 git reset --soft HEAD~1 로 커밋을 취소해 스테이징 상태로 되돌릴 수 있다.
로컬의 origin/development 는 마지막 fetch 시점의 스냅샷이므로 비교 전에 항상 git fetch origin 을 먼저 실행한다.
git fetch origin
git rev-list --left-right --count origin/development...HEAD
git log origin/development..HEAD --stat
git diff origin/development..HEAD --name-only
git push --dry-run origin development
rev-list 출력의 왼쪽은 원격에만 있는 커밋 수, 오른쪽은 로컬에만 있는 커밋 수다. A..B 는 "B 에는 있고 A 에는 없는 커밋" 이다.
git fetch 는 remote-tracking 브랜치(origin/development) 까지만 받아오고 로컬 브랜치에는 합치지 않는다(git pull = fetch + merge/rebase). fetch 뒤 Your branch and 'origin/development' have diverged, and have 1 and 16 different commits 가 뜨면 내 커밋 1개와 남의 커밋 16개가 갈라진 상태라 그대로 push 하면 거부된다. 커밋 하나 올리는 상황에서는 merge 커밋을 만들지 않는 rebase 가 깔끔하다.
git log HEAD..origin/development --oneline
git stash push b.txt c.txt
git pull --rebase origin development
git stash pop
git status
git log origin/development..HEAD --stat
git push origin development
미커밋 파일이 남아 있으면 rebase 가 거부될 수 있어 먼저 stash 로 치운다. 내가 수정한 파일을 남도 수정했으면 rebase 도중 CONFLICT (content): Merge conflict in a.txt 가 뜨고, 파일을 고친 뒤 git add a.txt → git rebase --continue, 포기하려면 git rebase --abort 한다. 팀 컨벤션이 merge 면 git pull origin development 를 따른다.