Git 공부

조윤수·2024년 12월 26일

Git 공부

목록 보기
1/4

GitHub을 사용하면서 정확히 이해하지 못하고 검색이나 ChatGPT를 활용해 커밋하고 푸시했었는데, 이제 그 과정을 되짚어보면서 공부하기!

1. What is Git

vcs = 버전 제어 시스템
사용자가 프로젝트에 따른 변화를 관리할 수 있도록 돕는다.

1.1) 체크포인트 설정 -> 돌아갈 수 있는 파일 저장
1.2) 체크포인트 계속추가 + 프로젝트 진행
1.3) 이전 체크포인트로 돌아갈 수 있다
1.4) 포크로 새로운 버전을 작업가능
1.5) 체크포인트끼리 병합가능
등..

2. Git vs Github

Git = 버전 제어 소프트웨어
Github = 웹 서비스, git repository

3. 터미널(Command Line) vs 사용자 인터페이스(GUI) (시각화해서 이해를 도움)

git과 상호작용하는 두 가지 방식

4. Git은 Unix 기반 인터페이스로 실행

따라서 Windows에서는 Git Bash을 통해 Windows에서 Unix 환경인 Bash을 흉내낸다. (emulate)

5. Configuring Git (사용자 이름 설정)

git config --global user.name "example"
git config --global user.email "example"

git config user.name

6. ~ 홈 디렉토리

홈 디렉토리는 각 사용자가 시스템에 로그인할 때 자동으로 이동되는 기본 디렉토리로, 해당 사용자의 개인 파일이나 설정 파일들이 저장되는 위치

~는 사용자의 홈 디렉토리를 참조

7. Unix 명령어

ex.
ls
ls -a // hidden 파일까지 다 표시
open . // start .
ls pets
open pets
pwd // 현재 위치를 출력
cd // change directory
cd .. // backward
touch purple.js // 파일 생성
touch Pets/Horses/rocky.png // 경로로 파일생성
mkdir a b // 폴더 생성
rm purple.txt // 파일 삭제
rm -rf Plants // 폴더 삭제

8.Repository

8.1) git을 언제 사용하는지 수동으로 알려줘야 한다 -> git Repository 만들기 // 필요한 만큼 회수가능하고 독립적이다.

8.2) 각 저장소에 대한 독립적인 git log을 가지고 있다.

9. git status

repository 상태를 반환한다.

9.1) git init // 해당 명령을 실행하는 터미널에서 새로운 git 저장소를 생성하고 폴더마다 독립적으로 생성가능하다

ex) YUNSU1231231/UMC/ 폴더가 프로젝트의 루트 디렉토리 -> 여기서 git init을 해준다.

9.3) 명령어
ls -a
cd .git // 이 폴더에 git 기록이 저장

10. git workflow


10.1) commit은 git repository의 시간 체크포인트

여러 변경 사항을 하나의 커밋으로 묶는다 -> 이게 하나의 체크포인트이다.

ex) 변경 사항 1 2 3 4 / 5 6 7 -> 1,2 두 개의 commit 포인트

10.2) 명령어

git add . // 변화를 전부 하나의 묶음으로
git add file1 file2 // 변경사항을 묶어서 하나의 commit 포인트를 만드는 것 -> Staging Area
git commit -> Repository
git add file1 file2 -> Staging Area -> 커밋 message 하나로 표현
git commit -m "my message"
git log

git commit 명령어 // message가 길 때 사용
Vim -> i -> 메세지 입력 -> :wq

10.3) 변경 사항 스테이징
새로운 파일 생성 -> git status (명령어) -> Untracked file (터미널) -> git add (명령어) -> new file (터미널)
기존 파일 수정 -> git status -> modified file -> git add -> modified

10.4) working tree clean
작업 디렉토리에서 변경된 파일이 없고, 모든 파일이 최신 커밋 상태와 일치한다는 의미

12. Atomic Commits

목적성에 따라 묶음으로 분리해서 git add를 한다.

12.1) 명령어
ex.
git add a b c
git commit
got add d

git log --oneline // git log 첫 줄만 뜨게한다.

13. Amending Commits

직전의 commit 실수를 수정하는 방법 // 한 번 실수했을때만 가능하다.

ex.
git add a.txt
git commit --ammend // Vim이면 Vim 사용법에 따라 수정

14. Ignoring Files

local에 있지만 git이 추적을 못하게 .gitignore 이름의 폴더를 만들고 추적을 원하지 않은 파일을 넣기

15.branch(분기)

15.1) branch가 필요한 이유

15.2) Head, branch, commit 관계

HEAD는 현재 작업중인 Branch를 참조하고
Branch는 특정 시점의 commit을 참조한다.

ex. commit c1e1cb...... (HEAD -> master) // HEAD는 master branch을 가르킨다.

