layout | title | date | categories |
---|---|---|---|
post |
Git Branch 사용 & 병합하기 / Git merge 병합하기 매뉴얼 |
2021-05-28 13:00:21 +0900 |
git |
참고 사이트 Git Branch 사용 & 병합(merge)하기 / Conflict 해결하기
포크(Fork)가 완료되면 자신의 계정에 새로운 저장소가 생긴다.
-
fork로 생성한 본인 계정의 저장소에서 clone or download 버튼을 누르고 표시되는 url을 복사한다. (중요 - 브라우저 url을 그냥 복사하면 안 된다)
-
자신의 컴퓨터에서 작업을 하기 위해서 Fork한 저장소를 로컬에 clone 한다.
git clone https://github.com/자신의계정/campfire.git
- 로컬 저장소에 원격 저장소를 추가한다. 위 작업과 동일하게 github 저장소에서 clone or download 메뉴를 통해서 확인한 URL을 사용한다.
- 원본 프로젝트 저장소 (직접 추가 )
- fork한 로컬 프로젝트 (origin 이라는 별명으로 기본으로 추가되어 있다. 따로 추가할 필요가 없음)
# 원본 프로젝트 저장소를 원격 저장소로 추가
git remote add origin https://github.com/원본계정/campfire.git
# 원격 저장소 설정 현황 확인 방법
git remote -v
브랜치 생성 및 checkout 브랜치 변경 -> 수정 후 add , commit , push (아래 브랜치 설명서 참고)
- push 완료 후 본인 계정의 github 저장소에 들어오면 Compare & pull reqeust 버튼이 활성화 되어 있다.
- 해당 버튼을 선택하여 메시지를 작성하고 PR을 생성한다.
깃허브 원격 저장소에 가서 자신의 브랜치로 설정 후 Pull Request 버튼을 클릭한다.
제목과 내용을 작성한 뒤 병합 요청(Create Pull Request)
※ Branch란?
- Software개발시 개발자들은 동일한 소스코드 위에서 신규 개발, 버그 수정 등의 업무를 협업하곤 한다. 이럴 때, 여러 개발자들이 동시에 다양한 작업을 할 수 있게 만들어 주는 기능이 "Branch" 이다.
즉, 브랜치(Branch)를 통해 하나의 프로젝트를 여러 갈래로 나누어서 관리할 수 있다. 각각의 독립된 Branch에서 마음대로 소스코드를 변경하여 작업 한 후 원래 버전과 비교하여 또 하나의 새로운 버전을 만들어 낼 수 있다.
$ git branch
- 현재는 master 브랜치만 존재 한다. (master :최초 레포지토리 생성후 커밋하면 자동으로 생기는 브랜치)
- *가 붙어있는 브랜치가 현재 활성화된 브랜치이다.
$ git status
- On branch master > 마스터 브랜치 위에 있다.
$ git branch -r
$ git branch -v
- Branch 생성
git branch 브랜치명
- 생성한 Branch로 이동하기
git checkout 브랜치명
- checkout 옵션 중
-b
를 사용하여, 생성 후 바로 이동
git checkout -b 브랜치명
git checkout -b c
$ git branch -d test
git checkout test
- 현재 원격 저장소에는 master branch밖에 없는 상태이고, test branch로 이동하여 push를 그대로 한다면 오류가 발생한다.
- 로컬 레포지토리를 리모트 레포지토리로 처음 push할 때는 --set-upstream 옵션을 주어야 한다.
- 그래야 tracking 정보 설정이 되어 git push만 사용해도 푸쉬가 된다.
$ git push --set-upstream origin 브랜치명(test)
or
$ git push -u origin 브랜치명(test)
git checkout c
git branch
파일명 : test.txt
command Line : vi test.txt
-> test text
git add .
git status
git commit -m "add test txt"
- c 브랜치에 신규 txt 파일이 추가 되었고 충분히 테스트 되어 문제가 없다는 가정하에 master 브랜치에도 똑같은 txt 파일을 생성 하려 한다. 이때 내가 작성한 파일을 master branch로 이동하여 그대로 작성해도 되지만, merge 기능을 사용하여 c 브랜치에서 합칠 수 있다.
git checkout master
ll
command Line : git merge 브랜치명
git merge c
c
브랜치에서 했던 작업 내용이 복사된 것을 볼 수 있다. 즉, 다른 브랜치에서 했던 작업 내용을 가져오고 싶을 때 merge를 사용할 수 있다.
컨플릭트 : 충돌
- 임의로 간단한 소스 충돌 상황을 만든다.
git checkout c
- 메모장 또는 vi 편집기를 이용하여 다음과 같이 이름을 변경해본다.
git add .
git commit -m "change test text.txt"
이 후 master 브랜치로 이동한다.
git checkout master
- 당연히 master branch로 확인해보면 c 브랜치에서 수정한 내용은 반영되어있지 않다.
cat test.txt
- 메모장 또는 vi 편집기를 활용하여 다음과 같이 내용을 변경하고, 커밋한다.
- 머지(merge) 작업을 해본다.
git merge c
-> 메세지를 살펴보면 영어 버전인 경우 CONFLICT라는 단어가 포함되어 있을 것이다. 충돌이 발생한 것이다.
그럼 컨플릭트 상황이 발생하였다고 나와있는 파일을 살펴 본다.
command Line : vi test.txt
- "=======" 을 기준으로
위 : HEAD로 표시되어 있는 내용이 master 브랜치에서 한 작업
아래 : test로 표시되어 있는 내용은 test 브랜치에서 한 작업
- 각각의 브랜치에서 동일한 파일을 수정하였는데, merge를 하려고 했을때 git이 어떤 내용이 맞는지 판단할 수 없기 때문에 충돌이 발생하였다고 알려 준다. 이런 상황을 Conflict가 발생하였다고 한다.
- 직접 양 브랜치간의 내용을 비교하여 수정 후 add, commit 처리 한다.
ex) vi test.txt 하여 '<<<<<<<< HEAD ' , ' >>>>>>>> 브랜치명 ' 까지 지운 뒤 ' merge text test '로 변경 후 커밋 처리
- 머지를 하다가 conflict가 발생하였을 때, 일단은 merge 작업을 취소하고 이전 상태로 되돌아 갈 수 있다.
Command Line :
git merge --abort
머지 시도 이전 파일내용과 똑같은 것을 볼 수 있다.
이 후 작업을 다시 하고 병합하거나, 아니면 c 브랜치의 내용으로 그냥 merge처리 하는 등의 선택을 할 수 있다.
$ cd {repository_root_dir}
$ git checkout .
$ git checkout {dir}
$ git checkout {file_name}
$ git reset
master 브랜치의 마지막 커밋을 가리키던 HEAD를 그 이전으로 이동시켜서 commit 내용을 없앰
$ git reset --hard HEAD^
$ git reset HEAD^
$ git reset --soft HEAD^
git clean -fdx
$ git reset HEAD^ #local repository에서 commit을 하나 되돌림
$ git commit -m "..." #되돌린 것으로 commit
$ git push origin +master #remote repository를 강제로 revert