본문 바로가기
TIL/엘리스 SW 엔지니어 트랙 2기

[1주차] 20220408 엘리스 TIL (Github)

by VANAV 2022. 4. 13.

1장. Git 이란?

  • git = 효율적인 협업을 위해 사용
  • git은 각각의 파일을 스냅샷 형태로 저장함.

* Git의 특징

  1. 가지치기와 병합 - 여러가지의 작업을 섞이지 않게 독립적으로 진행할 수 있음
  2. 가볍고 빠르다 - git은 모든 작업이 로컬에서 진행된다. subversion(SVN)과의 차이점 (SVN = 항상 네트워크가 필요(코드가 서버에 올라가있고, 사용자들이 접속해서 열람함) / git = 코드를 공유할 때만 네트워크에 접속(사용자들이 각자 모든 코드를 가지고 있음))
  3. 분산작업에 매우 효율적
  4. 데이터 보장 - 모든 파일은 체크섬이라는 검사를 거침(체크섬 = 16진수 문자열(=commit id)로 이루어짐 -> commit id가 같다? = 파일 or 구성이 완벽히 같다는 것 => 누가 어떤 파일을 작업했는지 기록이 남아서 버전관리에 편리)
  5. 오픈소스
  6. 준비영역을 가지고 있다(staging area)

git add(추가) / git commit(파일을 저장소에 반영)

 

* git 호스팅 서비스 (원격저장소) 3가지

  • Github
  • Bitbucket
  • Gitlab

** Git 설치

1. Git 설치 여부 확인

  • Linux 또는 macOS 환경에서는 대부분 이미 Git이 설치되어 있습니다.
  • 다음 이미지를 참고하여 Terminal 실행 후 git 명령어를 실행해 보세요(설치확인)
  • windows 환경에서는 다음 단계로 넘어가주세요
  • terminal 실행, git 입력 후 엔터

이미지와 같이 실행되지 않는다면(오류 메시지가 뜬다면) git을 설치해 주세요

 

2. Git 설치

  • 아래의 사이트 접속 후 본인에게 맞는 설치파일 다운로드
  • https://git-scm.com/downloads  
  • 다운로드 된 설치파일 실행

3. Git 실행

  • Linux 또는 macOS = Terminal 실행
  • windows = 시작메뉴 -> Git -> Git Bash 실행

4. Git 설치 확인

  • 명령어를 입력하여 Git 버전을 확인해보기
  • $ git --version

** Git 초기 설정(설치 후 초기설정하는 단계도 필요하다)

1. 사용자 정보 설정

  • 저장소에 코드를 반영할 때 등록될 사용자 정보를 설정합니다
  • $ git config --global user.name "elice"
  • $ git config --global user.email gitaccount@elice.com
  • 프로젝트 마다 다른 사용자 정보를 저장하고 싶으면 저장소 생성 후 --global 옵션을 빼고 실행해 주세요!
  • $ git config user.name "elice"
  • $ git config user.email gitaccount@elice.com

2. 설정 정보 확인

  • 아래의 명령을 실행하여 앞에서 설정한 내용을 확인해보세요
  • $ git config --list
  • ☆ git 저장소가 시작되지 않은 상태에서는 유저 설정시에 반드시 --global을 입력해야 합니다 => 하지 않고 바로 " git config user.name " 으로 명령하면 " fatal: not in a git directory " 으로 에러 메시지가 뜸

** Git 저장소 생성

  • git init = 기존의 디렉토리를 git repository로 설정
  • 기존 디렉터리 사용 - git을 사용할 프로젝트 폴더로 이동 후 아래의 명령어를 실행해주세요 => $ git init => 그럼 레파지토리가 초기화 되었다는 메시지가 뜸(Initialized empty Git repository ~ ) => 프로젝트 디렉토리에 .git 디렉토리가 생성되며 저장소 생성 완료.

** ls -al

  • 안에 들어있는 모든 파일 출력해서 git 파일(git init을 하면 자동으로 생긴다)이 들어있는지 확인하기
  • ls -a => ' . ' 으로 시작하는 파일이나 디렉토리는 숨김처리되어서 일반적으로는 볼 수 없지만, ls -a 라는 명령어를 사용해서 숨겨진 내용까지 모두 확인 가능(git init 하면 .git 이라는 디렉토리(폴더)가 새로 생성됨)
  • ls -alls -a 의 차이점 : https://dasima.xyz/%EB%A6%AC%EB%88%85%EC%8A%A4-ls-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%98%88%EC%8B%9C/  

