Git - 원리 : 3 way merge

위의 사진에 대한 설명.
현대 Me라는 브랜치는 현재 브랜치라고 생각해도 된다. 그리고 또 다른 브랜치를 체크아웃 했고 그 브랜치의 이름음 Other이다.
Me 브랜치에서는 A라는 부분을 그대로 뒀고 Other브랜치에서는 지웠다. B부분은 두 브랜치 둘다 그대로 뒀고 C부분은 Me브랜치는 1로 변경했고 다른 브랜치 역시 2로 변경. D부분은 Me브랜치에서는 내용을 지웠고 다른 브랜치는 그대로 뒀다.
여기서 Me브랜치와 Other브랜치는 가운데 있는 코드를 공통으로 갖는다. 이런 코드를 Base라 부른다.
현재 브랜치에서 Other브랜치를 병합하려고 하면 깃은 어떻게 자동으로 병합을 시도하려고 할까.
병합하는 방법은 두가지가 있다.
2way merge / 3way merge
2 way merge는 Base를 보지 않고 두 개의 차이점만 비교해서 병합을 하는 방식이다.
3 way merge는 Base를 참고해서 두 개의 대상을 병합하는 방식이다. 그리고 훨씬 더 좋다.

2way merge에서는 Base를 참고하지 않기 때문에 오로지 두개의 브랜치만 보고 결정을 해야하는데 내용이 같은 B부분 말고는 어느것이 수정이 되었고 맞는지 확인할 수 없기 때문에 conflict라는 결론을 낸다.
3way merge에서는 A부분과 D부분에서 Me 브랜치에서는 원래 파일을 수정하지 않았고 Other브랜치에서는 수정을 했다. 따라서 Other브랜치에서 수정한 것이 채택된다.
원격 저장소 소개
원격 저장소 , 영어로는 Romote Repository
원격저장소는 무엇과 구분되는 거냐면 Local Repository 지역 저장소라는 것과 대비되는 개념이다.
내가 내 컴퓨터에서 작업하고 그것을 커밋하면 저장되는 그것이 지금까지는 그냥 저장소라고 불렀는데
내가 작업했던 그 내용을 인터넷 어딘가에다가 올려서 백업을 하고 또는 인터넷에 올라가 있는 저장소를 매개로 해서 다른 사람과 협업을 할 때에 사용되는 컴퓨터가 아닌 그 컴퓨터의 저장소에 연결되어 있는 다른 저장소를 원격저장소라고 한다.
원격저장소는 크게 두가지의 중요한 의미가 있다.
첫번째는 버전을 백업한다.
두번째는 소스코드를 백업한다는 의미와 또 다른 사람과 협업을 한다.
이러한 중요한 두 가지 의미를 가지고 있기 때문에 원격저장소는 프로젝트가 커지는 과정에서 굉장히 중요한 기능이 된다.
Git - github 소개
원격저장소를 직접 구축하는 방법도 있지만 쉽지 않은 일이고 그걸 잘 유지하는 것도 어려운 일이기 때문에 원격져장소를 제공해주는 여러가지 서비스들이 있다. 그 중에 제일 유명한 github라는 서비스에 대해 알아보자.
자신의 프로젝트를 올리는 것 또한 중요하지만 이미 존재하는 프로젝트를 자신의 컴퓨터로 끌고 와서 소스를 볼 수 있고 수정할 수 있는 방법에 대해 먼저 알아보자.
github에 들어가서 git이라고 검색하면 아래 사진과 같은 git/git이 나오는데 클릭해서 들어가면 지금 내가 배우고 있는 git 오픈소스 프로젝트 원격저장소를 볼 수 있다.


링크를 복사하고 자신의 컴퓨터에 적당한 디렉터리로 이동한다.
지금까지 저장소를 새로 만들 때 git init을 사용했는데 이번에는 clone을 사용한다.
git clone https://github.com/git/git.git gitsrc

src디렉토리에 cloning하고 있다라고 메세지가 나오고 다운로드가 진행된다.
완료되면 gitsrc폴더로 들어가서 ls -al을 하면 엄청나게 많은 소스코드 파일들이 나온다.
이것들을 내가 분석하기에는 상당히 어려운 일이다.
git log를 하여도 엄청나게 많은 커밋들이 있다.
여기서 첫번째 커밋이 무엇인지 확인해보자.
git log --reverse. : 거꾸로 로그를 볼 수 있다.

