Branch, HEAD, git branch(생성, 삭제, 이름 변경), 브랜치 이동(git checkout, git switch)
git에서 commit을 하면 commit은 숫자와 문자가 연속적으로 조합된 특이한 해시를 갖습니다.
현재 커밋은 이전 커밋(부모 커밋)을 참조합니다.
기본적인 커밋은 직선 형태를 띕니다.
각각의 작업은 서로 영향을 미치지 않고 독립적으로 이루어져야 합니다.
그런데 다른 사람들이 동시에 작업을 한다면,
위와 같이 순차적인 형태의 커밋 구조는,
병행 작업한 코드를 병합하거나 최신화하는 등 형상 관리에 어려움이 있을 것입니다.
이 때 필요한 것이 Branch(브랜치)입니다.
Branch
Branch는 깃의 가장 특정적인 기능이며 일종의 타임라인입니다.
사용자가 원할 때마다 별도의 콘텍스트를 생성할 수 있게 해줍니다.
(각 Branch는 독립된 컨텍스트를 갖습니다.)
한 브랜치에서 진행되는 작업은, (결합하기 전까지) 다음 브랜치에 영향을 미치지 않습니다.
위 예제에서 다른 작업자가 작업한 각 branch(fix, hotfix 등)는 main branch에 병합하기 전까지,
main branch에 영향을 주지 않습니다.
사용자가 원하는 시점에 brach를 병합합니다.
git init을 사용하여 초기화하면 생성되는 브랜치는 master입니다.
(깃허브에선 main을 사용하고 있습니다)
브랜치 별 기능 차이는 없으나 main, master 브랜치에 원본 코드를 두고 병합하는 것은 관례입니다.
HEAD
HEAD는 브랜치 포인터에 대한 레퍼런스 포인터입니다.
브랜치 포인터는 현재 브랜치가 있는 위치입니다.
(HEAD는 브랜치 레퍼런스를 가리키는 것으로,
Repository에서 현재 사용자의 위치를 가리키는 포인터입니다)
HEAD는 언제나 main(master) branch에서 가장 최근에 커밋한 브랜치를 가리킵니다.
각 브랜치는 브랜치 레퍼런스를 가지고 있습니다.
브랜치 포인터들은 각기 다른 커밋을 가리키고 있고,
HEAD를 움직여서 다른 브랜치로 전환할 수 있습니다.
.git 디렉토리의 HEAD를 보면 HEAD가 참조하고 있는 브랜치를 알 수 있습니다.
각 파일은 커밋해시를 담고 있습니다.
git log로 확인해보면, HEAD가 가리키는 브랜치의 커밋해시와 일치하는 것을 볼 수 있습니다.
.git디렉토리의 HEAD에는 참조 경로가 있고,
heads 디렉토리의 각 브랜치 이름 파일에는 commit Hash가 담겨있습니다.
Git Branch;
git branch
git branch 명령어를 사용하여 브랜치 목록을 확인합니다.
또한 브랜치를 생성 또는 삭제할 수 있습니다.
git branch
git branch <branch-name>
git branch <생성할 브랜치 이름> 명령어를 사용하여 브랜치를 생성할 수 있습니다.
(생성한 브랜치로 이동하는 것이 아닙니다)
(브랜치 이름에 공백을 포함하면 안됩니다)
git branch <branch-name>
git branch fix
git branch fix로 fix 브랜치를 생성하고, git branch로 브랜치 목록을 확인합니다.
현재 사용자의 HEAD는 *이 표기된 master branch를 가리키고 있습니다.
git log 명령어를 입력하면,
현재 master, fix 2개의 브랜치가 있으며,
HEAD는 master를 가리키고 있는 것을 다시 한 번 확인할 수 있습니다.
git switch fix 명령어를 사용하여 fix 브랜치로 이동하면
위와 같이 HEAD가 fix를 가리키는 것을 볼 수 있습니다.
fix에서 어떠한 작업도 수행하지 않았기에,
fix와 master의 레퍼런스 포인터가 동일한 커밋을 가리키고 있습니다.
만약 fix에서 새로운 commit을 실시하면 아래와 같이 변경되는 것을 확인할 수 있습니다.
다시 master 브랜치로 switch하면 HEAD는 master를 가리킵니다.
git branch -d <branch-name>, git branch -D <branch-name>
git branch -d(또는 --delete ) <branch-name> 을 통해 브랜치를 삭제합니다.
git branch -d <branch-name>
git branch -delete <branch-name>
git banch -D <branch-name> 을 통해 브랜치를 강제 삭제합니다
git branch -D는 git branch -d -f 와 같습니다.
(혹은 --delete --force)
(-f, --force)
git branch -D <branch-name>
git branch -d -f <branch-name>
현재 보고 있는 브랜치를 삭제할 수는 없으므로,
git switch또는 git checkout 으로 브랜치 이동 후 삭제합니다.
git branch -m <new-name>, git branch -M <new-name>
git branch -m (또는 --move) <new-name> 을 통해, 현재 위치한 브랜치 이름을 변경할 수 있습니다.
git branch -m <new-name>
git branch --move <new-name>
git branch -M (또는 --move --force) 을 통해, 현재 위치한 브랜치 이름을 강제로 변경할 수 있습니다.
(-f, --force)
git branch -M <new-name>
git branch --move --force <new-name>
브랜치 이동(git checkout, git switch)
브랜치 이동에 사용하는 명령어는 git checkout, git switch가 있습니다.
두 명령어 모두 브랜치를 이동하는 데 사용할 수 있지만,
git checkout은 작업트리를 복원하는 기능도 있습니다.
checkout은 다양한 기능이 있습니다.
(최근 각 기능별 명령어를 사용하도록 지향하는 추세입니다)
git switch -c <new-branch> git checkout -b <new-branch>
git switch의 -c 옵션, git checkout -b 옵션을 사용하면 새로운 브랜치를 생성하고 새 브랜치로 이동시킬 수 있습니다.
git switch -c <new-branch>
git checkout -b <new-branch>
git switch -c hot-fix 를 통해 hot-fix 브랜치를 생성하고 이동해보겠습니다.
git checkout -b features 를 통해 features 브랜치를 생성하고 이동해보겠습니다.
브랜치를 이동할 때, 작업 중인 파일을 Stash 하거나 Commit 하지 않으면,
작업 중인 파일이 사라질 수 있으므로 주의합니다.
git switch -
git switch -
git switch - 명령어를 사용하면 직전 branch로 돌아갑니다.
Branch 명령어 연습
1. Restaurant 디렉토리를 생성하고 git repository로 초기화합니다.
mkdir Restaurant
cd Restaurant
git status
git init
2. order.txt 파일을 생성하고 커밋합니다.
touch order.txt
git add order.txt
git commit -m "create order"
3. table1 브랜치를 생성-이동합니다
git switch -c table1
4. order.txt 내용에 water를 추가, 커밋합니다.
vim order.txt
git add order.txt
git commit -m "order water"
5. master 브랜치로 이동한 뒤, table2 브랜치를 생성-이동합니다.
git switch master
git checkout -b table2
7. order.txt 내용에 rice를 추가, 커밋합니다.
nano order.txt
git add order.txt
git commit -m "order rice"
8. table2브랜치를 기반으로 table3 브랜치를 생성-이동합니다.
git branch table3
git switch table3
9. order.txt 아래에 pizza를 추가-커밋합니다.
code order.txt
git add order.txt
git commit -m "order pizza"
10.table2브랜치를 제거합니다.
git branch -d table2
11. 브랜치 목록을 확인합니다.
git branch
'SCM > Git' 카테고리의 다른 글
[Git & GitHub 5] git diff (0) | 2024.05.09 |
---|---|
[Git & GitHub 4] git merge, merge commits, resolving merge conflicts (0) | 2024.05.05 |
[Git & GitHub 3] Atomic Commits, Commit Message (0) | 2024.05.04 |
[Git & GitHub 2] git init, git status, git add, git commit [-m] [--amend], git log [--pretty], .gitignore (0) | 2024.05.03 |
[Git & GitHub 1] Git 설정(이름, 이메일), GitKraken 설치 (0) | 2024.05.03 |