* 여러개의 git 저장소 생성하기

  1. 현재 어떤 파일이 있나 확인 " ls " - 참고 : ls 와 ls -a 의 차이 및 리눅스 명령어들 https://coding-factory.tistory.com/748
  2. " git init project1 " - project1 이라는 이름의 저장소 생성
  3. " cd mydir " - mydir 라는 저장소로 이동
  4. " git init hello " - 이동한 곳에 hello 라는 저장소를 만듦
  5. " cd world " - mydir 의 world 라는 저장소로 이동해서
  6. " git init world " - world 라는 이름의 저장소 생성

2장. Git 시작하기

1. Git 파일 생성

*** Git의 파일 영역의 라이프 사이클

  • working directory = 우리가 알고있는 일반적인 directory
  • staging area = 준비영역
  • repository = 최종적으로 등록

** 파일의 상태 라이프 사이클

  • untracked = 파일이 working directory 에 있을 때
  • modified = 뭔가 수정이 되었을 때
  • staged = untracked, unmodified, modified 에서 파일을 git add로 추가했을 때
  • unmodified = staged 에서 파일을 commit 하면 unmodified 로 이동
  • unmodified 에서 파일을 지우면 untracked 됨
  • unmodified 에서 파일을 수정하면 modified 됨

* 새로운 파일 생성

  • 먼저, 새로 생성된 파일인 comment.js 파일을 준비영역(staging area)으로 보내야 합니다. -> git add 명령어를 사용합니다.
  • git add comment.js
  • 한번에 추가할 파일이 너무 많다면 현재 폴더를 대상으로 지정할 수도 있습니다
  • git add .

* staging 상태 확인

  • git status 명령어로 staging area의 어떤 파일이 변경되었는지 등 파일의 상태를 확인 할 수 있습니다
  • git status

2. Git 저장소 반영

  • comment.js 파일 작업을 staging 하였으므로 이제 무엇을 수정하고 추가했는지 메시지를 남겨 저장소에 저장하는 작업을 진행합니다
  • git commit = .git 저장소 내에 staging 파일 저장
  • 저장소 반영 - 준비 영역에 있는 파일들을 저장소에 반영하겠습니다. 생략 가능하지만 반영한 내용을 추후에 쉽게 알 수 있도록 적절한 메시지를 넣어주세요
  • git commit -m "initial commit"
  • 위처럼 git commit에 옵션 m을 이용하여 즉시 메시지를 작성할 수 있습니다.(협업에 도움)

** 저장소 반영 내용 변경

  • 앞에서 적은 메시지에 오타가 있거나 누락된 파일이 있을 경우
  • git commit --amend
  • amend 옵션을 활용하여 commit을 수정할 수 있음
  • git commit --amend를 사용하면 텍스트편집기가 실행되고, 수정하고 싶은 부분을 수정 후 저장하면 그대로 반영됩니다

** 저장소 반영 내역

  • 저장소 반영 내역이 궁금하다면 = git log 로 확인 가능
  • git log 를 사용하여 모든 commit 을 확인할 수 있습니다
  • commit sadhjhsdu89281093eoisdjl(뭐라뭐라 적혀있음) - 커밋 아이디(각자의 커밋이 고유하게 갖고있는 하나의 값)
  • log 공백 사이에 적혀있는 메시지 = 커밋 메시지(어떤 내용을 커밋했는지 알 수 있다)

* Git history

