git

Jeongyun Heo·2020년 12월 30일
1

git

목록 보기
2/4
post-thumbnail

깃, 깃허브 제대로 배우기 (기본 마스터편, 실무에서 꿀리지 말자)
https://youtu.be/Z9dvM7qgN9s

git 초기화
git init

ls -al

폴더나 파일명 앞에 .(도트)가 있으면 숨겨진 파일

그냥 ls 명령으로는 보이지 않는다.

open .git

rm -rf .git 👈 git 삭제

git status

git config --global alias.st status 👈 명령어 바꿔 쓸 수 있음

git st 만 입력해도 됨

git config --h 👈 명령어 볼 수 있음

echo hello world! > a.txt

키보드 위 아래 방향키 누르면 위에 썼던 명령어 나옴

echo hello world! > b.txt

echo hello world! > c.txt

ls

아직 커밋되지 않은 변경사항이 생겼다

git status (현재 상태 보여줌)

MacBookAir git % git status
현재 브랜치 master

아직 커밋이 없습니다

추적하지 않는 파일:
  (커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
	a.txt
	b.txt
	c.txt

커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "git 
add"를 사용하십시오)

untracked

git add a.txt

git status

MacBookAir git % git status   
현재 브랜치 master

아직 커밋이 없습니다

커밋할 변경 사항:
  (스테이지 해제하려면 "git rm --cached <파일>..."을 사용하십시오)
	새 파일:       a.txt

추적하지 않는 파일:
  (커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
	b.txt
	c.txt

git add b.txt c.txt = git add *.txt

MacBookAir git % git status   
현재 브랜치 master

아직 커밋이 없습니다

커밋할 변경 사항:
  (스테이지 해제하려면 "git rm --cached <파일>..."을 사용하십시오)
	새 파일:       a.txt
	새 파일:       b.txt
	새 파일:       c.txt

echo ellie >>a.txt

nana@nana-MacBookAir git % git status
현재 브랜치 master

아직 커밋이 없습니다

커밋할 변경 사항:
  (스테이지 해제하려면 "git rm --cached <파일>..."을 사용하십시오)
	새 파일:       a.txt
	새 파일:       b.txt
	새 파일:       c.txt

커밋하도록 정하지 않은 변경 사항:
  (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오)
  (use "git restore <file>..." to discard changes in working directory)
	수정함:        a.txt

a.txt가 수정되어 있음

a라는 파일 트랙킹이 되어 있어서 수정된 거 알고 있음

git add a.txt
git status

MacBookAir git % git status   
현재 브랜치 master

아직 커밋이 없습니다

커밋할 변경 사항:
  (스테이지 해제하려면 "git rm --cached <파일>..."을 사용하십시오)
	새 파일:       a.txt
	새 파일:       b.txt
	새 파일:       c.txt

git rm --cached *

MacBookAir git % git status       
현재 브랜치 master

아직 커밋이 없습니다

추적하지 않는 파일:
  (커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
	a.txt
	b.txt
	c.txt

커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "git
add"를 사용하십시오)

디렉터리에 있는 모든 파일들 스테이지에 옮김
git add *

MacBookAir git % ls
a.txt b.txt c.txt
MacBookAir git % git status
현재 브랜치 master

아직 커밋이 없습니다

커밋할 변경 사항:
  (스테이지 해제하려면 "git rm --cached <파일>..."을 사용하십시오)
	새 파일:       a.txt
	새 파일:       b.txt
	새 파일:       c.txt
MacBookAir git % rm a.txt
MacBookAir git % ls
b.txt c.txt
MacBookAir git % git add * 
MacBookAir git % git status
현재 브랜치 master

아직 커밋이 없습니다

커밋할 변경 사항:
  (스테이지 해제하려면 "git rm --cached <파일>..."을 사용하십시오)
	새 파일:       a.txt
	새 파일:       b.txt
	새 파일:       c.txt

커밋하도록 정하지 않은 변경 사항:
  (무엇을 커밋할지 바꾸려면 "git add/rm <파일>..."을 사용하십시오)
  (use "git restore <file>..." to discard changes in working directory)
	삭제함:        a.txt

git add .

git status

MacBookAir git % echo styling > style.css
MacBookAir git % echo log > log.log
MacBookAir git % ls
b.txt     c.txt     log.log   style.css
MacBookAir git % git status
현재 브랜치 master

아직 커밋이 없습니다

커밋할 변경 사항:
  (스테이지 해제하려면 "git rm --cached <파일>..."을 사용하십시오)
	새 파일:       b.txt
	새 파일:       c.txt

추적하지 않는 파일:
  (커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
	log.log
	style.css

CSS 파일들만 추가하고 싶으면
git add *.css

MacBookAir git % git status   
현재 브랜치 master

아직 커밋이 없습니다

커밋할 변경 사항:
  (스테이지 해제하려면 "git rm --cached <파일>..."을 사용하십시오)
	새 파일:       b.txt
	새 파일:       c.txt
	새 파일:       style.css

추적하지 않는 파일:
  (커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
	log.log

css파일만 추가됨

git에 포함하고 싶지 않으면
tracking 하고 싶지 않은 파일들
git과 github에 올리고 싶지 않은 파일들

gitignore라는 파일을 만들어서 그 안에 둔다

echo *.log > .gitignore

MacBookAir git % ls -al
total 56
drwxr-xr-x   9 nana  staff   288 12 31 00:19 .
drwxr-xr-x  11 nana  staff   352 12 30 20:40 ..
-rw-r--r--@  1 nana  staff  6148 12 31 00:11 .DS_Store
drwxr-xr-x  11 nana  staff   352 12 31 00:16 .git
-rw-r--r--   1 nana  staff     8 12 31 00:19 .gitignore
-rw-r--r--   1 nana  staff    13 12 30 21:53 b.txt
-rw-r--r--   1 nana  staff    13 12 30 21:53 c.txt
-rw-r--r--   1 nana  staff     4 12 31 00:11 log.log
-rw-r--r--   1 nana  staff     8 12 31 00:10 style.css

.gitignore 파일 생성됨

MacBookAir git % open .gitignore

gitignore 파일 열어보기

파일 열어서 보면 내가 github에 안 올리겠다고 한 파일이름 써있음

MacBookAir git % git status
현재 브랜치 master

아직 커밋이 없습니다

커밋할 변경 사항:
  (스테이지 해제하려면 "git rm --cached <파일>..."을 사용하십시오)
	새 파일:       b.txt
	새 파일:       c.txt
	새 파일:       style.css

추적하지 않는 파일:
  (커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
	.gitignore

log.log 파일 안 보임

.gitignore에 파일이나 폴더 추가

log.log 처럼 파일이름을 써도 되고

*.log 👈 모든 log 파일은 포함하지 않겠다

build/ 👈 디렉터리 안에 있는 파일들을 추가하고 싶지 않다

build/*.log 👈 디렉터리 안에 있는 log 파일들을 추가하고 싶지 않다

git status -h

MacBookAir git % git status -h
사용법: git status [<옵션>] [--] <경로명세>...

    -v, --verbose         자세히 표시
    -s, --short           상태를 간략하게 표시합니다
    -b, --branch          브랜치 정보를 표시합니다
    --show-stash          스태시 정보를 표시합니다
    --ahead-behind        앞/뒤 값 전체를 계산합니다
    --porcelain[=<버전>]  컴퓨터가 읽을 수 있는 형식
    --long                긴 형식으로 상태를 표시합니다 (기본값)
    -z, --null            NUL 문자로 항목을 끝냅니다
    -u, --untracked-files[=<모드>]
                          추적되지 않는 파일을 표시합니다. 추가 옵션: all, normal, no (기본값: all)
    --ignored[=<모드>]    무시된 파일을 표시합니다. 추가 옵션: traditional, matching, no. (기본값: traditional)
    --ignore-submodules[=<언제>]
                          하위 모듈의 변경을 무시합니다. 추가 옵션: all, dirty, untracked. (기본값: all)
    --column[=<스타일>]   추적되지 않는 파일의 목록을 여러 열로 표시합니다
    --no-renames          이름 바꾸기를 검사하지 않습니다
    -M, --find-renames[=<n>]
                          이름 바꾸기 검사하고, 부가적으로 유사성 인덱스를 설정합니다

그냥 git status 라고만 입력하면 기본으로 --long 실행됨

-s 라고 붙이면 좀 더 간단하게 보여줌

-b 라고 붙이면 branch에 관련된 정보들을 확인해 볼 수 있음

command + K 👉 터미널 깨끗해짐

MacBookAir git % git status -s
A  b.txt    
A  c.txt
A  style.css
?? .gitignore

echo add >> c.txt (c.txt 내용 추가)

MacBookAir git % git status -s
A  b.txt
AM c.txt  👈 AM(modified)으로 바뀜 
A  style.css
?? .gitignore

정확하게 어떤 파일의 내용이 수정되었는지 알려줌

git diff

diff 뒤에 아무것도 입력 안 하면 working directory에 있는 파일들의 변경사항만 비교해서 볼 수 있음

diff --git a/c.txt b/c.txt
index a042389..f5be8ac 100644
--- a/c.txt  👈 이전 버전
+++ b/c.txt  👈 현재 버전
@@ -1 +1,2 @@
 hello world!  👈 이전 파일에서 
+add  👈 + 다음에 추가된 내용 / - 다음에 삭제된 내용
(END)

Q 눌러서 종료

cat c.txt

MacBookAir git % cat c.txt
hello world!
add

staging area에 있는 파일 변경사항 보고 싶으면

git diff --staged

diff --git a/b.txt b/b.txt
new file mode 100644
index 0000000..a042389
--- /dev/null  👈 이전에는 아무것도 없었는데
+++ b/b.txt  👈 c.txt 라는 파일이 추가가 되었고
@@ -0,0 +1 @@ 👈 어떤 줄도 없었지만, 새로운 파일에는 첫 번째 줄에 hello world가 추가되었다 
+hello world!
diff --git a/c.txt b/c.txt  
new file mode 100644
index 0000000..a042389
--- /dev/null
+++ b/c.txt
@@ -0,0 +1 @@
+hello world!
diff --git a/style.css b/style.css  👈 style.css라는 파일이 있는데
new file mode 100644
index 0000000..c8658a5
--- /dev/null  👈 이전에는 아무것도 없었고
+++ b/style.css  👈 추가가 된 파일에는
@@ -0,0 +1 @@  👈 첫 번째 줄에 styling 이라는 내용이 들어가 있다
+styling
(END)

Q 눌러서 나오기

git diff -h 👈 사용할 수 있는 옵션들 보기

내가 원하는 것들만 확인 가능

MacBookAir git % git diff -h      

  --patch-with-raw
                output both a patch and the diff-raw format.
  --stat        show diffstat instead of patch.
  --numstat     show numeric diffstat instead of patch.
  --patch-with-stat
                output a patch and prepend its diffstat.
  --name-only   show only names of changed files.
  --name-status show names and status of changed files.
  --full-index  show full object name on index lines.
  --abbrev=<n>  abbreviate object names in diff-tree header and diff-raw.
  -R            swap input file pairs.
  -B            detect complete rewrites.
  -M            detect renames.
  -C            detect copies.
  --find-copies-harder
                try unchanged files as candidate for copy detection.
  -l<n>         limit rename attempts up to <n> paths.
  -O<file>      reorder diffs according to the <file>.
  -S<string>    find filepair whose only one side contains the string.
  --pickaxe-all
                show all files diff when -S is used and hit is found.
  -a  --text    treat all files as text.

(END)

git diff --staged = git diff --cashed
동일하게 staging area에 있는 거 확인

git config --global -e 입력

vscode에서 .gitconfig 파일 열림

파일 안에 내용 입력

[diff]
	tool = vscode
[difftool "vscode"]
	cmd = code --wait --diff $LOCAL $REMOTE    

git difftool

MacBookAir git % git difftool          

Viewing (1/1): 'c.txt'
Launch 'vscode' [Y/n]? 

y 라고 타이핑

vscode에서 실행됨

이전 버전과 비교해봤을 때 add 라는 내용이 추가된 걸 볼 수 있다

vscode 종료하고

다시 터미널로 와서

git difftool --staged

MacBookAir git % git difftool --staged

Viewing (2/3): 'c.txt'
Launch 'vscode' [Y/n]?

y 입력

working directory에 있는 게 마음에 들면
staging area에 옮겨 놓고
.git directory

git commit
👉 staging area에 있는 변경사항을 .git directory에 옮겨주는 역할

아무런 옵션 없이 git commit 이라고만 입력하면

아래와 같은 기본적인 템플릿이 나옴

보통은 커밋에 있는 Title을 작성하고
그리고 상세 내용 Description을 적는다.

title과 description을 작성한 뒤 저장하고 파일을 닫으면

첫 번째 줄에 해시코드 id와 title이 표기됨
두 가지의 파일이 변경이 되었고
두 가지 다 이번에 처음으로 만들어진 것을 확인할 수 있다.

MacBookAir git % git commit -m "first commit"
[master (최상위-커밋) 1045c7e] first commit
 4 files changed, 5 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 b.txt
 create mode 100644 c.txt
 create mode 100644 style.css

git log 👈 히스토리 확인

전체적인 해시코드
누가 했는지
언제 했는지
Title
Description

commit 1045c7ed850e96d71c0b978bd5edba8eacae6464 (HEAD -> master)
Author: 이름나옴 <메일주소나옴>
Date:   Thu Dec 31 01:39:19 2020 +0900

    first commit
(END)

git commit 라고만 쓰는 경우는 거의 없음

echo add >> c.txt

git status -s

git add .

git commit -m "second commit"

MacBookAir git % git commit -m "second commit"
[master 455893f] second commit
 1 file changed, 1 insertion(+)

git log

commit 455893fceb4f3e37c0cc3e653c53095e5b7ba560 (HEAD -> master)
Author: 이름나옴 <메일주소나옴>
Date:   Thu Dec 31 01:42:07 2020 +0900

    second commit

commit 1045c7ed850e96d71c0b978bd5edba8eacae6464
Author: 이름나옴 <메일주소나옴>
Date:   Thu Dec 31 01:39:19 2020 +0900

    first commit
(END)

echo add >> c.txt

git commit -am "third commit" 👉 staging area와 working directory에 있는 모든 파일들을 메시지와 함께 커밋

MacBookAir git % git commit -am "third commit"
[master 7f22c8e] third commit
 1 file changed, 1 insertion(+)

git log

commit 7f22c8e0189ff8c99e8f36e222215c0f3ef725e2 (HEAD -> master)
Author: 이름나옴 <메일주소나옴>
Date:   Thu Dec 31 01:46:43 2020 +0900

    third commit

commit 455893fceb4f3e37c0cc3e653c53095e5b7ba560
Author: 이름나옴 <메일주소나옴>
Date:   Thu Dec 31 01:42:07 2020 +0900

    second commit

commit 1045c7ed850e96d71c0b978bd5edba8eacae6464
Author: 이름나옴 <메일주소나옴>
Date:   Thu Dec 31 01:39:19 2020 +0900

    first commit
(END)

이런 식으로 커밋을 해나가면 된다

어느 정도의 커밋을 하면 적당할까?

.git directory에 있는 커밋들은 history의 창고이다.

작업들을 버전별로 나눠서 관리할 수 있는 창고

세분화해서 기능별로 작은 단위로

히스토리에 한 번에 넣기보다는 작은 단위로 나누어서 저장하는 게 좋다

그렇다고 히스토리에 의미 없는 commit1, commit2, commit3 이런 식으로 작성하기 보다는 의미 있는 이름을 지정해서 저장하는 것이 좋다

Initialise project (프로젝트를 초기화하는 커밋)
Add LoginService module(로그인 서비스 모듈)
Add UserRepository module
Add Welcome page
Add About page
Add light theme

이름 제대로 지어야 내가 원하는 버전을 빠르게 찾을 수 있음
원하지 않는 커밋을 취소하기 편함

보통 커밋의 메시지는 현재형, 동사로 만들어짐
Init
Add
Fix

흔하게 하는 실수
커밋을 할 때
Fix crashing on login module 이라고 했으면
그 고친 내용만 포함된 커밋을 만들어야 됨
커밋을 리뷰할 때 혼동이 옴
히스토리 볼 때도 혼동이 옴
커밋 메시지에 맞게 해당하는 내용만 포함해서 커밋하는 게 중요

너무 커도 문제
너무 작은 단위여도 문제
의미 있는 단위로 나누기

Sourcetree로 하는 법

c.txt를 수정하고 Sourcetree로 가보면

변경내역이 나온다

아직 스테이징이 되지 않은 파일(working directory)에 c.txt 있음

선택하기

staging area로 옮겨짐

staging area에서 다시 체크 해제하면

working directory로 내려감

조금 더 세부적으로 하고 싶으면

예를 들어서 첫 번째 hi만 커밋하고 싶으면

해당 부분을 선택한 다음

바뀐 줄 스테이지에 올리기 클릭

첫 번째 hi만 staging area로 옮겨감

나머지 변경 사항은 그대로 남아 있음

코드뭉치 스테이지에 올리기 블럭을 staging 할 수 있음

전부 다 staging으로 들어가짐

한 줄만 선택해서 다시 working directory로 뺄 수도 있음

working directory에 남아 있는 걸 볼 수 있다.

터미널에서도 할 수 있지만 세부적으로 할 때는 직관적인 UI Tool 사용이 편하다

밑에 커밋 메시지 입력 후 커밋 버튼 누르면 됨

나중에 뒤에서 remote 할 때 자동적으로 표시를 하고 싶으면 체크해주기
(지금은 지정된 remote가 없어서 버튼이 비활성화 되어 있음)

커밋하고 히스토리 가면 여태까지 커밋된 히스토리 볼 수 있음

0개의 댓글