15.3) HEAD는 Repository(저장소) 내 현재 위치를 가리키는 포인터 / 책에서 책을 여는 책갈피라고 생각

15.4) Branch는 어디서 분기하는지가 중요하다. 새로운 브랜치에서 작업을 시작하려면 일반적으로 브랜치를 먼저 만들고, 그 브랜치로 전환한 후 코드를 수정하는 방식이다. 새로운 브랜치에서는 현재 작업 중인 파일, 폴더, 그리고 커밋 기록이 그대로 복사된 상태로 시작한다.

15.4) 명령어
git bracnch // 현재 branch 상태 // vim -> q로 나오기

git switch bugswitch

git commit -a -m "message"
수정된 기존 파일에 대해서만 add와 commit을 동시에 하는 명령어입니다. 새 파일을 추가하려면 git add가 여전히 필요

git checkout name = git switch name // 같은 것 checkout이 기존의 명령어

git switch -c // create, switch 동시에 진행

git branch -d deleteMe // deleteMe branch 삭제,, 다만 swtich하고 삭제해야 된다

git branch -m 2000s // branch 이름을 바꾸기 위해서는 그 branch로 이동해야 한다

15.5) commit하기 전에 branch을 이동
충돌이 생기면 git이 경고를 주고 충돌이 없으면 그대로 따라온다.

16. BRANCH 실습

HEAD -> lilly:
HEAD가 lilly 브랜치를 가리키고 있다는 의미이다. 현재 lilly 브랜치에서 작업하고 있다는 것을 나타낸다. 이 상태에서 커밋을 추가하면 커밋은 lilly 브랜치에 추가된다.

커밋 로그:

첫 번째 커밋 (cce7474e9b32e514085542ce719aa2d51c9d99be)은 lilly 브랜치에서 이루어진 커밋이다. 커밋 메시지는 "add lily's doe patronus"이다.

두 번째 커밋 (3cc75f4795b0c21c020609b4f0eb398e6993a613)은 snape 브랜치에서 이루어진 커밋이다.

현재 체크아웃된 브랜치는 그 브랜치에서 작업 중이라는 뜻이고 체크아웃이라는 표현에 혼돈하지 말기.

17. MERGE

BRANCH끼리 병합을 뜻한다.

특정 커밋이 아니라 브랜치를 병합하고 항상 현재 HEAD 브랜치에 병합한다.

MERGE를 하면 commit log 등 파일,폴더 변경 정보를 다 가져온다.

  • destination branch로 먼저 이동하고 그리고 merge 해야 된다.

fast forward branch

17.1) switch

17.2) merge

하나의 branch가 다른 branch가 없는 commit을 가지고 있는 상황.

17.4) 명령어
git branch -v

branch name last commit commit message
master 7ffdfsf message

17.5) merge conflict (상충되는 정보가 없을 때 + 있을 때)
(충돌이 있으면 아래 4가지 step을 따라가기 -> 직접 파일 수정 + 저장 + commit)

Git에서 트리 구조의 노드는 커밋이다.

각 커밋은 Git 히스토리 내의 특정 지점을 나타내고 병합을 진행할 때 서로 다른 브랜치에서의 커밋들이 병합되면서 충돌이 발생할 수 있다.

각 커밋은 이전 커밋을 가리키고 항상 parent node commit을 가지고 있다

git switch -c "name"

17.6) merge 예시

ex. git merge bugfix
bugfix branch를 현재 head가 참조(현재 우리가 읽고있는)하는 branch로 merge한다.

ex. 충돌 예시

  1. 파일을 편집
  2. 충돌을 합치고 마커를 지운다
  3. 파일을 저장하고 // 1~3 파일을 수정하는 것
  4. commit 하기! -> 까먹지말기

-> 직접 파일에 접근해서 수정하고 저장하고 add, commit 과정이 필요하다.

18. MERGE 실습

주의 = 파일을 수정만 하고 저장을 하지 않으면 add, commit에 반영되지 않는다.

Remove-Item -Recurse -Force .git // git repo 삭제

fast forward merge, non conflict merge, conflict merge 순차적으로 해보기!

19. git diff

준비 영역 (staging area)과 작업 디렉터리(working directory)를 비교한다.


첫 줄 = 비교 파일 // 같은 파일의 다른 시점을 비교

staging area know about / new changes

context
change
context

19.1) 명령어
git diff head // head가 가르키는 commit, working directory를 비교

git diff --staged // 변경 사항만 표시
git diff --staged [specific file] // 특정 파일의 변경만 표시
git diff branch1 branch2 // 다른 branch간의 같은 파일을 비교
git diff commit1 commit2 // commit 같읜 파일을 비교

20. git stash

21. 되돌리기

출처

https://www.udemy.com/course/git-and-github-bootcamp/?couponCode=ST12MT122624
https://git-scm.com/video/what-is-git

profile
동국대학교 정보통신공학과

0개의 댓글