최근 GitHub Desktop 같은 GUI만 쓰다보니 아주 기초적인 commit/push/pull만 할 줄 알고, git이 뭔가 꼬이게 되면 대처를 잘 못하는 경험이 여러 번 있었다. 그런 김에 다양한 상황에서 적용할 수 있는 git 기초를 정리해보았다.
로컬에서 개발하던 코드를 GitHub에 처음으로 올릴 때
우선, 깃허브에서 repository를 하나 만든다(README.md 없이 만들어야 한다). 그러면 다음과 같이 원격 레포지토리의 URL이 생성된다. 이 URL을 통해서 로컬 저장소를 원격 저장소와 연결해주면 된다.
git init # 로컬 Git 저장소 초기화
git branch -M main # 브랜치 이름을 master에서 main으로 변경(--move 옵션으로 강제 덮어쓰기)
git branch --show-current # 현재 main인지 확인
# git remote 명령어는 원격 저장소를 관리
git remote add origin [원격 레포지토리 URL] # 로컬 저장소를 원격 저장소에 연결
git remote -v # 연결된 원격 저장소와 URL 확인(--verbose)
git add . # 변경된 파일들 모두를 staged로 변경
git commit -m "커밋 메시지"
git push -u origin main # 로컬의 main을 원격(origin)으로 연결(브랜치 간 연결)
로컬에서 변경한 파일 내역 중 일부만 원격으로 올릴 때
git status 명령어로 우션 변경되거나 추가된 모든 파일 목록을 보고, 이 중 commit하고 싶은 파일들만 git add 명령어로 staged로 변경해준다. 그 후 commit & push를 진행해주면 된다.
git status # 변경된 파일들 확인
git add [파일 이름1] [파일 이름2] [파일 이름3]
git commit -m "커밋 메세지"
git push # 업스트림 설정된 경우
git push -u origin dev # 업스트림 설정되지 않은 경우
로컬에서 새로운 브랜치 생성하고 원격에 반영할 때
커밋 뿐만 아니라 생성한 브랜치 또한 push해주면 원격에 반영된다.
git branch dev # 새로운 브랜치(dev) 생성
git checkout dev # 해당 브랜치로 이동
git branch --show-current # 현재 dev 브랜치에 있는지 확인
git push -u origin dev # 원격에 dev 브랜치 push
# 로컬과 원격의 브랜치 리스트가 일치한지 확인한다.
git branch # 로컬의 모든 브랜치 리스트 확인
git branch -r # 원격의 모든 브랜치 리스트 확인
로컬에서 브랜치 삭제하고, 삭제한 내역을 원격에 반영할 때
우선 브랜치를 삭제하기 전에, GitHub에서 PR 생성 및 코드 리뷰 & apporve 받고 상위 브랜치로 merge를 했다고 가정한다. 그 후 상위 브랜치로 checkout하고, merge된 변경사항을 받아온 다음, 하위 브랜치를 삭제하고 삭제된 내역을 원격에 반영한다.
git checkout [삭제하지 않을 브랜치명] # 삭제하지 않을 브랜치(merge 된 상위 브랜치)로 이동
git branch --merged # merge된 변경 사항 리스트로 확인
git pull # merge된 변경 사항 우선 pull 받기
git branch -d [삭제할 브랜치명] # 로컬에서 브랜치 삭제
git push origin --delete [삭제할 브랜치명] # 원격에 브랜치 삭제 반영
원격에서 브랜치 삭제하고, 삭제한 내역을 로컬에 반영할 때
마찬가지로, 우선 브랜치를 삭제하기 전에 GitHub에서 PR 생성 및 코드 리뷰 & apporve 받고 상위 브랜치로 merge를 했다고 가정한다. 그 후 GitHub에서 직접 브랜치를 삭제해준 상황이다.
git checkout [삭제하지 않을 브랜치명] # 삭제하지 않을 브랜치(merge 된 상위 브랜치)로 이동
git branch --merged # merge된 변경 사항 리스트로 확인
git pull # merge된 변경 사항 우선 pull 받기
git fetch --prune # 원격에서 삭제된 내역 반영해 브랜치 추적에 반영하기
git branch -d [삭제할 브랜치명]
git fetch --prune
명령어를 쓰면 원격 저장소에서 삭제된 브랜치 정보를 가져와 로컬 저장소의 추적 브랜치 목록을 업데이트할 수 있다. 즉, 기존에 설정해놓았던 로컬-원격 간의 레퍼런스(refs)가 삭제된다. 하지만 여전히 로컬에 해당 브랜치가 남아 있기 때문에 여전히 수동으로 삭제해주어야 한다. 인터넷에서는 로컬의 브랜치가 아예 삭제되는 것처럼 나와있지만 실제로는 그렇지 않고, 수동으로 삭제해야 한다.
Atlassian에서 제공하는 공식 문서를 보면 local branch를 삭제하는 게 아니라고 나와있다. local과 origin 간의 레퍼런스만 끊는 것이다.
Does git remote prune origin delete the local branch?
No, git remote prune origin will only delete the refs to remote branches that no longer exist. Git stores both local and remote refs. A repository will have local/origin and remote/origin ref collections. git remote prune origin will only prune the refs in remote/origin. This safely leaves local work in local/origin.
원격의 삭제된 브랜치 list를 한꺼번에 삭제해주는 명령어는 아래 stackoverflow를 참고하면 될 것 같다.
원격에 올라간 파일을 삭제할때
올려서는 안 되는 GitHub에 push했을 때, 로컬에서 파일을 삭제한다고 해도 원격에는 여전히 파일이 남아있다. 또한 이미 push를 한 상황이므로 git commit
을 되돌릴 수 있는 git reset
이나 git revert
를 쓰기도 번거롭다. 이때 git rm
명령어를 쓰면 파일을 삭제가능하다.
git rm [파일명] # 원격과 로컬의 파일을 모두 삭제
git rm --cached [파일명] # 원격의 파일만 삭제(로컬은 그대로 둠)
git rm --cached -r [디렉토리명] # 하위 디렉토리 및 파일까지 삭제
다른 사람이 만든 원격 브랜치를 로컬로 옮길 때
같이 협력을 하다보면 다른 사람이 브랜치를 만들어서 원격에 업로드하는 경우가 자주 생긴다. 이렇게 되면 원격 브랜치 중 내 로컬에는 없는 브랜치가 생긴다. 이때 git fetch --all
옵션을 써서 모든 브랜치의 정보를 가져오고, 각 브랜치로 이동해서 git pull
을 받으면 된다.
git branch -v -a # 우선 모든 로컬/원격 브랜치 확인해보기
git switch -c [브랜치명] origin/[브랜치명] # 브랜치를 생성과 동시에 이동, 로컬이 원격 저장소의 상태를 가지게 함
아래와 같이 적용된다. git pull
을 해도 이미 up to date
라고 나오는 것을 알 수 있다.