Git

송민혁·2023년 9월 13일
1

Git

목록 보기
1/6

요약

들어가기 전

Git

Git이란 무엇일까?

-> git은 '코드 버전 관리 프로그램'을 의미한다.
(git - global information tracker)

Git의 장점

-> git은 버전 관리동시 협업을 할 수 있다.

파일의 어떤 내용이 수정되었는지 커밋을 통하여 알 수 있다.

github

많은 양의 코드 작업물을 컴퓨터에 저장해야 하거나 다른 사람한테 보내기 위해서는 Github가 필요합니다!

다시 말해, Github를 통하여 백업과 협업을 할 수 있습니다!

git vs Github
-> git은 버전관리를 해주는 프로그램이다.
반면에 Github는 원격 저장소라고 생각하면 된다.

설정

Git은 Windows에서도 유닉스 커맨드를 사용할 수 있도록 해주는 프로그램을 별도로 준비했다. 그 프로그램의 이름이 바로 Git Bash이다.

즉, 이 프로그램을 사용하면 Windows에서도 유닉스 커맨드로 원하는 작업을 할 수 있게 된다.

매번 Git Bash를 실행하고 작업하는 폴더로 이동하는 것이 귀찮을 수도 있다.
그럴 때는 일단 해당 폴더 안에서 우클릭으로 git bash here을 누르면 된다.

Git

1) repository

우리는 레포지토리라는 저장소를 우선적으로 알아야 한다.
버전별 프로젝트 모습과 버전별 변경 사항에 대한 정보를 레포지토리를 통해 알 수 있다.

레포지토리 만들기

1) git init - 비어있는 레포지토리(.git) 생성

다시 말해, 해당 폴더 기준으로 .git(로컬 저장소)가 생성된다.

2) commit

프로젝트 디렉토리의 특정 모습(시점?)을 하나의 버전으로 남기는 행위 & 결과물을 커밋(commit)이라고 한다.

그리고 커밋이 저장되는 곳레포지토리(repositoy)라고 한다.

커밋을 처음 할 때,
깃에게 커밋한 사람 알려주기 ! (내가 누구인지 알려주기)

필요한 요소

  • 이름
  • 이메일
  • 커밋에 대한 정보 (커밋 메시지)

config - 설정하기

$ git config --global user.name "matthew song"

$ git config --global user.email "ddsadsad@DSAddsa.kr"

$ git commit -m "첫 번째 커밋" 
// error untrackd

파일의 상태

1) Untracked (관리 대상이 아님) : git add 하지 않은 파일 상태

2) Tracked (관리 대상) : git 관리하는 파일

  • Unmodified : 최근의 커밋과 비교했을 때 바뀐 내용이 없는 상태
  • Modified : 최근 커밋과 비교했을 때 바뀐 내용이 있는 상태
  • Staged : 파일이 수정되고 나서 스테이지 공간에 올라와 있는 상태이며, git add 후의 상태

커밋하기 전 커밋할 파일을 미리 지정해줘야 한다. (add해야 함)
$ git add .

커밋에 관한 주의사항

  • 처음으로 커밋을 하기 전 사용자의 이름과 이메일 주소를 설정한다.
  • 커밋 메시지 남기기 (옵션 -m)
  • 커밋할 파일을 git add로 지정하기

  • staging area에 있던 것들은 커밋을 하더라도 그것과 상관없이 계속 남아있다

작업 영역

  1. working directory (=working tree)
  2. staging area (=index)
  3. repository

워킹 디렉토리는 작업을 하는 프로젝트 디렉토리를 말한다.

스테이징 에어리어는 git add를 한 파일들이 존재하는 영역이다.
즉, 커밋을 하게 되면 스테이징 에어리어에 있는 파일들만 커밋에 반영된다.

레포지토리는 워킹 디렉토리의 변경 이력들이 저장되어 있는 영역이다.
즉, 커밋들이 저장되는 영역이다.

git add

  • 스테이징 에어리어에 넣는 과정
  • 커밋할 대상으로 만드는 것 (Tracked로 만들기)

$ git add 파일명
$ git add .

git status

  • 파일의 상태들을 확인할 수 있다.
    (커밋 대상 / 커밋되지 않은 대상, 수정 대상 / 수정되지 않은 대상)

