Git checkout
은 특정 버전으로 이동하는걸 뜻한다.
git checkout <commit_id>
이 명령은 작업 디렉토리를 지정된 commit이나 branch의 상태로 작업 폴더가 변경이 된다. 해당 시점의 코드 및 상태를 확인하거나 작업을 시작할 수 있다.
각 commit은 고유한 HashCode로 식별된다. 이 해시 코드는 해당 commit의 고유한 식별자 역할을 한다.
보통은 전체 해시 코드 중 일부(예: 처음 7자)만 사용하여 commit을 구분한다. 이것을 통해 특정 commit을 식별하고 해당 시점으로 이동할 수 있다. git log --oneline
명령을 사용하면 각 commit에 대한 짧은 해시 코드를 확인할 수 있다.
git checkout
을 실행하면 현재 작업 중인 Working Deirectory가 해당 버전의 상태로 변경
작업 중인 위치를 나타내는 것을 HEAD
라고 한다.
HEAD가 현재 작업 중인 branch나 commit을 가리키며, 현재 작업 중인 상태를 나타낸다.
로그를 확인하면 첫 번째 commit ID가 (HEAD -> main)
인 것을 확인할 수 있다. 이 의미는 해당 commit이 main branch가 가르키고 있는 버전이고 HEAD가 여기에 위치한다는 것은 현재 작업 중인 branch가 main branch이며, 해당 commit에서 작업을 진행 중이라는 의미이다.
만약 C1인 특정 commit ID를 지정하여 checkout을 실행하면 HEAD가 해당 commit을 가리키게 된다.
프로젝트 개발을 하다보면 코드를 여러개로 복사해서 작업하는 경우가 많이 생긴다.
Git Branch
는 원래 코드를 복사하여 독립적으로 작업할때 사용한다.
참고: Remote + Local Branch 예시
Local repository에서 생성한 branch 목록을 보여준다.
git branch
Branch는 local과 remote가 별도로 관리를 한다. 따라서 local에만 만들어 놓고 쓸수가 있고, 내가 만들어서 쓰던 branch를 remote에 공유해줄수도 있다. 그래서 local의 branch 상태와 remote의 branch 상태가 달라질 수 있다.
git branch -r
Local과 remote branch 모두 보고싶으면 -a
을 쓰면 된다.
git branch -a
local값과 remote값이 구분되어 보여진다.
기본적으로 branch 생성은 local repository에 생성이 된다. 중요한 점은 현재 있는 시점에서 branch를 낸다.
git branch <branch_name>
Local에서 만든 건데 remote repository에 공유를 하려면 branch를 따로 서버에 배포해주면 된다.
git push origin <branch_name>
잘못 만들거나 삭제가 필요한 경우 다음과 같은 명령어를 쓰면되지만 remote에 배포를 했더라고 local꺼만 지워진다. Local에서 관리하는 것과 remote에서 관리하는게 다르기 때문이다.
git branch --delete <branch_name>
Remote에서도 지워줘야 local과 remote branch 둘다 지워진다.
git push origin --delete <branch_name>
git checkout <branch_name>
1) GitHub 로그인
2) New repository
버튼 클릭
3) Repository name
입력
4) Private
선택
5) Add a README file
선택
6) Create repository
버튼 클릭
6) HTTPS 주소 복사
여기서 참고로 repository 기본 branch를 main에서 다른걸로 변경하고 싶으면 다음과 같은 프로세스를 따라하면 된다.
1) GitHub에서 user
아이콘 클릭
2) Settings
클릭
3) 왼쪽 메뉴에서 Repository
클릭
4) Repository default branch
변경
1) Terminal 실행
2) Query 입력
remote_project % cd ..
git_ws % git clone https://github.com/yeji4175/branch_project.git
git_ws % cd branch_project
branch_project % git status
On branch main
의 뜻은 메인 branch 하나가 있는데 HEAD가 main을 가르키고 있다라는 뜻이다.
Remote에는 origin/main이 있다.
README.md 파일이 remote의 메인과 local의 메인이 가르키고 있는 상태이다.
branch_project % ls
branch_project % git branch #Local branch 목록 보여주기
* main
이라는 local branch 목록을 보여주고 있는데 기본값으로 main이 하나가 있고, *는 현재 여기를 HEAD가 가르키고 있으며 메인 branch 상에 머무르고 있다라고 보여주고 있는거다.
branch_project % git branch -r
branch_project % git branch -a #전체보기
전체보기를 하면 local branch인 * main
이 보이며, remote branch 정보는 remotes/
로 보이며 local과 remote를 쉽게 구분할 수 있게 정보를 확인할 수 있다.
위의 정보들을 git log를 통해서도 확인할 수 있다.
branch_project % git log
git log
를 입력하면 commit에서 local의 HEAD가 main을 가리키고 있고, remote의 main 및 HEAD도 해당 commit을 가리키고 있다라는 걸 알 수 있다.
branch_project % touch file1.py #빈 파일 만들기
branch_project % git add file1.py
branch_project % git commit -m "add file1"
branch_project % ls #현재 버전 상태 확인
만약 아래와 같이 빈 파일을 add, file1.py로 잘못 생성하면add라는 파일은 unstaged 상태이기에 바로 지워줄 수 있다.
branch_project % touch file2.py
branch_project % git add file2.py
branch_project % git commit -m "add file2"
branch_project % git log
branch_project % ls
branch_project % git branch dev #local에 dev branch 생성
branch_project % git branch
branch_project % git log --oneline
branch_project % git checkout dev
branch_project % git branch
git checkout dev
명령을 하는 순간 main을 가리키던 HEAD는 dev를 가리키게 된다.
git branch
명령을 쓰면 *
가 dev 앞에 붙어있는 걸 확인할 수 있다.
branch_project % touch file3.py
branch_project % git add file3.py
branch_project % git commit -m "add file3"
branch_project % ls
branch_project % git checkout main
branch_project % ls
4.6에서 file3.py를 추가했지만 main branch로 이동했기에 file3.py이 보이지 않는다.
branch_project % git branch
branch_project % cat > file1.py
print("Hello, Branch.") #ctrl+D
branch_project % cat file1.py
branch_project % git commit -a -m "modify file1"
branch_project % git status
branch_project % git log --oneline
branch_project % git checkout dev
branch_project % git log --oneline
branch_project % git branch -a
branch_project % git push origin dev
branch_project % git branch -a
dev branch를 remote로 배포한 이후로 remote에도 dev가 잘 배포된걸 확인할 수 있다.
GitHub를 새로고침하면 branch_project에서 dev가 잘 배포된걸 확인할 수 있다.
dev를 클릭하면 아래 이미지와 같이 local repository 상태가 반영이 된걸 확인할 수 있다.
main도 똑같이 remote repository에 배포를 하면 다음과 같이 query를 입력하면 된다.
branch_project % git push origin main
main branch가 remote repository에 잘 배포되었는지 확인을 하고 싶으면 GitHub의 branch_project를 새로고침하면 된다. 그럼 local repository 상태가 반영이 된걸 확인할 수 있다.
branch_project % git checkout -b dev2
#-b 옵션을 사용하여 간단하게 dev branch를 만들고 해당 dev branch로 이동
branch_project % git branch
branch_project % git push origin dev2
branch_project % git branch -a
GitHub를 새로고침하면 remote에도 dev2 branch가 잘 배포되어 있는걸 확인할 수 있다.
branch_project % git branch --delete dev2
하지만 위의 이미지와 같이 에러가 뜬다. 이 에러는 dev2 branch에서 dev2를 삭제가 안되니 다른 branch로 이동 후 삭제하라는 뜻이다.
branch_project % git checkout main
branch_project % git branch --delete dev2
여기 이미지 필요
main branch로 이동을 한 후 다시 dev2 branch를 삭제하려고 해도 다음과 같은 에러가 뜬다. 이 의미는 아직 제대로 병합되지 않았다고 한다. 왜냐하면 dev2 branch는 비어있는 상태로 최초의 상태에서는 --delete
로 삭제가 불가능하며 -D
로 삭제가 가능하다.
내가 위의 방법을 따라했을 때는 에러가 안나고 잘 지워졌다.
branch_project % git branch -D dev2
branch_project % git status
branch_project % git push origin --delete dev2
branch_project % git branch -a
GitHub에서 branch_project를 다시 새로고침하면 remote repository에도 dev2 삭제가 반영되어있는걸 확인할 수 있다.