본문 바로가기

Git

Git 실습

Git 설치 및 세팅 

 

Git을 이용하려면 두가지 방법이 있다.

  • SourceTree라는 Git GUI 툴을 이용한 Git
  • Git Bash를 이용한 Git

 

1. Windowgit을 따로 설치해줘야한다 (mac은 기본적으로 깔려있음)

 

 https://git-scm.com/download/win

 

따로 설정할 것 없이 계속 다음 누르다가 마지막에 Git Bash 에 체크해주기

 

 

 

 * README  : git repository에 대한 기본적인 설명 - 프로젝트 설명, install, 라이센스 정보, 만든이, 수정하고싶으면 어디로 연락하세요 이런 설명이 들어가있음

 

* Clones with https : 아이디랑 비번 입력해서 접근을 하는 방식

 

 

2. 설치 완료 후 자신의 이름 / 이메일 (나중에 못바꾸니깐 신중하게) 세팅

 

Rim@rims MINGW64 ~
$ git config --global user.name "Kim Arum"

Rim@rims MINGW64 ~
$ git config --global user.email "a5612@gmail.com"

 

3. C:\Users\Rim  - 자신이 원하는 경로에 앞으로 작업할 폴더를 생성 - hanium_test


Rim@rims MINGW64 ~ 
$ mkdir hanium_test

Rim@rims MINGW64 ~
$ cd hanium_test/

 

4. 복사해둔 URL 클론해오기

 

위에서 cd 명령어를 줬기 때문에 경로가 rims\hanium_test로 맞춰짐


Rim@rims MINGW64 ~/hanium_test
$ git clone https://lab.hanium.or.kr/a5612/test.git
Cloning into 'test'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done. 

 

 


기본 실습

가장 많이쓰는 git 명령어
# git status

# git add

# git commit 

# git push

 

# git touch  -- 해당 경로에 빈 파일 생성 ( .txt)

# git show 

# git log -- 각 커밋별로 커밋 ID와 함께 상세 정보가 뜸

# git shortlog -- 각 커밋메세지와 함께 짧은 로그만 뜸

 

# git diff -- 로컬저장소에 있는 파일을 수정만 해도 git diff 명령어를 쳐주면 차이점이 잡힘

이런식으로 이전 파일과의 차이점이 + 혹은 - 표시로 보임.

 

 

상황별 명령어 정리 

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

(원격에 push까지 마친 상황)

 

가장 최근 커밋을 지운다.

# git reset HEAD~1

 

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

# git push origin master --force

 

 

 

 

1. GitLab에 파일 올리기

hanium_test 폴더 아래 test란 폴더를 만들어서 소스파일 2개 생성 (world.txt, hello.txt만 새로 만들었다고 가정)

 

이미 몇개 추가된거라 경로만 참고

 

 

요청대로 git add 명령어를 줌

(참고) $ git add . = 모든 파일을 staging area에 올려라 

 

git status를 확인해보면 hello.txt만 stage에 올라가고 world.txt는 안올라간 상태란 걸 알려줌

 

world.txt까지 git add해주고

두 파일 다  staging area에 올린 상태

 

hello.txt를 다시 staging area에서 내려보기

 

다시 내려간 걸 확인 가능

 

다시 전체 올려준 다음에

 

commit msg와 함께 commit 해주기 

commit msg를 따로 주지 않으면 없는채로 GitLab에 올라감

 

그 상태에서 git status를 확인해보면,

내 branch가 origin보다 1 commit 앞서 있다는 메세지가 뜸

( 내 로컬 commits를 use "git push" 하라고 알려줌 = GitLab에도 동기화를 하라는 의미) 

 

$ git push 명령어를 내리면 gitLab에도 commit한 두 파일이 올라가 있는 걸 볼 수 있음

 

 

 

2. 파일 삭제하기 

해당 디렉토리로 가서 world.txt를 삭제 완료 후 

 

git status로 확인  - git add 명령어를 내리라고 알려줌

 