Git 안의 파일 상태

  • Untracked : git add 해주지 않았다면 이 상태이다.

  • Tracked
    1) Staged : staging area에 올라와있는 상태
    2) Unmodified : 최신 커밋의 모습과 비교했을 때 전혀 바뀐 게 없는 상태
    3) Modified : 최신 커밋의 모습과 비교했을 때 조금이라도 바뀐 내용이 있는 상태

git add 취소하기 (git reset)

git reset <-> git add

git reset : staging area에서 파일 제거

하지만 변경된 새 모습은 그래도 워킹 디렉토리에 남아있다.

working tree clean : 이전 커밋 이후로 변경사항 없음.

git help [command]

$ git help command

ex)
$ git help add : git add라는 커맨드의 의미와 사용법을 알려줘!

정리_1


github

git push

$ git push - 로컬 레포지토리 내용을 원격 레포지토리에 내용을 반영한다.

git pull

원격 레포지토리가 로컬 레포지토리보다 최신 내용을 있어서 로컬 레포지토리에 내용을 업데이트하기 위해서는 어떻게 하면 좋을까요?

git pull : 리모트 레포지토리 내용 -> 로컬 레포지토리

(git pull <-> git push)

리모트 레포지토리를 왜 사용할까?

1) 백업 - 안전성
2) 협업 가능 - 수정한 최신 자료를 바로 반영 가능

git clone

다른 사람의 프로젝트를 가져오기 위해서 git clone을 사용한다.

$ git clone [프로젝트의 Github 상 주소]

정리_2


커밋

커밋 히스토리 확인 (git log, git show)

$ git log - 커밋 히스토리 살펴보기
$ git log --pretty=oneline - 커밋 히스토리 깔끔하게(한줄씩) 보기

$ git show 커밋아이디_4자리 - 해당 커밋의 내용을 보기

색깔에 따라 커밋 수정사항을 확인할 수 있다.

git show [커밋 아이디]를 실행하면 해당 커밋 아이디를 가진 커밋에서 어떤 변화(어떤 파일이 생기고, 기존 파일에서 어떤 부분이 수정되고 등)가 있었는지를 한눈에 볼수 있습니다.

-m 옵션 없이도 커밋 메시지

$ git commit - 커밋 메시지를 vim으로 하기
(자세한 설명을 붙이기 위해 사용)

vim

  • 맨 앞에 '#'가 있는 줄은 커밋 메시지에 포함 되지 않는 내용이다.
  • i를 누르면 입력 모드로
  • 첫 줄 - 제목 / 한 줄 띄우고 바뀌 내용 쓰기
  • 제목은 첫 문자는 대문자로, 명령조로 쓰면 된다.

최신 커밋 수정하기 (--amend)

$ git log --pretty=online -> 이전 커밋들을 한줄로 확인하기

가장 최근의 커밋을 수정하기 위해

$ git commit --amend - 최신 커밋 수정
=> 커밋 메시지 수정할 수 있는 창이 나옴.
=> vim 나가기 위해 :wq

amend - 수정하다

커밋 작성 가이드라인

1) 커밋 메시지의 제목과 상세 설명 사이에는 한 줄을 비워두기

2) 커밋 메시지의 제목 뒤에 마침표(.)를 붙이지 말기

3) 커밋 메시지의 제목의 첫 번째 알파벳은 대문자로

4) 커밋 메시지의 제목은 명령조로

5) 커밋 상세 내용

  • 왜 커밋을 했는지
  • 어떤 문제가 있었고
  • 적용한 해결책이 어떤 효과를 가지는지

6) 최대한 친절하게 이해할 수 있게 작성하기

커밋할 때 알아야 할 가이드라인

1) 하나의 커밋에는 하나의 수정사항, 하나의 이슈를 해결한 내용만 남기자.

하나의 커밋이 하나의 사실만을 갖고 있어야 나중에 이해하기 쉽다.

2) 현재 프로젝트 디렉토리의 상태가 그 내부의 전체 코드를 실행했을 때 에러가 발생하지 않는 상태인 경우에만 커밋을 하자.

기타) 별명 (alias)

긴 옵션을 매번 붙여서 사용하는 건 힘들기 때문에
Git에는 길이가 긴 경우의 커맨드 전체에 별명(alias)을 붙여서 그 별명을 사용할 수 있도록 해주는 기능이 있다.

ex) git log --pretty=online -> git history 로 aliasing하기

git config를 사용하자!

git config alias.history 'log --pretty=online'

