거북이의 IT 공부
깃(Git) - 깃크라켄(Gitkraken)과 함께 본문
1. git init - 해당 폴더를 git 명령어를 이용할 수 있는 폴더로 만든다
로컬 폴더를 깃이 관리할 수 있도록 등록한다
(해당 프로젝트에 .git 이라는 폴더가 생성되어 git으로 관리할 수 있게 된다)
한마디로 git 저장소(로컬 저장소)가 생성된다고 쉽게 생각해도 된다.
그런데 새로 만들 폴더를 git 저장소(Repository)로 만드려면, repo를 가르키는 master가 필요하고, 이것은 최초 1회 commit을 통해 생성할 수 있습니다.
그렇기 때문에 파일을 add하고 commit을 함으로써 저장소가 생성이 된 것입니다!
(이 부분은 헷갈릴 수 있는데 그렇게 중요한 개념이 아니므로 패스해도 된다)
2. git clone - 원격 저장소(웹에 존재하는 저장소)를 지역 저장소에 복제한다
.git 폴더까지 포함해서 소스를 받을 수 있다!!!
깃허브에서 만든 원격 저장소로 시작하고 싶을 때 자주 사용된다(로컬 저장소에 그대로 폴더가 복제된다)
3. git remote - 해당 지역 저장소가 원격 저장소에 연결되어 있는지 확인해준다.
git remote add {별칭} {원격 저장소 url} - 해당 지역 저장소를 원격 저장소에 연결해준다.
4. git add - 작업 폴더에 있는 파일을 가상의 준비 영역(staging area)에 옮긴다
변경 사항들 중 필요한 사항과 아닌 사항을 구분하면서 차곡차곡 인덱스에 저장한다.
*작업폴더 -> 인덱스(staging area) -> 저장소(Head - Repository, 로컬 저장소와 원격 저장소)
새로운 파일을 작업폴더에 만들었다
그러면 깃크라켄에서는 아래와 같이 나온다
위 사진은 test2 파일은 가상 영역에서 삭제하고 싶어서 휴지통 아이콘을 누르니 경고문이 나온다.
reset all를 누르면 test2.txt는 더이상 찾을 수 없게 된다(물론 로컬 컴퓨터에서도!!)
이 상태에서 push를 누르면 아래와 같은 에러문이 뜬다
로컬 저장소에 원격 저장소(remote repository)가 등록되었다. 그러나 브랜치를 생성한 적은 없다.
이제는 push가 되며 origin(원격 저장소)에 알아서 master 브랜치가 생성된다.
여기까지가 기본 세팅이고 추가적으로 브랜치(branch)를 알아보자
그렇다면 merge란 어떻게 하는 것일까...??
제일 어려운 부분이라고 나는 생각한다(합병이라는 개념이 와닿지 않는 적이 많다)
merge youbin into master ( 깃크라켄에서 master를 더블클릭하고 youbin을 오른쪽 마우스 클릭한다)
그러면 아래처럼 youbin 브랜치가 master로 병합이 된다
0. git log - 해당 브랜치의 커밋 내역들을 확인한다
원격저장소에 있는 내용을 지역저장소로 가져올 때 두가지 방법 -> pull, fetch
pull과 fetch의 가장 큰 차이는 merge를 하냐 하지 않느냐의 차이입니다.
1. git pull - 원격저장소에 있는 소스를 현재 로컬 소스에 병합한다
= git fetch + git merge
예를 들어 master <- youbin 상황이라고 한다면
git pull origin {branch name} - origin에 연동된 원격 저장소에서 특정 브랜치만 pull해온다.
재밌으닌깐 한번더 도전!!
그렇다면 pull vs merge ??
git merge : local branch와 local branch를 merge(병합)한 commit을 생성한다
git pull : local branch와 remote branch를 merge한 commit을 생성한다
git pull은 보통 local/master 브랜치로 remote/master 브랜치를 가져올 때 사용한다
또는 local/my_branch로 remote/my_branch를 가져오는 것도 마찬가지이다
(좀더 자세하게 설명하면, 위와 같이 사용할 경우 merge라기보다는 forward된다)
그런데 이걸 cross하여 사용하면, 즉 local/master 브랜치로 remote/my_branch 브랜치를 가져오면
이 둘이 merge된 commit이 생성된다
↓더 자세한 사항은 아래를 참고하자
fetch안하고 pull을 하면 "어차피 나는 커밋내역 뭐 올라와 있는지 확인/알고 있으닌깐 그냥 가져와서 병합해줘" 느낌이다.
2. git fetch - 단순히 원격 저장소의 내용을 확인만 하고 로컬 데이터와 병합은 하고 싶지 않은 경우
fetch 를 실행하면, 원격 저장소의 최신 이력을 확인할 수 있습니다.
이 때 가져온 최신 커밋 이력은 이름 없는 브랜치로 로컬에 가져오게 됩니다.
이 브랜치는 'FETCH_HEAD'의 이름으로 체크아웃 할 수도 있습니다.
Git은 fetch 단계에서 원격 저장소의 변경 사항을 로컬 저장소로 가져오는데 이 때 '원격 추적 브랜치'를 사용하게 된다.
원격 브랜치에 대한 원격 추적 브랜치가 존재하지 않을 경우 원격 추적 브랜치를 만들고 이 원격 추적 브랜치에 변경 사항을 공유 받게 된다.
- git fetch 명령이 실행되면 원격 저장소로 부터 가져온 모든 브랜치의 헤드를 .git/FETCH_HEAD 파일에 기록하게 된다. 즉, FETCH_HEAD는 원격 저장소로부터 가져온 브랜치의 HEAD를 의미한다.
- git fetch 이후에만 유효한데, 패치 작업 직후에 가져온 브랜치의 최신 커밋을 참조할 때 유용하다.
(깃크라켄에서는 fetch를 시각적으로 지원해줘서 굳이 fetch를 해주지 않아도 원격 저장소의 최신 커밋들을 확인 할 수 있었다. 우리가 할 필요성이 적다)
↓더 자세한 사항은 아래를 참고하자
https://backlog.com/git-tutorial/kr/stepup/stepup3_2.html
https://mylko72.gitbooks.io/git/content/remote/remote_sync.html
git에서 HEAD tag는 현재 체크아웃된 커밋을 가리킨다. 즉, 현재 작업중이 커밋
한 브랜치에서 다른 브랜치로 합치는 방법으로는 두 가지가 있다 -> merge, rebase
3. git merge - 명령어에 병합할 커밋 이름을 넣어 실행하면, 지정한 커밋 내용이 'HEAD'가 가리키고 있는 브랜치에 넣어집니다.
A브랜치에서 B브랜치를 병합한다 (= A로 B를 가져온다. A<-B)
: git merge {B브랜치명}
예시에서 본 test 브랜치를 master로 병합하고자 한다.
- fast-forward - 동일 내용이 포함되는 브랜치일 경우 브랜치 이동만으로 병합해서 따로 commit을 생성하지 않는 경우
- merge commit - 서로 다른 상태의 브랜치를 병합해서 새로운 commit을 만드는 경우
↓더 자세한 사항은 아래를 참고하자
https://yuja-kong.tistory.com/51
4. git rebase - base를 다시 지정하다라는 의미입니다.
깃크라켄에서 pull을 받으면 'Merge remote-tracking branch 'origin/youbin' into youbin'라고 뜬다.
이러한 경우 예쁜 상태가 아니므로 해결 방법은 "force push"이다.
(참고)https://milooy.wordpress.com/2015/12/15/git-rebase-push-error/
https://13akstjq.github.io/git/2019/07/24/Git-Rebase.html
↑ merge commit, fast-forward, rebase를 그림으로 잘 설명해주었다.
더 알고 싶은 사람은 참고하시길 바랍니다.
그럼 모두모두 재미있는 깃크라켄의 매력으로 퐁당퐁당 빠져봅시다!