위에 소스파일을 올리던 작업과 동일하게 

add -> commit -> push 해줌

 

GitLab에서도 삭제까지 완료된 것을 확인 가능 


3. Branch 병합하기 (master가 다른 사람이 소스파일 올리기를 요청한 걸 merge를 해주는 상황)

 

A. 내가 하위 엔지니어인 상황, 내가 만든 개발 파일을 올리려 함

 

새 branch 만들기

$ git checkout -> branch끼리 이동할 때 쓰는 명령어

* feat : 새로운 기능을 만들겠다, 버그 고치기 (만들면 새로운 브랜치로 자동으로 경로 옮겨짐)

 

 

branch가 (master)에서 (feat/add_landing)으로 옮겨간 상태인 걸 볼 수 있음

 

 

새로운 소스를 개발한 상황 (landing.txt)

 

 

$ git status 명령어를 줘보면 staging area에 올리라고 되어있는 상태

 

staging area에 올린다

 

commit 후 push까지 해줌

git push --set-upstream origin feat/add_landing 을 하라고 권유함

*upstream : gitLab을 의미함 (origin에 feat/add_landing branch가 없었지만 그걸 생성함과 동시에 내가 올린 소스파일까지 같이 올리가는 것)

 

해주면 완료됨

 

GitLab의 Graph 코너로 가보면, add landing feature라는 새 branch가 생김

화살표 < 있는곳이 master 가 현재까지 있는 영역

add landing feature 라는 새로운 branch까지 같이 올라와 있는걸 볼 수 있음 ( 이 영역에서 master로 가거나 다른 branch로 접속하거나 변경 가능)

 

 


B.   Merge Request(MR) 보내는 방법  (github에서는 pull request(PR) 이라함)

master입장에서 하위엔지니어가 올린 파일을 병합요청 할 것임

 

master로 branch 다시 옮기기

 

master가 button.txt란 새 파일을 만들고 push까지 마친 상황

 

이 상태에서 GitLab의 병합요청 코너에서 master와 feat/add_landing 두 branch를 병합진행 

Source branch : 병합할 branch 

Target branch : 어느 branch에다가 병합을 할 것인지

 

병합요청 진행 중에 master가 코드리뷰를 달 수도 있음 ( 이 부분에는 script가 아니라 ajax를 썼으면 좋았겠네요 이런식으로 )

?change > click > discussion 하고

resolve를 만들지 않으면 못함 ?

 

 

전체 Merge가 완료가 되면 내 local에서도 그 변경된 사항 (추가된 파일)을 업데이트 시켜줘야함

* git pull 은 아침에 습관적으로 하면 됨 (다른사람이 그동안 뭐했나 한꺼번에 받아볼 때)

 


4. conflict 발생

(같은 파일을 다른 사람들이 동시에 접근해서 고치려 할 때) 

* 다른 파일들을 고치려고 할 때는 충돌은 안남

 

a. 같은 파일 고쳐도 충돌이 안나는 경우

 

b. 같은 파일 고쳐도 충돌이 나는 경우 = 같은 라인 고쳤을 때 

마스터 : login.txt 라는 파일을 올린 상황

하위 엔지니어: fix/login이라는 branch를 새로 파서 login.txt 를 수정하고 commit, push까지 완료한 상태

 

수정했을 때 이렇게 뜸

마스터: login.txt를 수정하고 push까지 완료함

이제 fix/login branch에서 master를 merge 하려 하는데, 충돌이 났다고 뜸

 

 

 

 

Resolve conflicts 클릭

 

 

 

상태를 보니 login.txt가 양쪽에서 수정된 상태

 

 

login.txt 파일에 직접 가서 일일이 엔지니어가 수정한 것, 내가 수정한 것을 비교한 다음 저장

*Incoming Change : 남이 고친거

Current Change : 내가 고친거 (master)

 

수정 완료 후 

똑같이 add, commit, push

 

-> 알아서 merge됨 

 

 

 

 

 

* $git log 여태까지 로그 보는 명령어