git

신유빈·2023년 3월 3일
0

git의 특징

  1. 가지치기와 병합
    branch(가지) 마다 독립적으로 작업하다가 병합할 수 있음

  2. 가볍고 빠르다.

    svngit
    개발자들이 중앙서버에 접속하여 코드를 공유하는 방식, 네트워크가 필요작업자의 로컬에서 작업하기 때문에 네트워크 속도와 관련 없이 매우 빠르게 작업가능
  3. 분산 작업

    각각의 사용자들의 연결이 분절되어도, 통합관리자가 그 역할을 분담할 수 있다. 개발자들은 개발에만 집중하고, 통합관리자들은 병합하는데 집중하고.

  4. 데이터 보장
    깃은 데이터 무결성이 보장된다.
    체크썸 16진수문자열 commit-id
    16진수문자열이 동일하면 그 파일 또는 구성이 완전히 같다는 것.
    이를 통해서 누가 어느 부분을 작성했는지 알 수 있기 때문에 버전관리에 편리하다.

  5. 준비 영역
    staging area에서 검토 가능

  6. 오픈소스
    인터넷에 공개된 상태에서 프로젝트에 누구나 기여할 수 있음

git 호스팅 서비스

github, git bucket, git lab

git 설치

  1. git 설치 여부 확인

    • 리눅스 또는 맥os 에는 대부분 이미 git이 설치 되어 있습니다.
      터미널을 바로 열어서 git 이라고 입력해보세요. 실행되지 않는다면 git 을 설치 해주시면 됩니다.
  2. git 설치

  3. git 실행

    • linux, mac OS는 Terminal 실행
    • windows 에서는 Git bash 실행
  4. git 설치 확인

    • git version 명령어로 정상적으로 설치되었는지 확인하기
    	$ git version
    	git version 2.18.2(Apple git-113)

git 초기설정

  1. 사용자 정보 설정

    • 저장소에 코드를 반영할 때 등록될 사용자 정보를 설정합니다.
    • 여기서 설정한 정보가 github 나 gitlab에서 협업할때 사용됩니다.
    	$ git config --global user.name "elice"
    	$ git config --global user.email "elice@gmail.com"
    • 프로젝트마다 다른 사용자 정보를 지정하고 싶으면 저장소 생성 후 --global 옵션을 빼고 실행해주세요.
    	$ git config user.name "elice"
    	$ git config user.email "elice@gmail.com"
  2. 설정 정보 확인

    • git config --list 를 실행하여 앞에서 설정한 내용을 확인해보세요.
    	$ git config --list

fatal: not in a git directory
git 저장소가 시작되지 않은 상태에서는 유저 설정 시에 반드시 --global을 입력해야합니다. git 저장소를 만드는 방법은 다음 실습에서 배우게 됩니다.

git 저장소 생성

  1. 원래 있던 디렉토리 사용하기

    	$ cd elice
    	$ git init
      	Initialized empty Git repository
    	$ ls-al

    git repository가 초기화되어 생성됩니다.

        $ git init ./teaparty/elice
  2. 새로운 디렉토리 사용하기

    	$ mkdir world
    	$ git init mydir/world
        Initialized empty Git repository
        

git 저장소 반영

  1. 커밋하기
    staging하고 무엇을 수정하고, 추가했는지 메시지를 남기고 저장소에 저장하는 작업

    	$ git commit -m "안녕"
  2. 저장소에 반영한 내용 변경

    앞에서 적은 메시지에 오타가 있거나 누락된 파일이 있어도 걱정하지 마세요.
    커밋을 수정할 수 있습니다.

    	$ git commit --amend

    텍스트 편집기가 실행되고, 수정하고 싶은 부분을 수정 후 저장하면 그대로 반영됩니다.

  3. 저장소 반영 내역 확인하기

    커밋한 내용을 확인할 수 있습니다.

    	$ git log
  4. 커밋되는 내용
    commit 되는 내용은 다음과 같습니다.

    	$ git log
        
        Commit size 		커밋사이즈
        Tree 				파일트리
        Parent		
        Author 				어떤사람이 작성했는지
        Commiter 			커밋을 어떤 사람이 했는지
        HI~~ 				커밋 메시지

