관리 메뉴

A seeker after truth

Git 기본 - add,commit,push,branch,pull-request,merge 등 본문

Git

Git 기본 - add,commit,push,branch,pull-request,merge 등

dr.meteor 2019. 10. 6. 16:24

* 본 글은 리얼 리눅스에서 진행한 <Git, 어디까지 써봤니?>(유료 강좌)에서 실습 위주 강의를 수강한 후 한 사이트(https://rogerdudler.github.io/git-guide/index.ko.html)를 참고하여 배운 내용을 정리, 기록한 것이다.

 

add : 커밋할 목록에 추
commit : 커밋 ( 히스토리의 한단위 ) 만들기
push: 현재까지 역사 (commits) Github 밀어넣기

 

commit: 깃 저장소에 내 폴더에 있는 모든 파일에 대한 스냅샷을 기록하는 것. 변경 사항의 모음이 아닌 하나의 최종 코드 모음. 디렉토리 전체를 복사하여 붙여넣는것과 유사하지만, 훨씬 유용한 방법이다.

Git은 가능한 한 커밋을 가볍게 유지하고자 하기 때문에, 커밋할 때마다 디렉토리 전체를 복사하진 않는다. 각 커밋은 저장소의 이전 버전과 다음 버전의 변경내역("delta"라고도 함)을 저장한다. 그래서 대부분의 커밋이 그 커밋 위의 부모 커밋을 가리킨다.

저장소를 복제(clone)하려면 모든 변경분(delta)을 풀어내야 한다. "resolving deltas" 명령을 통해 결과를 볼 수 있다.

 

 

branch: 안전하게 격리된 상태에서 무언가를 만들 때 사용한다. 저장소를 만들면 master 가지는 기본으로 만들어진다. 따라서 다른 가지를 이용해 개발을 진행하고, 개발이 완료되면 master 가지로 돌아와 병합한다.

git checkout -b (가지 이름): (가지 이름)이란 가지를 만들고 그 가지로 갈아탄다. 브랜치 작성과 체크아웃을 한꺼번에 실행
git checkout master: 당연 master 가지로 돌아오는 명령

git branch -d (가지 이름): delete 준말인가보다. 가지를 삭제하는 명령이다.

내가 새로 만든 가지를 원격 저장소로 전송하기 전까진 다른 사람들이 접근할 수 없다.

 

 

commit한 내용을 원격 서버 즉 깃허브 저장소로 올리는 명령: git push origin (branch명)

다만 기존에 있던 원격 저장소를 복제한 것이 아니라면 원격 서버의 주소를 git에게 알려줘야 한다. : git remote add origin <원격 서버 주소>(혹시 fork 해온 게 아닌 경우? 그리고 자기 계정에 자기가 쓸 폴더 만들어둔 경우? 그리고 거기서 fork해온 적이 한번도 없는 경우?)

 

 

나의 로컬 저장소를 원격 저장소에 맞춰 갱신하는 것이 바로 pull이다: "git pull". 이렇게 하면 원격 저장소의 변경 내용이 로컬 작업 디렉토리에 받아지고(fetch), 병합(merge) 된다. 다른 가지에 있는 변경 내용을 현재 가지(예를 들어, master 가지)에 병합하려면 "git merge <가지 이름>을 실행하면 된다.

그런데 위 두 가지 명령 모두 git은 자동으로 변경 내용을 병합하려고 시도한다. 그러나 항상 성공하는 게 아니라 충돌이 일어나기도 한다.

이런 경우 git이 알려주는 파일의 충돌 부분을 직접 수정해서 병합이 가능하도록 해야 한다. 수정을 한 후 "git add <파일 이름>"으로 아까의 파일을 병합하라고 알려줘야 한다. 병합하기 전, "git diff (원래 가지) (비교 대상 가지)"를 이용해 바뀐 부분을 비교해볼 수 있다.

 

 

로컬 변경 내용 되돌리기: "git checkout -- (파일 이름)". 실수로 뭔가 잘못했을 때 쓰면 된다. 이 내용은 로컬의 변경 내용을 변경 전 상태(head)로 되돌려준다. 단, 인덱스에 추가된 변경 내용과 새로 생성한 파일은 그대로 남는다.

단, 로컬에 있는 모든 변경 내용과 확정본을 포기하려면 "git fetch origin" 명령으로 최신 이력을 가져오고, "git reset --hard origin/master" 명령으로 로컬의 master 가지가 그 이력을 가리키게 할 수도 있다.


[1주차 실습 내용]

 

미리 캐치저장되어 있을지 모를 계정정보 삭제 ( 처음 설치 시 생략)

# git config --global --unset credential.helper

# git config --system --unset credential.helper

 

git 명령을 다룰 폴더로 이동한 뒤 해당 폴더를 git 초기화

# git init

 

소스 코드 파일추(커밋할목록에추add)

# git add report_card.c

 

commit 하기
# git commit -m "report card"

**one line message 를 남길때는 -m 옵션을 주고 메시지를 쓰면 된다. 원라인으로 하고 싶지 않은 경우 -m 옵션을 빼고 "git commit" 만 치면 vi 입력창이 뜬다.

 

상태를 확인한다

# git status

 

commit3 폴더에 있는 report_card.c 소스 파일로 수정 , 덮어쓰기 후 확인

# git diff

 

지금까지 한 commit 들을 확인하자

# git log

 

서명과 함께 commit 한다. (-s 옵션으로 서명을 포함한다.)
# git commit -sm "report card: Show the sum of each grade"

 

* 서명의 의미는 본 오픈소스의 라이센스를 제대로 이해하고 작성한 commit 이라는 확인 서명( 주로 리눅스 커널에서 commit 을 공식적으로 만들때 많이 이용된다)

 

지금까지 한 commit 들을 확인하자

# git shortlog

 

github repository 즉 원격 저장소를 생성한 뒤, 지금까지의 commit을 push하자

 

복사한 URL Github 원격저장소 등록

# git remote add origin < 복사한 URL>

 

Github 원격 저장소 (origin) 에다밀어 넣자 .

# git push origin master

 

이제 깃허브 commit 항목으로 들어가면 지금까지 추가한 commit들이 나오는 것을 확인할 수 있다.

 

여기서, 가장 최근에 추가한 커밋을 수정하려고 한다면,

# git commit --amend

*vi 에디터또는지정된에디터(메모장등) 이열릴수있다. Commit 메시지를 수정하거나 수정없이 에디터를 닫으면 완료

 

바로 push 해보자 (충돌 오류 발생)

# git push origin master

* Local(본인 노트북, PC) 에 기록된 commit 들과 Github 에 먼저 push 하여 저장된 commit 들의 commit ID 일치하지 않는 부분이 있기 때문에 충돌이 발생한다. 이미 한번 push를 했으니...

* 물론 모든 commit ID 일치한상태에서 Local 에만 새로운 추commit 있을때는 push

 

강제로 push 해서 수정하자 (--force -f 옵션 사용 가능)

# git push origin master --force

 

 

이번엔 add한 것을 취소해보려고 한다.

touch로 빈 파일 생성하고 add하자 (;로 명령어들을 연속적으로 실행할 수 있다)

# touch test; git add test

 

현재상태 확인해보고 # git status

 

reset 으로 add 한거 소해보자 # git reset

 

현재 상태 다시한확인해본다 . # git status

 

이번엔 commit 기록을 없애보자.

아까 test 파일 여전히 재하는지 확인 ( 으면 다시만들기 )

# git status

 

임의로 실수의 commit을 만들어.

# git add test; git commit -sm “test”

 

그리고 push 까지 해서 Github에 있는 tree까지 실수 commit을 넣어버다. //여기 이해가 안되는데...?

# git push origin master

 

그리고 장 최commit을 지운다.

# git reset HEAD~1 //여기서 reset이란 용어가 조금 부적합한 용어라는 부연 설명 해주심. 그럼에도 불구하고 명령어를 reset이라 명명했다고.

 

강제Github 에 있는 tree 도 밀어넣어서 수정한다.

# git push origin master --force

* Github 에 있는 commit 을 수정할 길은 Local 에서 수정후 -f 옵션으로 push 하는 방법 이다 .

 

 

<Advanced 실습>

풀리퀘 하는 법!

Pull-request 한다는 의미: 다른 프로젝트만든 commit을 제출한다는 의미 (실제 전송 단위는 branch).

상대방 프로젝트를 fork( 복사 ) 해서 내 계정에서 관리되는 프로젝트로 롭게 만들어 두고 fork github 프로젝트를 토대로 새로운 commit 내용들을 pull-reqeust 할 수 있다.

 

자기가 fork해오길 원하는 그 프로젝트에 들어간 뒤, fork 버튼을 누른다. 그러면 나의 원격저장소가 추가된다. 이 복사된 프로젝트 페이지에서 Clone or download 초록색 버튼 클릭 -> fork 해서 만들어진 본인 repo URL 복사

 

clone으로 forkrepo 아오기

# git clone < 아까 fork repo 에서 복사한 URL>

 

clone한 프로젝트 폴더로 이동한 뒤, pull-request 할 브랜치(develop) 따로 만들기

# git checkout -b develop

*브랜치 성이란 간단한 비유로 “같은 폴더에 또다른 세상 열기”라 부연 설명해주심

 

프로젝트 폴더 속 한 폴더 '폴더1'이 있다 하면, 이 폴더로 이동.

이 폴더 안에 작업을 위해 또 한 폴더를 만들어, 이 폴더로 이동한 뒤, # mkdir 폴더명; cd 폴더명

 

한 폴더(한 소스 내용) add

# git add (나의 소스작업폴더)

 

준비된 파일들 commit

# git commit -sm “test pull request”

 

forkrepodevelop 브랜치로 push (주의: master 아님)

# git push origin develop

 

나의 프로에서 fork해서 만들어진 프로젝트 페이지로 이동

-> 방금 Push 했던 브랜치를 확인하기 위해서 Branch 탭 클릭

-> Pull-request 하려는 브랜치에서 New pull-request 버튼을 클릭

-> fork한 저장소에서 pull-reqeust 버튼 누르기 (아니면 pull-requests 탭에서 Create pull-request 누르기)

-> 본래 프로젝트 페이지에서 만들어진 pull-request 확인하기

 

 

<merge로 두 브랜치 합치기>

방금 작develop 브랜치현재 브랜치인지 확인하자 (status로도 확인 )

# git branch

 

브랜치 만들어보자

# git checkout -b test

 

touch로 빈 파일 하나 만들어서 commit 만들어보자

# touch test; git add test; git commit -sm “test”

 

현재 브랜치 (develop) 을 기준으로브랜치 (test) 치자

# git checkout develop; git status; git merge test

 

 

'Git' 카테고리의 다른 글

[gitlab(vcs)] 2개 이상의 local branch가 synchronized 되는 문제 해결  (0) 2023.07.05
오픈소스 기여하기  (0) 2019.10.23
Rebase 집중 공략  (0) 2019.10.21