이것이 바로 깃의 첫 커밋이다.
만약 이 소스 코드가 궁금하다면 커밋 id를 복사한 뒤
git checkout [커밋id]를 해보자.
그렇게 되면 내가 복사한 커밋 id로 브랜치 체크아웃 하듯이 체크아웃 된다.
ls -al을 해보면 처음 했던 것보다 파일 양이 확연히 적다.
깃의 첫번째 커밋에 해당되는 깃이 어떻게 동작했고 어떠한 코드로 이루어졌는지도 알아보자.
어딘가에 있는 원격저장소의 내용을 로컬저장소로 가져오고 싶다면 어떤 명령을 쓰면 되나?
git clone [저장소 링크]
그리고 위의 저장소를 저장하고 싶은 디렉토리를 지정하면 디렉토리가 복제된 저장소 즉, 나의 컴퓨터 로컬 저장소가 github에 있는 원격저장소에서 복제해서 만들어진 것이라고 볼 수 있다.
원격 저장소 만들기
원격저장소를 어떻게 만들고 또 만들어진 그 원격저장소에 어떻게 동기화시키는지 알아보자.
먼저 github에가서 new repository를 선택한다.
저장소의 이름은 자신이 원하는 이름으로 지정하고
Initialize this repository with a README 라는 것은 파일을 프로젝트 설명을 기본적으로 만들겠다라는 의미.
create repository를 누르면 저장소가 만들어진다.

HTTPS를 선택하고 옆에 보이는 링크가 내가 방금 생성한 저장소의 고유한 주소이다.
우리는 저 주소를 이용해서 클론 할 수 있다.


그 밑으로는 위의 사진의 create a new repository on the command line이 있다.
우리는 두가지 상황이 있을 수 있다.
1. 원격 저장소를 만들고 그것을 복제해서 로컬 저장소를 만든 후 로컬조장소에서 작업을 하는 방법.
2. 이미 로컬 조장소에서 작업을 해왔고 그 상태에서 원격 저장소로 내용을 올리는 방법.
이 수업에서는 후자의 방법을 먼저 알아본다.
git에서 파일을 생성 후 내용을 입력하고 add,commit을 해주었다.
그리고 github에서 위의 사진 중 ...or push an existing~~ 의 첫번째 코드를 복사해오자.
git remote add origin https://github.com/parkchae/gitfth.git
//현재 나의 로컬 저장소에 원격 저장소를 연결(add)시킨다.
그리고 저장소는 위의 링크이다 라는 것을 깃에게 알려주는 것이다.
또한 해당 주소는 너무 길기 때문에 origin이라고 별명을 부여하겠다 라는 의미.
확인하기 위해 git remote를 입력하면 origin 이라고 뜨면 잘 만들어진것이다.
git remote -v라고 하면 상세보기가 된다.
관습적으로 origin이라는 원격 저장소는 나의 로컬 저장소와 연결되어있는 기본적인 원격 저장소. 메인이 되는, 주로 동기화를 하는 원격저장소를 origin이라는 이름을 많이 사용한다.
깃에서는 로컬 저장소를 기준으로 항상 얘기한다.
로컬 저장소를 기준으로 해서 원격 저장소로 나의 작업을 보낼 때 로컬 저장소 입장에서는 push 한다라고 표현한다.
git push -u origin master
현재 내가 checkout되어 있는 로컬 저장소에 브랜치를
origin 주소에 해당되는 저장소 중 마스터 브랜치로 push(동기화)한다.
-u 는 한 번만 사용하면 되는데 현재 로컬 저장소 브랜치와 원격 저장소 마스터 브랜치를 서로 연결시켜서 그 다음 부터는 git push만 하면 자동으로 넘어가게 할 때 사용하는 옵션이 push -u이다.
**참고로 github push 오류나면 token으로 사용하라는 메세지가 뜬다. 아래 링크 참고**
https://hyeo-noo.tistory.com/184
위의 명령어 까지 입력하고 github에서 새로고침하면 내가 작업했던 내용이 원격 저장소로 업로드 된다.

이후 로컬 저장소에 f1.txt 내용을 추가하고 커밋한다.
아까처럼 git push -u origin master 할 필요없이 이미 로컬저장소와 원격저장소를 연결 시켰기 때문에
그 다음부터는 git push만 해주면 알아서 된다.
이건 백업의 의미를 갖기 시작하는데 내가 다른 컴퓨터에서 작업을 해야 될 경우도 있을 수 있다.
그럴 때에는 이미 존재하는 원격 저장소를 나의 로컬 저장소로 복제하면 되는데 전에 했던 것과 같이 저장소 링크를 복사하고
git clone [저장소 링크] .
마지막 . 은 현재 저장소라는 의미이다.
'git' 카테고리의 다른 글
| <13> 생활코딩 - GIT (0) | 2022.12.03 |
|---|---|
| <12> 생활코딩 - GIT (0) | 2022.12.03 |
| <10> 생활코딩 - GIT (0) | 2022.12.02 |
| <9> 생활코딩 - GIT (0) | 2022.11.28 |
| <8> 생활코딩 - GIT (0) | 2022.11.28 |
댓글