git의 공식 매뉴얼을 확인하고 싶으면 pro Git 요기서 확인할 수 있다. 한국어도 지원되니 조금 더 이해하기 편할 것 같다.
branch를 만든다 - 작업을 진행하다가 필요에 의해서 작업이 분기되는 현상
각각의 branch는 client에게 제공하는 branch / 원래 있었던 작업 파일 branch로 나뉘어짐.
branch - 내가 하던 작업에서 따로 분리해서 버전관리가 필요한 경우 branch를 생성 한 뒤 작업을 함.
어떤 branch가 있는지 확인하고, 생성하고, 여러 branch를 옮겨다닐 수 있는 명령어들을 확인해보자.
git branch
명령어를 실행할 경우 * master
와 같은 메세지를 확인할 수 있는데 *
는 현재 내가 사용하고 있는 branch의 이름을 나타내준다. 따라서 * master
는 지금 master
라는 branch를 사용하고 있다. 라는 뜻이다.
이 상태에서 새로운 branch를 만들어 주기 위해 다음의 명령어를 입력하면 된다.
git branch "생성하고자 하는 branch의 이름"
위 명령어를 실행한 후 다시 git branch
명령어를 입력하면 최초 자동으로 생성 된 master
와 내가 방금 생성한 이름의 branch가 있다. 아직은 master
branch를 사용중이기 때문에 *
가 master
앞에 붙어있다. 이제 새로 생성한 branch를 사용해보자.
git checkout "생성한 branch 이름"
'master
에서 checkout
하고 새로운 branch로 이동하겠다.' 의 정도로 이해하면 될 것 같다.
위 명령어를 입력한 뒤 다시 git branch
로 현재 상태를 확인해보면 *
가 내가 생성한 branch로 옮겨간 것을 확인할 수 있다. 이제 master
가 아닌 새로운 branch를 사용할 수 있다. 새로운 branch를 생성한 경우 기존 master
에 있던 상태를 전부 그상태 그대로 복사해서 새로운 branch를 만드는 것이다.
( branch를 생성하고 바로 그 branch에 checkout하려면
git checkout -b "name"
으로 한번에 할 수 있다! )
branch는 작업을 분기해서 관리하기 때문에 현재 어떤 상황인지에 대한 확인할 수 있어야하기 때문에 branch의 정보들을 확인하는 작업이 꼭 필수적이다. 어떻게 branch의 정보를 확인할 수 있는지 알아보자.
위의 단계에서 새로운 branch를 만들었다. 나는 이 branch의 이름을 exp
라고 만들었기 때문에 앞으로는 exp
라고 쓰겠다. 이제 master
와 exp
branch간의 차이점을 확인해보자. git log
명령어로 여러가지 로그들을 확인할 수 있지만 branch에 대한 정보를 얻기에는 부족하다. 그렇기 때문에 다음의 명령어를 입력해보자.
git log --branches --decorate
위의 명령어는 현재 자신이 checkout 되어있는 branch말고 이 저장소에 있는 모든 branch를 보여준다.
출력창의 우측을 확인해보면 (master)
와 같은 문구가 생성되었다. 이는 master
branch에서 가장 최근 커밋이 2
라는 뜻이고, 그 상단에 exp
는 exp
branch의 가장 최근 커밋은 4
라는 뜻이며 HEAD
는 현재 exp
라는 branch에 checkout 되어 있다. 라는것을 알려준다. 이것만으로도 무언가 눈에 확 띄지 않는다면 다음 문구를 추가해서 입력햅자.
( 어떤 차이가 있는지 확인하기 위해 git log --branhes
와 git log --branches --decorate
를 각각 입력해보았는데 결과는 똑같이 출력됐다. 업데이트됐나 싶다.😅 )
git log --branches --decorate --graph
위 명령어를 입력하면 출력창의 좌측에 빨간색 줄이 보인다.
이것은 흐름을 보여주는것인데 이상태로는 그냥 일직선으로만 느껴지니 무슨 차이가 있나 싶다. 그렇기 때문에 효과를 느끼기 위해서는 여러개의 branch가 각각의 길을 걷고 있을 때 이 차이가 눈에 확연히 드러난다. master
branch에 새로운 커밋을 만들어보자.
하나만 추가했더니 큰 차이가 느껴지진 않지만, 중간에 분기점이 생겼고 줄의 색깔도 좀 변했다. 이런식으로 여러개의 branch가 커밋의 양이 많아진다면 --graph
를 사용하면 훨씬 가시적으로 확인할 수 있을 것 같다. 이것보다 조금 더 축약적으로 한눈에 들어오는 정보가 필요하다면
git log --branches --decorate --graph --oneline
--oneline
을 추가해주자. 그렇다면 훨씬 축약적으로 한눈에 모든 정보를 나타내주는것을 확인할 수 있다.
branch간의 어떠한 차이점이 있는지를 확인하기 위해서는
git log master..exp
이렇게 비교하고 싶은 branch의 이름을 ..
을 사이에 두고 입력해주면 된다. 여기서 주의해야할 점은 입력하는 branch의 순서이다.
git log A..B
의 경우 branch A
에는 없고 B
에는 있는것들을 보여준다. 하지만 반대로
git log B..A
로 입력하면 branch B
에는 없고 A
에는 있는것들을 보여준다.
git log -p A..B
의 명령어를 입력하면 각 branch의 소스코드별로 차이점도 함께 확인할 수 있다.
만약 branch의 현재 상태를 비교하고 싶다면 다음의 명령어로 비교할 수 있다.
git diff A..B
작업을 분기를 해서 각자의 작업이 각각의 히스토리를 만들어가고 있었는데 어느 시점에서 이 작업들을 병합해야하는 경우가 발생할 수 있다. 이런 경우 사용되는게 branch 병합이다. 현재 exp
에 있던 내용을 master
에 병합해보도록 하자.
master
로 병합을 할 예정이기 때문에 먼저 master
로 checkout을 한 뒤 merge
라는 명령을 해준다.
관계에 유의하도록 하자.
A
로 병합하려면A
로 checkout을 하고 병합 할 branch(B)를merge
시켜주는거다.
git merge exp
이렇게 하면 에디터가 열리면서 Merge branch 'exp'
라는 내용의 커밋이 만들어지는것이다.
로그로 확인해보면
조금 더 가시적으로 성공적으로 병합된것이 눈에 보인다.
이 작업으로 5
의 내용을 가진 부모와 3
의 내용을 가진 부모. 이렇게 두개의 부모를 가진 새로운 커밋이 생성 된 것이다. 같은 방법으로 exp
로 checkout 한 뒤 다음의 명령어를 입력하면
git merge master
이제 master
와 exp
는 완전히 동일한 내용을 가진 파일이 된다. 그렇기 때문에 exp
브런치를 삭제해보자.
git branch -d exp
exp
자리에는 삭제하고싶은 branch의 이름을 적어주면 된다. 그렇게 하면 branch가 삭제되었다는 메세지가 출력되고, 다시 로그를 확인해보면 exp
라는 branch가 사라진것을 확인할 수 있다.
master
브런치에서 f1.txt 라는 파일을 만들었다. 그리고 exp
라는 브런치를 생성한 뒤 checkout하고 exp
브런치에서 f1.txt파일을 수정하다가 master
브런치로 옮겨야할 경우 master
로 checkout하고 git status
를 확인해보면 exp
브런치에서 작업한 내용이 master
브런치까지 영향을 미치는것을 확인할 수 있다.
그럼 아직 수정이 끝나지 않아서 커밋하기도, checkout하기도 애매한 경우 사용되는것이 stash!
git stash or git stash save
git stash
만 명령을 줘도 되고 조금 더 명확하게 git stash save
라고 명령을 주어도 된다.
명령을 주면 성공적으로 저장이 되었다는 메세지가 출력되고 status
를 확인해보면 커밋할 작업 내용이 없다고 출력된다. 성공적으로 파일이 숨겨진 것이다.
이제 숨긴 파일을 다시 꺼내서 작업을 하려는 경우 에는
git stash apply
apply
를 통해 숨겼던 파일을 다시 꺼내온 뒤 status
를 확인해보면 숨겼던 f1.txt가 다시 모습을 드러낸 것을 확인할 수 있다.
reset
을 한 경우 다시 복원할 수도 있다.
git reset --hard
git stash apply
git stash list
명령어를 통해서 branch가 갖고 있는 일종의 주소값을 확인할 수 있고, 이 주소값에서 명시적으로 사용자가 삭제해주지 않는 이상은 apply
를 통해 복구가 가능하다.
apply
를 사용했을 때 stash
는 list
중 가장 위에 있는 상태를 기준으로 복원한다!
여러개의 stash list
중에서 가장 위의 상태로 복원하기 때문에 여러개의 list
가 있으면 복원할 시점이 상당히 복잡히 느껴질수도 있다. 그렇기 때문에 이러한 list
를 삭제하는것의 필요성도 느껴진다. list
를 삭제하기 위해서는
git stash drop
의 명령어로 가장 위에 있는 list
가 삭제된다.
두개의 명령어를 치기는 상당히 번거롭기 때문에 한번에 위의 동작을 수행해주는 명령어가 있으면 상당히 유용할거라 생각된다.
git stash pop
위 명령어를 입력하면 apply
함과 동시에 drop
의 기능까지 한번에 수행한다.
✅ 한가지 확인해야할 점은 git stash
기능은 파일이 Untracked
상태에서는 수행을 하지 않는다. stash
기능을 사용하려면 버전 관리가 되고 있는 상태여야지만 기능을 사용할 수 있다.