* Git 관리 상태 확인

  • 파일 상태 확인 => git status / git log = 파일들의 상태와 history를 볼 수 있다
  • git status = staging file(준비영역에 있는 파일들)들의 상태 확인
  • git log = (commit history 확인) git repository에 존재하는 history 확인
  • git diff = commit 된 파일 중 변경된 사항을 비교할 때
  • Git history(이건 명령어 아님) = 스냅샷의 형태로 파일들을 갖고있고, 백업본이 있거나 다른 버전으로 돌아가고 싶으면 git history를 이용해 해당 파일을 불러올 수 있다
  • ** log 명령어 = 저장소 반영 내역을 확인하기 위해 우리는 log 명령어를 사용해 왔다(사용하면 이때까지 commit 했던 모든 내용들이 나오므로)
    • 대표적인 log 옵션들
    • git log -p / git log --patch = 각 commit의 수정 결과를 보여주는 diff와 같은 역할을 수행한다
    • git log -n = 상위 n개의 commit만 보여준다
    • git log --stat = 어떤 파일이 commit에서 수정되고 변경되었는지, 파일 내 라인이 추가되거나 삭제되었는지 확인
    • git log --pretty=oneline = 각 commit을 한 줄로 출력
    • git log --graph = commit 간의 연결된 관계를 아스키그래프로 출력한다(branch가 나오면 유용히 사용가능)
    • git log -S function_name = 코드에서 추가되거나 제거된 내용 중 특정 텍스트(여기서는 function_name)가 포함되어 있는지 검사

* 커밋 메시지 수정하기

  • 순서 = git log - git commit --amend -m " ~ " - git log
  • 명령어(amend) 뒤에 -m "수정한 커밋 메시지" 라고 작성하면 에디터를 켜지 않고 바로 수정이 가능함
  • git에서 사용 가능한 editor는 vim, nano, emacs 등등 여러가지가 있다. 엘리스 실습에선 nano를 이용하여 commit 메시지를 수정하는 에디터로써 사용하고 있다.(+ nano의 내용 저장방법 = Ctrl + X + Y + Enter)

 

3장. Git 가지치기

** Git Branch

  • 독립적으로 어떤 작업을 진행하기 위한 개념
  • 각각의 Branch는 다른 Branch의 영향을 받지 않음(독립적)

** Git Branch 종류

  • 메인 Branch = 배포할 수 있는 수준의 안정적인 Branch
  • 토픽 Branch = 기능추가나 버그수정과 같은 단위작업을 위한 Branch (수시로 생기고 없어짐)

** Git Branch 생성

  • git branch <브랜치 이름>
  • master branch = 최초로 갖고있는 기본값 브랜치

** Git Branch 전환 (1)

  • 현재의 Branch는 아래의 명령어를 통해 확인 가능
  • git branch

** Git Branch 전환 (2)

  • Branch 전환은 아래의 명령어를 통해 할 수 있다
  • git checkout like_feature
  • checkout을 하게 되면 master에서 like_feature로 HEAD 포인트가 이동하게 됨 (HEAD가 가리키고 있는 곳이 현재 branch이다.)

** Git Navigation

  • checkout은 branch를 전환하는데 사용할 수도 있고 아래와 같이 git log로 확인한 snapahot을 넘나들때도 사용이 가능하다
  • git checkout <snapshot hash> - 16진수로 이루어진 hash를 적어주면 이동할 수 있다 (ex> git checkout d97d38)
  • 이렇게 snapshot의 hash값을 이용하여 과거의 파일 내용을 확인할 수 있다

** fast-forward 방식의 병합

 * Git merge

  • 먼저 master branch로 이동하여 (git checkout master) like_feature branch를 병합함 (git merge like_feature)
  • 그러면 like_feature branch의 내용이 master branch에서 업데이트 된 내용이기 때문에 곧바로 merge가 되는 것을 확인할 수 있다. 이렇게 merge가 이루어지는 것을 fast-forward 라고 부른다.
  • (요약 - master branch에서 다른 변경된 내용 없이 새로운 사항만 추가된다면 fast-forward)

** 갈라지는 branch

  • 각각의 branch는 다른 branch의 영향을 받지 않기 때문에 여러 작업을 동시에 진행할 수 있다
  • git log --graph --all 을 사용하면 commit graph를 확인할 수 있다

 |
 |   /
○\
 |   ○
○   |
 |   /
merge 하기 전(열림) merge 하고 난 후(닫힘)

** Git branch 삭제

  • 보통 토픽 Branch는 사용을 마치면 삭제해주는 것이 일반적
  • 사용을 마친 branch는 git branch -d <branch name> 을 이용하여 삭제할 수 있다