‘.’은 경로를 나타낼 때 현재 working 디렉토리를 의미하기도 하며
git 명령어 뒤에 붙었을 때 경로 내에 있는 모든 파일을 의미하기도 합니다.

git commit -m <커밋 메세지> 를 이용하면 에디터 없이 바로 커밋 메세지를 작성할 수 있어요.
만약 그냥 git commit이라고 적으면 nano에디터가 켜져요.
nano에디터에서는 Ctrl+X -> Y -> Enter 순서로 누르면 저장할 수 있어요.

git 관리 상태 확인

  1. 파일 상태 확인
    git 저장소 까지 저장을 완료하였으므로, 파일들의 상태와 history를 볼 수 있는 git status, git log에 대해 자세히 살펴 보겠습니다.

    git status
    staging file들의 상태 확인

    git log
    .git repository에 존재하는 history 확인

    git diff
    커밋된 파일 중 변경된 사항을 비교할때

    git history
    a522b 와 f1a14 파일의 스냅샷 확인 가능

    git log
    저장소 반영 내역을 확인할때 사용, 지금까지 커밋했던 모든 내용이 나옵니다.

     	$ git log -p				
        각 커밋의 수정결과를 보여주는 git diff와 같은 역할을 수행합니다.
        
     	$ git log --patch			
        각 커밋의 수정결과를 보여주는 git diff와 같은 역할을 수행합니다.
        
        $ git log -p -2 			
        상위 n개의 커밋만 보여줍니다.
        
        $ git log --stat 			
        어떤 파일이 커밋에서 수정되고 변경되었는지, 파일 내 라인이 추가되거나 삭제되었는지 확인 가능합니다.
        
        $ git log --pretty=oneline 	
        각 커밋을 한 줄로 보여줍니다.
        
        $ git log --graph 			
        커밋 간 연결 관계를 아스키 그래프로 출력해줍니다. 브랜치를 표시할 때 유용합니다. 
        
        $ git log -S function_name	
        코드에서 추가되거나 제거된 내용 중 특정 텍스트(위에서는 function_name)가 포함되어 있는지 확인해줍니다.(search)
  2. 원하는 파일만 커밋하기

    	git status
    	git reset HEAD README.txt
    	git add crawling.py rat.py
    	git status
  3. 저장소 만들기

    	$ cd myproject
    	$ git init
    	$ echo "print('Hello, Git!')" > main.py
    	$ git add main.py
    	$ git commit -m "hi"
  4. 새 파일 추가하기

    	$ git reset HEAD ann.py reference
    	$ git add cheshire.py README.txt application.py main.py
    	$ git commit -m "hi"
  5. 커밋 메시지 수정하기

    	```
    		$ git commit --amend -m "커밋 메시지 수정하기"
    명령어 뒤에 ```-m "수정할 커밋 메세지"```라고 작성하면 에디터를 켜지 않고 바로 메시지를 수정 가능합니다.
    git에서 사용가능한 editor는 vim, nano, emacs등등 여러가지가 있습니다. 현재 실습에서는 nano를 이용하여 commit 메세지를 수정하는 editor로 사용하고 있습니다.

git branch

브랜치를 이용하면 여러 작업을 독립적으로 진행할 수 있습니다.
각각의 브랜치는 다른 브랜치의 영향을 받지 않습니다.

master branch ------------> (배포)
develope branch -|-|-------> (개발)
topic branch ---|-> (기능 개발)

  1. git branch의 종류
    main branch 배포할 수 있는 수준의 안정적인 브랜치
    topic branch 기능 추가나 버그 수정과 같은 단위 작업을 위한 브랜치, 수시로 생성, 삭제 가능

  2. git bracn 생성
    아래 명령어로 생성 가능합니다.

    git branch 새브랜치

  3. git branch 전환

    현재 브랜치는 아래 명령어로 확인 가능합니다.

    	$ git branch 
    	  like_feature
        * master  		

    브랜치 전환은 아래 명령어로 가능합니다.

    	$ git checkout 이동할브랜치명
        Switched to branch '이동할브랜치명'

    체크아웃을 하면 master에서 like_feature 로 HEAD 포인터가 이동합니다.

    git checkout 브랜치명

    브랜치를 전환할 때도 사용 가능하고,

    git checkout <snapshot hash>

    git log로 확인한 snapshot을 넘나들때도 사용이 가능합니다. (hash는 16진수로 이루어져있습니다.) 이렇게 hash값을 이용하여 과거의 파일 내용을 확인할 수 있습니다.

    	$ git log --pretty=oneline
        e4abb6f... (HEAD -> master) this is master
        d97d387... another snapshot
        
        $ git checkout d97d387
        ...
        HEAD is now at d97d387 another snapshot
        
        $ git log --pretty=oneline
        e4abb6f... (master) this is master
        d97d387... (HEAD) another snapshot

fast-forword

git checkout like_feature

          master	HEAD->like_feature
  c1------c2------c3
  새로운 커밋을 하면 새로운 체크포인트가 생깁니다.	

like_feature 브랜치에서 작업을 끝마치고 master브랜치로 통합합니다.

	$ git checkout master
    Switched to branch 'master'
    
	$ git merge like_feature
    Updating d78ade4..a63hec2
    Fast-forward
     comment.js | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)

master 브랜치를 중심으로 like_feature를 병합합니다.

like_feature
master HEAD -> master
c1------c2------c3
마스터가 가진 모든 내용은 like_feature가 가진 내용과 동일합니다.

like_feature 브랜치의 내용이 master브랜치에서 업데이트된 내용이기 때문에 곧바로 merge가 되는 것을 확인할 수 있습니다.
master브랜치 내용에서 변경된 내용없이 새로운 내용만 추가 후 병합하는 것입니다.
이렇게 merge가 이루어지는 것을 fast-forward 라고 부릅니다.

갈라지는 branch

이번에는 각각의 Branch의 working directory에서 같은 파일의 내용을 다르게 수정해보겠습니다.

명심하세요. 각각의 브랜치는 다른 브랜치에게 영향을 받지 않기 때문에 여러 작업을 동시에 진행할 수 있습니다.

			like_feature		 c3 like_feature
    		HEAD -> master	   / 
  c1------------c2-----------<
  							   \ 
  								 c4 HEAD -> master
  
  파일을 동시에 수정했습니다.

master로 체크아웃 한 뒤 like_feature를 병합하면

$ git checkout master
Switched to branch 'master'

$ git merge like_feature
Merge made by the 'recursiver' strategy.

like_feature의 내용을 master가 받아들입니다. 아까와 달리 like_feature와 master는 다른 체크포인트를 가르키고있습니다.

git branch --merged 를 사용하면 merge된 브랜치를 한눈에 볼 수 있습니다.

$ git branch --merged
  like_feature
* master

보통 기능개발이 끝나면 해당 토픽 브랜치는 삭제하는 관행이 있습니다.
git branch -d like_feature 를 사용하면 브랜치를 삭제할 수 있습니다.

Merge Conflict

  1. 발생 이유
    merge한 두 브랜치가 같은 파일을 변경했을 때 충돌이 일어납니다.

    <<<< elice
    console.log('hello world')
    ===========
    console.log('hi world')
    >>>> madhatter
  2. 해결 방법
    git status 명령으로 어느 파일에서 충돌이 발생했는지 확인합니다.
    직접 파일을 수정 한 후 git add, commit하면 됩니다.

  3. 예방 방법
    master브랜치의 변화를 지속적으로 가져가서 충돌이 발생하는 부분을 제거하는 것. 하지만 제일 좋은 방법은 master브랜치가 자주 변경되는 일이 없게 하는 것입니다.

    왜냐하면 master브랜치는 배포가 가능한 안정적인 버전만을 가지고 있어야하기 때문입니다.

git 원격저장소

  1. git 원격저장소 받아오기

    git clone
    원격으로 존재하던 기존의 git repository를 복사

    원하는 프로젝트에 가서 clone 버튼을 누른다.

    [ ] clone with SSH
    [o] clone with HTTPS

      $ git clone 원격저장소주소

    내 컴퓨터에 원격저장소에 있던 내용의 사본이 생성됩니다.

  2. 원격 저장소 추가

      $ git remote add origin 원격저장소주소

    저장소 주소는 다음과 같이 구성됩니다.

    https://웹호스팅서비스/그룹명/프로젝트명
    https://gitlab.com/group/project

    git remote
    연결된 원격저장소가 어디인지 확인해 볼 수 있습니다.

    git remote show origin
    어떤 원격 저장소가 있는지 살펴볼 수 있습니다. git clone으로 저장소를 복사한 뒤, 그 저장소를 원격저장소와 연결하고 있습니다.

  3. 원격 저장소 이름 변경

    원격 저장소 단축이름을 origin에서 git_test로 변경해보겠습니다.

      $ git remote rename origin git_test
  4. 원격 저장소 삭제
    주소가 변경되었거나 더이상 필요가 없어진 저장소는 아래의 명령어로 삭제 가능합니다

      $ git remote rm git_test

원격 저장소 동기화

  1. 저장소 갱신

    pull 원격저장소에서 데이터를 가져오면서 자동으로 병합(merge)까지 해주는 명령어입니다.
    fetch 원격저장소에서 데이터를 가져오기만 하고, 병합은 별도로 진행되어야합니다.

  2. pull

    원격 저장소에서 데이터를 가져와 로컬 데이터를 병합합니다.

      $ git pull
      $ git log --all
      commit f7b773d (HEAD -> master, origin/master)

    로컬 저장소의 마스터브랜치와 원격저장소(origin)의 마스터브랜치가 병합되었다

  1. fetch

    git log 명령어로 변경된 파일을 확인하고, merge 해줍니다.

      $ git log origin/master
      commit f7b773d (HEAD -> master, origin/master)
      
      $ git merge origin/master
  2. 저장소 발행

    push

    로컬저장소에서 작업한 내용을 원격저장소에 반영할 수 있습니다.
    다른 사람이 먼저 push한 상태에서는 push 할 수 없습니다.
    다른 사람이 작업한 것을 pull이나 fetch로 병합(merge)한 후에 push할 수 있습니다.

pull과 fetch는 원격저장소의 내용을 가져올 수 있습니다.

git pull이 이루어지지 않는 경우는 보통 다른사람이 올린 commit의 내용과 내 컴퓨터에 존재하는 내용이 서로 충돌할 때입니다.
이러한 현상은 하나의 브랜치에서 여러 사람이 동시에 작업하면 발생할 확률이 높아지게 됩니다.
따라서 여러 개의 브랜치를 나누고 각자 브랜치에서 작업한 후에 웹호스팅 서비스에 존재하는 merge request로 하나씩 합쳐가는 방식을 사용하면 충돌이 일어나는 것을 막을 수 있고 매번 새롭게 merge해야하는 수고를 덜 수가 있습니다.

origin 이란?

내 컴퓨터 안 로컬저장소와 원격저장소를 연결할 때 다음과 같은 명령을 사용했습니다.
이는 원격 저장소의 단축이름을 origin으로 지정한다는 의미입니다.

 $ git remote add **origin** 원격저장소주소

ㄴ git remote를 origin이란 이름으로 add해줄게~

이때 origin이 아닌 다른 이름으로 원격저장소 이름을 지정해줘도 됩니다.

 $ git remote add myproject 원격저장소주소

그런데 기본적으로, 원격저장소의 이름은 origin이 default값입니다.
그렇기 때문에 clone으로 복사해온 저장소 이름은 origin으로 통일되게 됩니다.

-v 옵션을 사용하면 지정한 저장소의 이름과 주소를 함께 볼 수 있습니다.
git remote -v

    $ git remote -v
    origin https://gitlab.com/group/project (fetch)
    origin https://gitlab.com/group/project (push)

0개의 댓글