codeit
git config alias.[새로운 별명] [길이가 긴 커맨드] 의 형식으로 쓰면 길이가 긴 커맨드를 짧은 별명만 타이핑해도 실행할 수 있습니다. alias는 별명이라는 뜻이고 이렇게 별명을 붙이는 행위를 aliasing(앨리어싱)이라고 합니다.

두 커밋 간의 차이 보기 (git diff)

$ git diff 아이디4자리(1) 아이디4자리(2)

codeit
git diff 커맨드를 사용하면 커밋 간의 차이를 한눈에 볼 수 있습니다. diff는 difference의 줄임말로 차이점이라는 뜻입니다.

HEAD - 보통 가장 최근에 한 커밋을 가리킴 (매번 더 새로운 커밋을 가리킴)

HEAD가 가리키는 커밋에 따라 working directory를 구성한다.

git reset

이전 커밋으로 git reset하기

$ git reset --hard [id_4자리]

git reset
HEAD가 과거의 커밋을 가리키게 할 수 있다.
woriking directory의 내용도 과거 커밋의 모습으로 돌아가게 한다.

codeit
HEAD가 과거의 커밋을 가리키게 되는 결과는 git reset에서 어느 옵션을 쓰든 항상 똑같습니다.
하지만 working directory의 내부도 그 과거 커밋의 모습처럼 바뀌는 건 --hard 옵션을 썼기 때문에 그런 겁니다.--soft, --mixed 옵션을 쓰면 그렇지 않은데요.

git reset 3가지 옵션

위에 나온 3가지 옵션을 이해하기 위해서는 작업 영억을 이해해야 한다.

--hard 옵션을 쓸 경우

워킹 디렉토리, 스테이징 에어리어, HEAD가 바뀐다. 그래서 하드 옵션은 작업했던 것들을 다 날려버릴 수 있으니 조심히 써야 한다.

--mixed 옵션을 쓸 경우 (보통의 경우)

HEAD와 스테이징 에어리어가 바뀐다. 워킹 디렉토리는 그대로이다.

--soft 옵션을 쓸 경우 (보통의 경우)

HEAD만 이전 커밋을 가리킬 뿐이고 워킹 디렉토리와 스테이징 에어리어가 그대로이다!

다시 요약

꿀팁)
바로 이전 커밋을 가리키는 말이 있다.
HEAD^는 현재 HEAD가 가리키고 있는 커밋의 바로 이전 커밋을 나타낸다.

$ git reset --hard HEAD^

또 '바로 이전'보다 좀 더 이전에 있는 커밋을 나타내고 싶다면?

HEAD~x을 사용하면 된다. x단계 전에 있는 커밋을 의미한다.

커밋에 태그 달기

중요한 커밋에는 커밋 메시지뿐만 아니라 태그라는 것을 추가적으로 단다.

git tag [태그 이름][커밋 아이디] - 태그 달기

ex)
$ git tag Version_1 84ab
$ git tag Version_2 9a69

커밋에 달린 태그 조회

git tag - tag만 확인 가능
git show [태그 이름] - 선택한 태그가 가리키는 커밋 확인하기

ex)
$ git show Version_1
해당 태그가 있는 커밋에 대한 정보들이 나온다.


git reset으로 과거 커밋으로 돌아가기


git reset했지만 다시 돌아가기

git reset 전으로 돌아가려면?
remote repository에 있는 작업물을 다시 가져오면 된다 (git pull)

git revert

git reset처럼 커밋을 취소하는 방법으로 git revert가 있다.

git reset과 git revert의 차이를 알아야 한다.

  • reset : 시간을 아예 과거의 특정 사건(commit)으로 되돌린다.
  • revert : 현재에 있으면서 과거의 특정 사건(commit)들만 없던 일로 만든다.
    즉, 이전의 commit 내역을 남겨두고 새로운 commit을 생성하면서 과거로 돌아가게 된다.

하지만 과거의 커밋으로 git reset을 한다고 그 이후의 커밋들이 삭제되는 게 절대 아닙니다. 계속 남아있습니다.

정리_3

문제

질문 1) "커밋을 하고 나면 staging area에 있던 파일들이 사라진다?
정답 1) X
해설 1) 커밋을 해도 staging area에는 아무런 변화가 없습니다. 단지 나중에 git add를 또 했을 때 staging area 안에 새로운 파일이 추가되거나, 기존 파일이 더 새로운 파일로 교체될 뿐입니다. 이 점을 잘 기억해야 git reset 커맨드를 이해할 때 어려움이 없습니다.

질문 2)

질문 3)

질문 4)

0개의 댓글