** conflict 해결

  • Git Merge conflict
  • 충돌이 발생하는 이유 = merge한 두 branch에서 같은 파일을 변경했을 때 충돌이 발생
  • 예시 : like_feature와 HEAD->master가 같은 파일을 동시에 건드리면 git에서는 master의 파일을 쓸지 like_feature의 파일을 쓸지 고민이 되고있는 것 => 이에 conflict 알림을 통해 사용자에게 어떤 내용으로 확정할지 정해달라 요청하는 것이다.
  • git status 명령어로 어느 파일에서 충돌이 발생했는지 확인이 가능하다(  both modified :       comment.js  <- 이런 형식으로 뜬다)

** Git merge 충돌 해결

  • conflict 수정 완료 후 git add, git commit 과정을 거쳐 다시 merge 해줘야 함  

** Git merge 충돌 방지

  • master branch의 변화를 지속적으로 가져와서 충돌이 발생할 부분을 제거

 

4장. Git 원격저장소

* 원격저장소 = 인터넷이나 네트워크 어딘가에 있는 저장소

* Git 원격저장소 받아오기(url)

  + git clone = 기존의 git repository(원격으로 존재)를 복사

  1. gitlab or github 의 원하는 프로젝트에서 clone 버튼을 누릅니다
  2. SSH / HTTPS 두 가지 옵션 중에 clone with HTTPS 옵셥으로 클론을 합니다
  3. git clone 뒤에 clone 버튼으로 확인한 원격저장소의 주소를 넣어줍니다 git clone <주소>

** 원격저장소 추가

  • git remote add origin <주소>
  • 명령어로 원격 저장소를 연결할 수 있다
  • git remote add origin https://github.com/group/project
  • 저장소 주소의 구성 : github.com = 웹 호스트 서비스 / group = 그룹명 / project = 프로젝트명
  • git remote = 연결된 원격 저장소를 확인 가능
  • git remote show origin = 원격 저장소를 한눈에 볼 수 있다

** 원격저장소 이름 변경

  • git remote rm git_test

** 복사한 주소를 터미널에 붙여넣기 할 때 단축키

  • Shift + Ctrl + V

** 원격저장소 동기화

  * 저장소 갱신

  • pull = 원격저장소에서 데이터 가져오기 + 병합(merge)
  • fetch = 원격저장소에서 데이터 가져오기
  • 저장소 갱신 - pull = 원격저장소에서 데이터를 가져와 로컬 데이터와 병합합니다 (과정 : git pull -> git log --all -> commit f7b775d (HEAD -> master(로컬저장소의 master 브랜치) , origin/master(원격저장소의 origin master 브랜치) - 쉼표로 동시에 가리킴(병합)))
  • 저장소 갱신 - fetch = git log 명령어로 변경된 파일을 확인하고 따로 merge 해주기

** 저장소 발행

  • 로컬저장소에서 작업한 내용을 원격 저장소에 반영합니다. 다른 사람이 먼저 push 한 상태에서는 push 할 수 없음!! 다른 사람이 작업한 것을 merge 부터 해주기!

* 요약

  1. git remote add origin(또는 다른 원격저장소 이름) <원격저장소의 주소> 으로 로컬 저장소와 연결합니다.
  2. git fetch 또는 git pull을 이용하여 원격저장소의 내용을 동기화합니다.
  3. fetch를 실행한 경우 git merge origin/master로 병합을 완료해줍니다
  4. git push origin master를 이용하여 변경된 사항을 원격 저장소에 전달해줍니다.

** Origin 이란?

  * origin/master

  • git remote add origin <원격저장소의 주소> = git remoteorigin이라는 이름으로 add 해주겠다는 의미 = 원격저장소의 단축이름을 origin 으로 지정한다는 의미!
  • origin이 아닌 다른 이름으로 원격저장소의 이름을 지정해줄 수 있다 ( ex> git remote add myproject <원격저장소의 주소> => git remote를 myproject라는 이름으로 add 해주겠다는 의미 )
  • 기본적으로 만들어진 원격저장소의 이름은 origin이 default값이다. 때문에 clone으로 복사해온 저장소의 이름은 origin으로 통일되게 된다.
  • -v 옵션을 사용하면 지정한 저장소의 이름 / 주소를 함께 볼 수 있습니다 => git remote -v

 

 

댓글