Git, GitHub 시작하기-2
1번을 보고왔다면 아래 그림 처럼 커밋을 쌓아가면서 작업을 하는 방법을 배웠습니다.'
이번에는 아래 그림처럼 여러명이 같이 작업 할 때 많이 사용되는 branch에 대해서 알아보겠습니다. branch는 아래 그림에서 고양이와 문어가 커밋3을 이어서 동시에 작업을 하기 위해서 특정 기준에서 줄기를 나누어 작업할 수 있는 기능을 branch라고 합니다.
이전 1번 자료에서 아래와 같이 main이라는 branch를 사용했죠? github에서 처음 repo를 만들면 main이라는 branch를 자동으로 만듭니다.
master인 사람도 있을텐데 옛날에 master였는데 main으로 바뀌었어요 그래서 아직 master로 되어있는 사람은 main으로 바꿔서 사용하는 걸 추천합니다. master가 인종차별적인 어떤 무언가가 있는 걸로 알고있어요 궁금하면 개인적으로 찾아보세요 ㅎㅎㅎ
$ git push origin main # git push <원격저장소이름> <브랜치명>
아무튼 핵심은 처음에 자동으로 main branch가 생겨서 지금까지 main에서 작업을 했는데 동시에 작업을 하게 되면 branch를 만들어서 나누어져 작업을 합니다.
그래서 나눠지고 다시 합치고 이런 작업이 필요해요.
그래서 여러명이 협력할 때 어떻게 이름을 만들고 어떻게 진행할지 브랜치 규칙을 만든다고 합니다. 아래는 책에 소개된 규칙입니다.
- [master] 브랜치에는 직접 커밋을 올리지 않는다.(동시에 작업하다 꼬일수 도 있으니).
- 기능 개발을 하기 전에 [master] 브랜치를 기준으로 새로운 브랜치를 만든다.
- 이 브랜치 이름은 [feature/기능이름] 형식으로 하고 한 명만 커밋을 올린다.
- [feature/기능이름] 브랜치에서 기능 개발이 끝나면 브랜치에 이름을 합친다.
- 사례
프로젝트의 특성이나 규모에 따라서 브랜치 전략이 다를텐데 왼쪽과 같이 간단하고 편하게 사용할 수 있고 오른쪽과 같이 복잡하지만 체계적으로 사용할 수도 있습니다.
오른쪽에 나와있는 브랜치 전략에 사용되는 브랜치 5개가 있습니다.
main
: 라이브 서버에 제품으로 출시되는 브랜치.develop
: 다음 출시 버전을 대비하여 개발하는 브랜치.feature
: 기능 개발 브랜치.develop
브랜치에 들어간다.release
: 다음 버전 출시를 준비하는 브랜치.develop
브랜치를release
브랜치로 옮긴 후 QA, 테스트를 진행하고main
브랜치로 합친다.hotfix
:main
브랜치에서 발생한 버그를 수정하는 브랜치.
하지만 우리는 먼저 쉬운 왼쪽같은 방법으로 진행해보겠습니다. 우리의 규칙은 간단하게 책에나온 1234처럼 main브랜치에서 흩어져서 기능개발을 하고 main로 돌아온다.
이전에 만들어 놓은 about-page.txt파일이 아래와 같이 저장되어 있습니다. 한사람은 1.history에 기능을 추가하고 다른 사람은 2. goal에 기능을 추가한다고 생각하고 진행해보겠습니다.
이렇게 두사람이 생각하고
각자 branch를 만들어줍니다.
$ git branch feature/history
$ git branch feature/goal
이 상태에서 현재 상태를 보려면 이렇게 git log를 봅니다. —graph 옵션을 추가해주면 graph로 볼 수 있습니다. 좀 더 이쁘게 보려면
$ git log --graph
vscode에서 git graph 설치하면 볼 수 있습니다.
보면 위에서 2,3,4번 log는 제가 github에서 파일을 만들어서 자동으로 생긴것 같아서 신경안쓰셔도 될 것 같고. 네모난 상자를 봅시다.
main | origin, feature/history, origin/HEAD 이렇게 세개가 있네요. 일단 3개다 branch를 의미하고
|orgin으로 되어 있는 첫번째 것은 remote repo를 의미합니다. 그리고 HEAD는 현재 우리가 보고 있는 위치입니다.
지금 이 상태에서 파일을 수정하고 커밋하면 바로 마스터 branch에 적용됩니다. branch를 새로만든 feature 브랜치로 이동해서 작업을 하겠습니다.
브랜치를 바꾸는 명령어는 checkout입니다.
브랜치를 이동하기도하고 커밋을 이동할 수 도 있습니다.
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining (main)
$ git checkout feature/history
Switched to branch 'feature/history'
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining (feature/history)
우측 괄호가 (main)에서 (feature/history)로 변경되었네요 이게 현재 위치한 브랜치를 의미합니다.
그럼 다른 두 폴더에서 각자의 파일을 아래와 같이 수정해보겠습니다.
이렇게 두곳을 보면 변경된 사항 생겼습니다. 이전에 했던 것 처럼 add, commit해줄 건데 잘 보면
메시지('feature/history'에서 커밋할....)이렇게 써있고 그 옆에도 현재 자신의 브랜치가 어떤것인지 알려주고 있습니다.
터미널에서 보면 변경 사항을 확인할 수 있습니다.
$ git status
양쪽다 remote에
올려 보겠습니다. (코드는 한쪽 것만 가져왔습니다)
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining2 (feature/goal)
$ git add .
$ git commit -m "goal 내용추가"
$ git push origin feature/goal
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 344 bytes | 344.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local
object.
remote:
remote: Create a pull request for 'feature/goal' on GitHub by visiting:
remote: https://github.com/hufs-pnp/gitTraining/pull/new/feature/goal
remote:
To https://github.com/hufs-pnp/gitTraining.git
* [new branch] feature/goal -> feature/goal
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining2 (feature/goal)
$
1번 페이지에서 git push origin main을 했지만 우리가 정한 규칙에서 main에 직접 커밋하지 않는다 라고 했기 때문에 자신의 다른 브랜치 이름을 적어주면 remote에 그 이름의 branch를 만들어서 업로드해줍니다.
이렇게 변경사항이 뜨고 branches를 확인해보면 3개가 된 걸 볼 수 있네요.
그럼 내 로컬에서 main 브랜치는 어떤 상태일 까요.
다시 main으로 이동해보겠습니다. 아래 명령어 처럼 할 수도 있고 vscode에서 소스제어 부분에서 브랜치 이름을 클릭하면 아래 사진처럼 나옵니다.
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining (feature/history)
$ git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining (main)
그리고 파일을 확인해보면 수정하지 않았던 시절로 돌아왔습니다. 다시 작업중인 브랜치고 가서
그래프를 확인해보면 아래처럼 가지가 갈라져서 main은 뒤에 있고 앞에 두개가 따로있습니다.
두개의 폴더에 모두 branch가 갈라져 있고 동그라미로 현재 자신의 위치가 표시되어 있습니다.
이제 서로 다른 두 branch를 합쳐보겠습니다.
main branch에 합칠 것이기 때문에 다시 main으로 체크아웃하고 feature/history와 합치겠습니다.
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining (feature/history)
$ git checkout main
...
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining (main)
$ git merge feature/history
Updating 6aeef22..6e01ee1
Fast-forward
about-page.txt | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining (main)
이렇게 main이 history와 같은 것을 가리키고 있습니다. 이제 완성한 history 브랜치는 없애겠습니다.
gui로 해도 되고 아래 명령어로 해도 되고 이제 한쪽에서는 작업이 끝났 으니 remote에 push 합니다.
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining (main)
$ git branch -d feature/history
Deleted branch feature/history (was 6e01ee1).
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining (main)
$ git push origin main
branch를 지웠는데 origin/feature/history가 남아있는 것을 보니 remote에는 남아있군요 우클릭해서 지워줍니다.
이제 feature/goal과 merge해야되는데 그쪽 상황을 보면 아직 아무것도 상황이 변하지 않았습니다. 그래서 push하거나 merge할 때 미리 pull을 한번 하고 merge를 하는게 좋습니다.
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining2 (feature/goal)
$ git checkout main
Switched to branch 'main'
Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining2 (main)
$ git pull origin main
From https://github.com/hufs-pnp/gitTraining
* branch main -> FETCH_HEAD
Updating 6aeef22..6e01ee1
Fast-forward
about-page.txt | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining2 (main)
$ git merge feature/goal
Auto-merging about-page.txt
Merge made by the 'recursive' strategy.
about-page.txt | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
merge하러 main으로 checkout해보면 친절하게도 변경사항이 있다고 pull 하라고 알려줍니다. 그 다음에 merge를 해주면 이렇게 두 파일이 합쳐집니다. 이제 여기도 branch 삭제하고 remote에 push 해주겠습니다.
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining2 (main)
$ git push origin main
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 358 bytes | 358.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/hufs-pnp/gitTraining.git
6e01ee1..422e633 main -> main
user@pnp-windows00 MINGW64 ~/Workspace/pnp/gitTraining2 (main)
$ git branch -d feature/goal
Deleted branch feature/goal (was 9a1a1a2).
이렇게 두개의 기능이 합쳐졌습니다. 이렇게 서로 충돌하지 않고 병합이 되면 참 좋겠지만 잘 못해서 서로 공통된 부분을 수정하면 충돌이 발생합니다.
이렇게 충돌이 난 상황이라고 하면 위에 accept current ..... 와 같은 메뉴 들 중 클릭할 수도 있지만 <≤==⇒> 자동으로 생긴 기호들을 지우고 내용정리하면 됩니다. 그리고 변경내용 스테이징하고 다시 커밋해줍니다. 그럼 끝. 별로 어렵지 않습니다. vscode나 다른 프로그램들이 쉽게 해결도 어렵지 않게 해결할 수 있습니다.
'PnP > Git' 카테고리의 다른 글
Git, Github 시작하기-4 (1) | 2021.10.28 |
---|---|
Git, Github 시작하기-3 (0) | 2021.10.26 |
Git, GitHub 시작하기-1 (0) | 2021.10.19 |
Github commit (0) | 2021.06.29 |
Github 프로필 (0) | 2021.06.29 |