git은 여러개의 저장소를 서로 연결시켜 상호 간에 동기화를 시킬 수 있습니다.
이러한 특성을 이용하면 서로 다른사람들이 각각의 저장소에서 작업을 하고, 이것을 모아서 하나의 프로젝트를 할 수 있는,
즉, 협업의 도구로 git을 사용할 수 있습니다.
이 때, 내부적으로는 branch가 사용됩니다.
branch의 개념을 이미 알고 있고,
branch와 branch를 병합할 때, 발생하는 conflict를 다룰 수 있는 준비가 되었다면
이미 협업에 필요한 준비가 끝난 상태입니다.
[git으로 혼자 작업하기]
git bash에서 a라는 저장소를 하나 만들어서 work.txt파일에 1이라고 적고, work 1이라는 commit message를 달아서 버전을 만들었습니다.
git init a
nano work.txt
git add work.txt
git commit -m "work 1"
그리고 github를 이용해서 원격저장소를 collaboraition-cli 라는 이름으로 만들었습니다.

우리는 이미 지역 저장소가 있기 떄문에
밑에서 두번 째 방법으로 원격저장소에 연결해줄꺼에요
git remote add origin https://github.com/jmpark24/collaboration-cli.git 해주고,
지역저장소의 버전을 원격저장소에 올리기 위해서 git push 해주면 되지면, 처음에 할때는
git push -u origin master
지역저장소의 master branch를 origin이라는 원격저장소의 master branch로 연결해줍니다.

리로드를 해보면 work.txt 가 work 1이라는 commit message를 가지고 잘 올라간 것을 확인 할 수 있습니다.
[git으로 같이 작업하기]
github를 이용해서 같이 작업을 하려면 상호 간에 동의를 해야하는데, github에서 public으로 저장소를 만들면 아무나 다운로드를 할 수는 있지만, 아무나 push를 할 수 는 없습니다.
github에 원격저장소에 들어간 다음에 Settings - Access 밑에 Collaborators

여기에서 상대방의 github id를 추가해주면 됩니다.
그러면 초대 된 사람에게 메일이 날아가고, 동의하면 됩니다.
협업자가 메일을 받지 못하면 Copy invite link를 전달할 수 있고, 권한은 Admin, White, Read 중 선택하면 됩니다.
협업은 이런식으로 진행을 하는 것이고, 실습은 한 대의 컴퓨터에서 2개의 저장소를 만들고 진행될 예정입니다.
우리는 지금까지 a라는 디렉토리에서 작업을 했고, 다른 컴퓨터라고 할 수 있는 b라는 디렉토리를 원격저장소로 만들어 줍니다.
현재 a에 있기 때문에,
대충 cd ..&&git clone https://github.com/jmpark24/collaboration-cli.git b&& cd b
이런식으로 하면 되겠죠?
Alt + F2 눌러서 2개 창을 열어서 실습해봅시다.
[git push & pull]
a에서 work.txt에 2a를 추가하고 2a라는 버전을 하나 만들어 봅시다.
nano work.txt
git commit -am "2a"
이제 b에서 작업하려면 git pull을 해서 새로운 버전을 다운로드 받은 다음에 작업을 해야하는데 깜박했다고 해봅시다. 또는 둘이 동시에 작업하는 상활일 수 도 있어
이제 b에서 work.txt에 2b를 추가하고 2b라는 버전을 만들어 봅시다.


원격저장소에 작업한는 다른 사람의 최신 버전이 있는 상태에서 가져오지 않으면 git push가 동작하지 않게 된다.
이것을 해결하려면, git pull을 이용해서 작업을 완료하고 git push를 해야하는데, conflict가 발생하게 됩니다.

이 떄, 병합 도구를 사용하려면 git mergetool, 수동으로 수정하면 work.txt파일을 열어서 수정하면 됩니다.
git add work.txt
git commit
해주게 되면

우리가 충돌을 했었다는 사실을 git이 commit message를 자동으로 만들어 주게 됩니다.

git log 를 해보면, git pull을 통해서 가져온 2a와 내가 만든 버전 2b를 기준으로 현재 버전이 새로 생긴 것을 확인 할 수 있고,
a 작업자는 git pull을 해서, 같은 버전을 가지고 작업을 계속 진행하면 됩니다.
[git pull VS fetch 그리고 원격 브랜치]
git pull = git fetch + git merge FETCH_HEAD
차이 점을 알아 봅시다.
우리는 서로 다른 사람들과 작업을 하는데,
git pull --> git commit --> git push 이런식으로 작업을 하게 되는데
git fetch --> git merge FETCH_HEAD --> git commit --> git push 이렇게 함으로 써 같은 일을 할 수 있게 됩니다.

git log를 했을 때, HEAD -> master는 현재 master branch에 있다는 것을 의미하고,
origin/master는 origin이라는 원격저장소에서 가져온 master branch를 의미합니다.
현재는 HEAD -> master, origin/master 이기 때문에,
현재 master branch가 원격저장소인 origin의 master branch와 동일한 버전이라는 것을 알 수 있습니다.
여기서 a저장소의 work.txt에 3a를 추가해서 work 3a라는 commit massage를 가진 버전을 만들어 봅시다.
nano work.txt
git commt -am "work 3a"
git log --all --oneline --graph 해보게 되면
HEAD가 origin/master 보다 앞선 master 를 가르킨 것을 확인 할 수 있습니다.
여기서 git status 해보면,
현재 브랜치가 origin/master 보다 1 commit 앞선다는 것을 출력해주고, git push 하라고 알려줍니다.
git push 해주고 log를 확인해보면 origin/master와 master가 같아진 것을 확인 할 수 있습니다.

이제 b저장소에서 작업을 하려면 git pull을 해야할텐데 다른 방법이 있습니다.
git fetch 입니다.

git fetch를 하게되면 master보다 1 commit 앞선 origin/master를 확인할 수 있고,
git status를 했을 때, origin.master보다 1 commit 뒤에 있으니 git pull을 하라는 메세지를 확인할 수 있습니다.
여기서 git pull을 해도 되지만
origin/master를 master로 merge해도 됩니다.

git pull을 한다는 것은
git fetch 후에 git merge origin/master와 같은 결과를 낸다고 볼 수 있다.
어떤 branch와 병합을 할지 신경쓰는 것에 대한 불편함으로
원격저장소에 가장 최근에 우리가 merging한 버전을 git은 가지고 있는다.
cat .git/FETCH_HEAD 를 해보면 내가 fetch했던 가장 최근 버전을 가지고 있는 것을 확인할 수 있다.
git fetch + git merge FETCH_HEAD
fetch를 사용하므로써, remote branch(여기서는 원격저장소의 master branch)를 새로운 버전이 아닌 branch로 가져올 수 있게 되었고,
merge를 통해 remote branch와 local branch를 합칠 수 있게 되었고,
git이 관리하고있는 최신 fetch를 FETCH_HEAD라는 별명으로 가져올 수 있게 되었다.
신중하게 git으로 데이터를 가져오고 싶을 때 사용하면 된다.
'GIT' 카테고리의 다른 글
GIT CLI - Backup(github연결,push,clone,pull) (0) | 2024.01.14 |
---|---|
GIT CLI - Backup(github, gitlab), 용어 정리 (0) | 2024.01.14 |
GIT CLI - reset vs checkout (0) | 2024.01.14 |
GIT CLI - Conflict, 3 way merge, p4merge (1) | 2024.01.14 |
GIT CLI - Branch & Conflict(기본사용법) (0) | 2024.01.14 |