개발 작업시 개발자들은 작업 레파지토리에서 소스 코드를 공유한다. 만약 A 작업과 B작업이 있을 경우 A 작업이 다 끝난 뒤에 B 작업을 수행한다면 비효율적이다.
따라서, 별도로 작업하여 합치는 방안이 있고 Git
에서는 branch
와 merge
라는 명령을 사용하게 된다.
브랜치는 독립적인 작업을 할 수 있는 공간이다. A기능을 A브랜치에, B기능을 B브랜치에서 서로 다른 독립적인 공간에서 작업을 할 수 있다. 이는 서로에게 영향을 주지 않는다.
즉, 메인 작업 공간의 코드를 복사한 개별적인 작업 공간을 만들고 거기서 각각의 기능 개발을 진행한다. 그리고 코드를 합치면 된다.
✅ 예시
✅ 개발자는 기능 브랜치에서 작업한 내용을 기본 브랜치로 바로 commit
을 날릴 수 있고 코드를 merge
하고 업데이트 할 수 있다.
브랜치로 작업을 하면 브랜치 단위로 업데이트가 되기 때문에 충돌이 일어나는 일을 방지하기 좋다.
만약 서로 같은 부분을 다르게 수정하면 충돌이 나고, 충돌이 나면 둘 중 하나를 선택하라는 선택이 뜨며 되돌릴 수 있다.
✅ git에서의 기본 브랜치는 master 브랜치(GitHub은 main)이다.
HEAD'
라는 특수한 포인터가 있다. 이 포인터는 지금 작업 중인 브랜치를 가리킨다.💡 기본 브랜치(main, master)
앞에서 언급했듯, git에서의 기본 브랜치는 master이고 GitHub에서의 기본 브랜치는 main다.
✔️
git init
명령을 통해 초기화하고 레포지토리에 연결하는 과정을 진행하게 되면 기본 브랜치는 master가 된다.✔️
git config --global init.defaultBranch main
로 설치 시 또는 설치 후 설정을 통해 기본 브랜치 이름을 바꿀 수도 있다.✔️ 깃허브에서 제공하는 초기화 설정을 사용하거나 가이드라인을 따라 진행한다면 기본 브랜치가 main이 된다.
✅ 하나의 기능 개발이 완료되면 특정 브랜치의 내용들을 main 브랜치에 합친다.
✅ 특정 기능을 작업하고 있는데 급하게 버그를 수정해야 하는 경우가 발생
👉 이런 과정을 거치면 main 브랜치는 가장 최근에 배포한 소스코드의 커밋을 가리키고 있게 된다.
$ git branch
$ git branch 브랜치명
💡 branch naming
- 기호(-)로 시작할 수 없다.
- 마침표(.)로 시작할 수 없다.
- 연속적인 마침표(..)를 포함할 수 없다.
- 빈칸, 공백 문자, 물결(~), 캐럿(^), 물음표(?), 별표(*), 대괄호([ ]) 등은 포함할 수 없다.
아스키 제어 문자는 포함할 수 없습니다.참고하자! branch 네이밍 규칙
checkout을 통해 브랜치를 이동하여 사용할 수 있다.
하지만 기존의 checkout이 가진 기능이 너무 많기 때문에 Git 2.23에서 checkout을 대신해
switch
와restore
가 도입되었다.
✔️ switch
$ git switch Gary
$ git switch -c Gary
✔️ restore
restore
는 파일의 수정 내용 복원과 add 를 통해 스테이지에 올린 파일을 빼낼 때 사용1. 파일을 생성한 후 커밋
2. 수정 후 저장.
3. modified(수정) 파일이 있다는 것을 확인
👉 파일 변경 내역을 modified
파일에서 unmodified
파일로 되돌리는 방법은 두 가지
restore
을 이용하여 변경 사항을 되돌리기$ git restore README.md
checkout
을 이용하여 파일 변경 내역을 되돌리기 git checkout -- filename
은 해당 파일 내용이 최신 커밋 전으로 돌아가도록 한다. 이때, checkout
으로 지워진 내용은 커밋을 하지 않았기 때문에 다시 복구할 수 없다.$ git checkout -- README.md
✚ 스테이지 올린 것을 빼는 방법
상태 확인 시 stage에 수정된 파일 존재
$ git add . $ git status
1) restore 명령어를 이용하여 빼기
$ git restore --staged README.md
2) reset 명령어를 이용하여 빼기
$ git restore --staged README.md
항상 push 할때마다 뜨는 에러 코드가 있다.
✔️ 에러가 발생하는 이유는 upstream 브랜치를 설정하지 않았기 때문.
그렇기 때문에 git push --set-upstream origin branch_name
명령어를 이용하여 해당 명령어 이후부터는 원격 저장소에 브랜치를 만들어 push
하겠다는 뜻.
💡
git push
vsgit push <원격저장소명> <브랜치명>
왜
git push origin main
일까?git push
하면 안되나?✔️
git push <원격저장소명> <브랜치명>
는 어느 원격 저장소의 어느 브랜치에 push할 지 전달한다.✔️
git push
는 할 때에는 이미 연결된 곳에 push할 수 있지만, 원격 저장소에 해당 브랜치가 없는 경우에는git push -u origin <브랜치명>
을 실행해주셔야 이후에 간단히 push할 수 있다.-u
옵션이--set -upstream
이다.
✔️ 특정 브랜치를 삭제
git branch -D <삭제할 브랜치명>
✔️ 특정 브랜치를 복구
1️⃣ 1단계. git reflog로 복구 시점 확인
git reflog
를 입력한다.$ git reflog
💡
reflog
는 모든 참조 내역들을 뜻한다. main 브랜치에서 어떤 브랜치로 참조를 했는지, 어떤 커밋을 날렸는지 등 모든 내역들을 ₩git reflog₩를 통해 확인할 수 있다.
2️⃣ 2단계. git checkout으로 브랜치 복구
$ git checkout -b <삭제한 브랜치명> <커밋 해시값>
branch로 나누어 작업했던 것을 병합하는 명령어
$ git checkout main
$ git log //커밋 히스토리 조회하기
$ git merge binky
$ git log
merge
가 완료되었으면 push
까지 해주셔야 원격 저장소에 반영
$ git push origin main
만약 main으로 이동한 후 브랜치1와 merge했다고 하자. 그리고 브랜치2와도 merge를 하였다.
이때 브랜치1와 브랜치2의 같은 영역을 작업했고 수정사항이 서로 다르다면?
✔️ merge
할 때 두 브랜치가 같은 곳을 수정했다면 충돌이 일어나고, 수동으로 고쳐줘야 한다.
<<<<<<< HEAD (Current Change)
hello world
hello branch1
=======
>>>>>>> branchName (Incoming Change)
hello world
hello branch2
conflict
는 두가지 변경 내역을 비교한 다음에 원하는 코드를 남기는 것이다.
hello world
hello branch1 branch2
이후 add
> commit
> push
를 해주시면 된다.
💡 Visual Studio Code 에서의
Conflict
visual studio code에서는 충돌에 대해 좀 더 자동화된 도구를 제공.
fork
는 다른 사람의 Github repository
에서 내가 어떤 부분을 수정하거나 추가 기능을 넣고 싶을 때 해당 respository
를 내 Github repository
로 그대로 복제하는 기능이다.
fork
한 저장소는 원본(다른 사람의 github repository)와 연결되어 있다. 여기서 연결 되어 있다는 의미는 original repository
에 어떤 변화가 생기면(새로운 commit) 이는 그대로 forked
된 repository
로 반영할 수 있다. 이 때 fetch
나 rebase
의 과정이 필요하다.
다시 말해 기여자 등록을 따로 하지 않아도 Fork
기능을 사용하여 원본 저장소를 복사해 내 저장소에서 commit > push 할수 있다. 기능 생성 후, 내 저장소 브랜치와 빙키와 개리의 저장소의 브랜치에 merge를 하면 된다.
💡 실제로 입사 과제를 할때 Fork로 과제를 복사하고 과제 수행 후 pull request 하는 경우가 많다.
1️⃣ 복사하고자 하는 Github 레파지토리에 들어가서 오른쪽 상단에 Fork를 클릭.
2️⃣ 포크한 저장소를 클론하기 위해 주소 복사 버튼을 클릭
3️⃣ 저장하고 싶은 곳으로 이동한 후, 클론
$ cd 저장하고_싶은_디렉토리
$ git clone 복사한_git주소 .
4️⃣ 원격 저장소 이름들을 가지고 옵니다.
//원격 저장소 이름들을 가지고 오기
$ git remote
// 새로운 원격 저장소를 추가
$ git remote add 새로운_원격저장소_이름 fork한_git주소
//로컬 저장소에는 없지만 원본 저장소에 있는 데이터를 가져오려면 fetch 명령어를 입력
$ git fetch 새로운_원격저장소_이름
브랜치와 포크는 두가지 모두 코드를 협업하기 위해 분기점을 나누는 방식이지만 특성이 다르므로 프로젝트에 맞게 사용해야 한다.
상대방의 저장소를 Fork한 후 원본 저장소에 올리고 싶을 때 어떻게 할까?
✅ 이럴 때, 원본 저장소의 권한을 가진 사람에게 두 브랜치를 합치는 것을 허락해 달라고 요청을 보내야하는데, 이것을 Pull Request
또는 PR
이라고 한다.
협업 시에는 최대한 직접 merge
하는 것은 피하고 모든 merge
를 pull request
를 통해서 하는 것이 좋다.
상대방이 PR을 보고 코드 리뷰가 가능하기 때문이다. PR에 수정이 필요하면 댓글을 달아 change request를 보낼 수 있는데 단, 오픈 소스에 PR을 보낼 때에는 기여 안내문서를 참고해야 한다.
1️⃣ 포크한 저장소에 Contribute
를 클릭하고 Open pull request
버튼을 클릭
2️⃣ 원본 저장소로 이동하게 되는데, 어떤 브랜치에 어디로 브랜치 할 것인지 선택
3️⃣ 초록색 문구가 나타나면 정상적으로 PR
을 할 수 있고 빨간색 문구가 뜬다면 충돌을 해결하고 PR
4️⃣ **Create pull request
를 클릭하면 제목과 글을 작성 가능.**
5️⃣ 작성이 완료되면 Create pull request
버튼이 활성화 되고, 상단 Pull requests
를 클릭하면 상대방이 PR을 보낸 것을 확인 가능.
6️⃣ 이 PR
은 내가 merge
할 수 없고 권한이 있는 사람이 리뷰를 달거나, Merge pull request
버튼을 클릭하여 merge 가능.
1️⃣ Pull Request
를 요청한 레포지토리로 간 이후, 자신이 보낸 PR을 선택.
2️⃣ 하단에 Close pull request
버튼을 클릭하면 자신이 요청한 PR이 취소.
출처 및 참고하기 좋은 사이트