티스토리 뷰
Git을 사용하여 여러 사람이 동시에 다른 작업을 각자의 저장소에서 진행할 수 있다. 그 과정을 brnach를 나누어 수행해보겠다.
*새 branch 생성하기
먼저 Remote Repository를 clone으로 가져와서 task1, task2라는 2개의 branch를 더 생성하고 task1 branch로 이동한다.
$ git branch task1
$ git branch tast2
$ git checkout task1
$ git branch
master
*task1
task2
현재 상태를 도식화 하면 다음과 같다.
*Task1 작업 수행
task1에서 README.md 파일에 추가로 텍스트를 입력한 후 commit을 진행해 보겠다.
$ vi README.md
[README.md 파일 수정...]
$ git add README.md
$ git commit -m "add 'do work'"
작업을 수행하고 다음과 같이 commit을 진행하면 파일이 변경된 것을 확인할 수 있고 이를 도식화하면 다음과 같다.
*Task2 작업 수행
이번에는 task2 branch로 이동해서 같은 README.md 파일을 수정해보겠다. 아직 merge를 하지 않은 상황이기 때문에 위에서 추가한 내용은 master와 task2 branch에는 반영되지 않은 상태이다.
$ vi README.md
[README.md 파일 수정...]
$ git add README.md
$ git commit -m "add 'merge'"
commit까지 완료하고 난 파일의 상태와 이를 도식화한 결과는 다음과 같다.
이렇게 하면 각자 자신의 독립된 저장소에서 각자의 일을 수행한 것을 볼 수 있다. 이제 이 두 branch를 병합해보겠다.
*Merge 하기
먼저 작업을 끝낸 task1 branch에서 master branch로 병합을 진행한다.
$ git checkout master
$ git merge task1
위 명령을 통해 다음과 같이 master의 README.md 파일도 변경된 것을 볼 수 있다.
다음으로 작업을 마친 task2 branch에서 master branh로 병합을 진행하려고 한다. 이때 task2는 master branch의 내용이 변경된 사실을 알 수 없다. 따라서 병합을 진행하려고 하면 최신 버전이 수정이 되었기 때문에 충돌이 발생한다!!
충돌이 발생한 파일을 열어보면 git에서 친절하게 현재 branch에 적용된 내용과 병합하려고 하는 파일의 내용을 보여준다.
master branch에서 충돌난 부분을 직접 수정하고 commit을 진행하면 다음과 같은 결과가 나온다.
이렇게 하면 우선 충돌을 없애고 task1과 task2에서 작업한 내용 모두를 적용했다. 이제 이 repository 내용을 remote repository로 올리면 모든 내용이 잘 반영되게 된다.
$ git push -u origin master
파일이 잘 수정되었고 지금까지 변경한 이력은 commits에서 확인 가능하다.
*Branch 최신 버전으로 유지하기
1. Local Repository의 master branch가 최신 버전이기 때문에 이 master branch를 다시 task1 branch로 병합하는 방식으로 task1 branch도 최신 버전을 유지할 수 있다.
$ git checkout task1
$ git merge master
2. 현재 Remote Repository에 있는 master branch의 소스를 Local Repository의 task2 branch로 가져와서 최신 버전을 유지시키는 방식도 있다. (하지만 이 방식이 아직 맞는지는 모르겠다...ㅠㅠ)
$ git checkout task2
$ git pull origin master
아직 Remote Repository에 task2 branch는 없기 때문에 그냥 git pull 명령어로는 해당 branch가 추적이 안된다는 경고가 발생한다.
! rebase 명령어 사용하여 줄기 정리하기
Merge와 비슷하지만 이력을 하나의 줄기로 만들어서 병합하는 방법도 있다. master branch에 우선 task1 branch의 작업까지만 merge한 상태로 돌아간다.
위와 같은 상태에서 다시 task2 상태로 돌아와서 rebase 명령어를 사용하면 병합하면서 이력을 하나로 만들 수 있다. commit 로그들을 재정렬하는 방식이다.
$ git checkout task2
$ git rebase master
$ vi README.md
[README.md 파일 수정...]
$ git add README.md
$ git rebase --continue
이 작업을 마치면 하나의 이력으로 합쳐진 결과가 나온다.
하지만 아직까지는 master branch에 merge 된 상황이 아니다. 다시 master branch로 이동하여 task2를 병합해보도록 하자.
$ git checkout master
$ git merge task2
이 과정을 진행하면 master branch의 README.md 파일도 변경되고 이를 도식화하면 다음과 같다.
이를 통해 이력을 하나로 정리해서 깔끔하게 만들어보았다.
master(main)이나 develop 등 remote repository에서 사용되는 branch에는 rebase를 사용하지 않는게 좋을 것 같다. 다른 사람들도 모두 사용하는 브랜치이기 때문에 rebase를 하게되면 commit 트리가 완전히 바뀌기 때문에 좋지 않은 것 같다. 먼저 개인 브랜치로 공용 브랜치의 내용을 rebase 한 다음 작업하고 다시 공용 브랜치로 merge 하는 것이 좋은 방법일 것 같다.
remote repository에서 사용되는 branch에 작업을 할 때는 항상 pull을 먼저 진행하고 작업 후 push 하면 충돌을 피할 수 있다. 그래도 충돌이 발생한다면 경고 메시지에 따라서 다시 pull 하거나 충돌 난 부분을 바로 수정하면 되니 걱정말자...!!
참고: https://backlog.com/git-tutorial/kr/stepup/stepup1_1.html
'기타' 카테고리의 다른 글
[Gitlab] ssh key 생성 및 등록 (0) | 2022.03.01 |
---|---|
Docker 기본 명령어 (0) | 2022.02.12 |
[Docker] MySQL Docker로 띄우기 및 접속 (0) | 2022.01.12 |
Github 사용하기 - Local에서 Branch 이용 (0) | 2020.03.07 |
Github 사용하기 (0) | 2020.03.07 |
- Total
- Today
- Yesterday
- map
- array
- CodeDeploy
- java
- spring
- Combination
- 수학
- Baekjoon
- permutation
- string
- cloudfront
- Dynamic Programming
- search
- 프로그래머스
- 조합
- AWS
- Algorithm
- 소수
- DFS
- ECR
- 순열
- CodeCommit
- BFS
- programmers
- EC2
- CodePipeline
- ionic
- sort
- SWIFT
- 에라토스테네스의 체
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |