지옥에서 온 Git(3)
branch 만들기
- branch는 작업을 분기해서 처리하기 위한 명령어
- 브랜치의 목록을 볼 때
git branch
git branch "새로운 브랜치 이름"
# 새로운 브랜치를 생성하면 생성 시기에 속해 있던 브랜치의 상태를 그대로 복사해서 가져감
git checkout "전환하고자 하는 브랜치 이름"
git branch -d "삭제하고자 하는 브랜치 이름"
# 병합되지 않은 브랜치를 강제 삭제할 때
git branch -D "삭제하고자 하는 브랜치 이름"
git checkout -b "생성 및 전환할 브랜치 이름"
branch 정보 확인
git log "비교할 브랜치 A".."비교할 브랜치 B"
# 브랜치 A에는 없고 브랜치 B에는 있는 것들을 표기
git log --all
or
git log --branches
# --decorate는 기본 옵션으로, 브랜치 명을 표시하지 않기 위해서는 --no-decorate 옵션을 붙여주어야 함
- 로그에 나타는 모든 브랜치들을 그래프화 하고자 할 때
git log --all --graph
# --oneline 옵션을 추가해주어 더 간략하게 볼 수도 있음
git diff "비교할 브랜치 A".."비교할 브랜치 B"
branch 병합
- A 브랜치로 B 브랜치를 병합할 때 (B -> A)
git checkout A
git merge B
- merge 이후에는 -d 옵션으로 브랜치의 삭제가 가능
branch와 merge
- Fast-Forward: 별도의 commit을 생성하지 않고, master가 가리키는 commit을 바꾸는 방식
- Recursive startegy: 같은 조상에서 분기된 브랜치 A가 조상 commit으로 부터 변화가 생겼으면 'Fast-Forward'방식을 사용할 수 없음. 따라서 별도의 commit을 생성하여 merge하게 됨
- cf. A가 가리키는 commit + B가 가리키는 commit + 공통의 조상 commit. 총 3개의 commit이 3-way Merge를 수행
branch 충돌 해결
- 같은 파일임에도 수정한 위치가 다르다면 자동으로 합쳐버림
- 즉, 브랜치 A에서 소스코드 상단을. 브랜치 B에서 하단을 수정하여 Merge하게 되면 Auto-Merging이 가능
- 그러나, 수정한 위치가 같으면 충돌이 발생
- 충돌난 소스코드 부분을 사용자가 직접 수정하여 충돌의 해결이 가능
stash
- branch를 이용하여 작업을 하던 중 현재 branch에서 작업이 끝나지 않았는데 다른 branch로 checkout을 해야 하는 경우에 사용
- commit을 해주지 않고 checkout을 할 경우 branch에서의 작업이 이동한 branch에 까지 영향을 미침. 그러나, 아직 작업 중인 것을 commit 하기에는 애매하기 때문
- git stash의 적용
git stash apply
- stash list에 있는 stash 기록은 사용자가 명시적으로 삭제하지 않는 한 계속 존재함
- 즉, git reset --hard를 통해 stash가 적용된 상황으로 돌아가더라도 stash 해두었던 기록은 계속 남아있음
- git stash list를 통해 stash 한 기록을 볼 수 있음
- git stash apply는 stash list 중 항상 가장 위에 있는 stash를 불러옴
- 따라서, stash를 불러온 후 다음 stash를 불러오기 위해서는 이미 불러온 stash를 삭제해 주어야 함
git stash apply; git stash drop
or
git stash pop
- stash는 최소한 버전 관리가 되고 있는 파일에 대해서만 적용이 가능함
- 즉, add 되지 않은 파일에 대해서는 stash의 적용이 불가