Git - 셋업, 기본명령어 몇개 (1편)

Lina Hongbi Ko·2022년 12월 22일
0

Git

목록 보기
1/4
post-thumbnail

Git 공부 기록🐶

what is Git?

  1. 버전관리
    우리는 파일이나 폴더를 관리할 때 최종/최최종/최최최종 이런 쓸데없는 파일이나 폴더를 생성해서 관리할 필요 없이 날짜/사용자/기본정보를 통해 파일이나 폴더를 쉽게 관리할 수 있다.
  2. 백업하기
    우리가 가지고 있는 컴퓨터는 '확실한것'과 '불확실한것'이 있는데 '확실한 것'은 '내 컴퓨터가 언젠가는 고장난다'는 것이고 '불확실한 것'은 '내 컴퓨터가 언제 고장 날지 모른다'는 것이다. 그래서 우리는 백업이 필요한데 깃의 원격저장소(Github)에 백업을 한다.
  3. 협업하기
    여러 사람과 함께 일할 수 있어서 편리하다.

🔑 Git을 사용하기 위해서는 리눅스 환경의 터미널 또는 cmd를 이용하는게 편리하므로 리눅스 명령어들을 알아놓는 것이 좋다:)


Git은 어떻게 파일이나 폴더를 관리할까?

작업트리 (workingtree) ➡️ add ➡️ 스테이지 (staging area) ➡️ commit ➡️ 저장소 (repository)

이런 순서로 관리를 하는데 자세히 설명하자면,

  • 작업트리(working tree) : 파일 수정, 저장 등의 작업을 하는 디렉토리(작업 디렉토리)
  • add : commit 전에 commit할 파일들을 골라 놓기 위한 명령
  • 스테이지(staging area) : 버전으로 만들 파일이 대기하는 곳
  • commit : 파일의 현재상태를 매일매일 기록해 둘 수 있는 기능을 명령하는 건데 정확히 말하면, 파일의 스냅샷을 저장해 버전 생성을 한다.
  • 저장소(repository) : 스테이지에서 대기하고 있던 파일들을 버전으로 만들어 저장하는 곳
  • 스테이지와 저장소는 .git 디렉토리라는 곳에 저장되는데 깃을 초기화했을때 만들어지는 .git 디렉토리 안에 숨은 파일 형태로 존재한다.
  • 결론 : 작업트리에서 문서를 수정하고, 수정한 파일 중 버전으로 만들고 싶은 것을 스테이지에 저장한다. 그리고 스테이지에 있던 파일을 저장소로 커밋해 깃이 버전을 만들고 관리하는 순서.
  • git config : 깃의 환경설정 저장되는 곳

git config --list : 깃 환경설정들 확인
git config --global -e : 에디터모드로 config 열기

(터미널에서 code . 이라고 명령하면 바로 vscode 나오게 하는 법 : command+shift+p -> shell command : Install 'code' command in PATH 체크 -> git config --global core.editor "code --wait")

깃의 환경설정 속성값 정보확인

git config --h

사용자 관련 설정

git config --global user.name "Hongbi" : 사용자 이름 설정(global적으로)
git config --global user.email "rhghdql666@gmail.com" : 사용자 이메일 설정(global적으로)
git config --global core.autocrlf input (윈도우일 경우 true) : 깃에서 받아오거나 올릴때 줄바꿈 문자열<carriage-return과 line feed> 자동으로 삭제/생성 원할하게 하기 위해서
git config --global init.defaultBranch main : 기본 master 브랜치 이름 master -> main으로 바꾸기
(git branch -M main 요것도 있음
github.com에서 기본 브랜치 이름을 master이 아닌 main으로 사용하라고 하기 때문에 우리 로컬 작업 폴더에 있는 기본 브랜치 이름도 main으로 변경하는게 좋다.)

git의 기본형태

git + 명령어 + 옵션
ex)
git add -option

git 초기화

깃이 파일을 생성하고 코드작성 등을 추적하기 시작(로컬 리포지토리 생성)

git init

git 삭제

git rm -rf .git

스테이지에 파일추가

git add
git add . (작업 폴더의 모든 파일 전부 스테이징)
git add * (작업 폴더의 모든 파일 전부 스테이징)
git add *는 파일을 삭제하면 staging area에 추가되지 않지만 git add .는 모든 작업들을 추가함!
git add *.css (특정파일 스테이징)
git 파일명1 파일명2 (여러파일들 동시에 스테이징)

스테이징 내용을 .git/index 파일에 저장하기 때문에 스테이지에 올리는 것을 '인덱스(index)에 등록한다'고도 한다.

git add hello.txt

버전추가

git commit -m "메시지"
✏️commit tip : 기능별로 버전 추가하고 커밋메시지는 동사형으로 쓸 것(Init, Fix, Add ...) & 메시지에 해당하는 내용만 커밋할 것! 관련없는 것까지 같이 커밋하면 헷갈리니깐..

git commit -m "message1"
~~
~~
1 file changed, 1 insertion(+)

한번이라도 커밋한 적 있는 파일을 스테이지&커밋 한꺼번에 처리

git commit -am

git commit -am "second commit"

가장 최근의 커밋 메시지 수정

git commit --amend

저장소에 저장된 버전 확인

git log
git log --oneline --all --graph
(commit한 기록 한눈에 쉽게 보기)
git log --stat (커밋에 관련된 파일까지 함께 보기)
git log -p (수정된 내용들도 확인가능, 변경된 파일들을 확인하고 싶을때)
git log --onleine --reverse (최근 말고 예전꺼부터 정렬)
git log --pretty=oneline
git log --pretty=format:'%h %an %ar %s' (h: 해시코드만 나오게 an: 작성자만 나오게 ar: 날짜만 나오게 s: 제목만 나오게)
git log -3 (최근 커밋한 3개만 보기)
git log --author="hongbi" (작성자가 hongbi인것만 보기)
git log --before="2022-12-25" (지정된 날짜 이전 커밋들 보기)
git log --grep="project" (커밋 제목에 project가 포함된것만 보기)
git log --S "about" (컨텐츠 내용에 about이 있는 커밋만 보기)
git log about.txt (about.txt에 해당하는 파일의 로그만 보기)
git log HEAD ~1 (부모 커밋보기)
git log HEAD ~2 (부모 이전 커밋보기)
git show 해시코드 (해시코드의 커밋보기)
git show 해시코드:user_information.txt (해시코드의 user-information파일 커밋보기)

✏️ HEAD : 지금 바라보는 시점의 버전을 가르킴 (head ~1: 지금 있는 이전 버전 가리킴)

수정한 파일이 저장소에 있는 최신버전과 어떻게 다른지 확인

git diff (바로전 commit과 현재 코드의 차이점 비교 / workingtree에 있는 작업비교가 deafult.)
git diff 커밋id (과거의 특정 commit과 현재 파일을 비교)
git diff 커밋id1, 커밋id2 (과거의 특정 commit 2개 간의 차이점 비교)
git diff --staged (스테이징 area에 있는 것 확인)
git difftool (vscode에서 차이점보기
but! 설정해야할게 있음 >> git config --global -e해서 환경설정 들어가서 [diff]에 tool=vscode [difftool "vscode"]에 cmd = code --wait --diff $LOCAL $REMOTE라고 적기)

깃 상태보기

깃 상태를 나타내는 메시지 나옴

git status
git status -s (간단히 깃 상태보기)

git status 
on branch master // 현재 master 브랜치에 있음
No commits yet // 아직 커밋한 파일 없음
nothing to commit // 현재 커밋할 파일 없음
untracked files: ~~~ hello.txt // 아직 한번도 버전 관리하지 않은 파일

버전 만드는 단계마다 파일 상태 알아보기

  • tracked file: 한번이라도 커밋한 파일 상태
  • untracked file : 한번이라도 깃에서 버전관리(커밋)하지 않은 파일 상태
  • unmodified file : 작업트리에 아무 변경사항 없는 상태 / 커밋한 후
  • modified file : 수정한 상태
  • staged file : 스테이지에 올린 상태
git satus
On branch master
Changes not staged for commit
~~~
~~~
modified: hello.txt // 깃은 한번이라도 커밋한 파일의 수정여부를 계속 추적함
Untracked files :
~~~
~~~
hello2.txt // 한번도 깃에서 버전관리를 하지 않았기 때문에 수정내용을 추적하지 않았음

깃의 alias 이용해서 status 짧게 줄여쓰기

git config --global alias.st status
git st

최근 commit된 상태로 현재 파일 수정내역 되돌리기

git restore 파일명
(파일 최신 이전 commit으로 되돌리기. working area에서)
git restore .
(현재 작업하는 모든것들 최신 이전 commit버전으로 되돌리기. working area에서)
git restore --source=해시코드 파일명
(입력한 파일을 특정 커밋 아이디시점으로 복구)
git restore --staged 파일명
(특정 파일 staging 취소 & 다시 working area로 되돌리기. staging area에서)
git restore --staged .
(staging area에 있는 모든 파일들 staging 취소 & working area로 되돌리기. staging area에서)

✏️git checkout --파일명 이라는 명령어를 써도 되지만 checkout이 브랜치를 이동할때에도, 태그나 어떤 특정한 버전으로 이동할때에도 checkout을 쓸 수 있기 때문에 restore을 쓰도록 하자.

커밋 취소 / 커밋 되돌아가기

git revert 커밋아이디 (커밋아이디 취소)
git revert 특정커밋아이디1 특정커밋아이디2 (동시에 여러개 revert)
git revert HEAD (최근했던 commit 1개만 revert)
git reset HEAD 파일명 (파일 스테이징 취소, HEAD 다음 파일 이름을 지정하지 않으면 스테이지에 있는 모든 파일들을 되돌림.)
git reset HEAD^ (현재 HEAD가 가리키는 브랜치의 최신 커밋 취소)
git reset --hard 커밋 아이디 (그 커밋이 생성될때로 시간을 되돌림 -> 협업시에는 쓰지 않는게 좋다. 커밋 아이디 이후의 일들이 모두 삭제됨!!)

❗️revert, reset
🔎 git reset : 커밋삭제하고 특정 커밋으로 되돌리기
예를 들어 reset A를 입력하면 최근 커밋을 A로 리셋함.
(즉, A커밋을 삭제하는 것이 아니라 A커밋 이후에 만들었던 커밋을 삭제하고, A커밋으로 이동하겠다는 말)

  • git reset 명령 옵션 :
    HEAD가 내가 가고자하는 포인터(해시코드나 지정한 명령어들)로 가고, 옵션에 따라서 다시 working area나 staging area로 이동하거나 아무것도 이동하지 않고 삭제.
  1. --soft : 내가 가고자하는 커밋(버전)을 포인터(HEAD가)로 가르키고, 이후에 작업했던 파일들을 staging area에 남김. (git commit 해야함 )
  2. --mixed : 내가 가고자하는 커밋(버전)을 포인터(HEAD가)로 가르키고, 이후에 작업했던 파일들을 working area에 남김. (git add + commit 해야함) / (옵션 없이 git reset명령할 경우 이옵션이 default)
  3. --hard : 내가 가고자하는 커밋(버전)을 포인터(HEAD가)로 가르키고, 이후에 작업했던 파일들은 working area나 staging area에 아무데도 가져오지 않고 모두 삭제.

✏️ 모르고 git reset --hard 옵션을 서서 다 삭제 되버리면요???
: git relog(reference log)를 보고 원하는 해시코드 복사해서 돌아갈 수 있음! HEAD가 이전에 가르키고 있었던 내용들을 다 기억하고 있기 때문이다.

git reset --hard reflog에서 복사한 해시코드

✏️ 로컬에서 작업하다가 reset --hard를 통해 언제든 되돌아갈 수 있지만, 커밋하지 않은 파일들은 이전으로 되돌아가기는 힘들다. 이럴 때는 Local History 라는 extension을 설치해서 사용.

🔎 git revert : 해당하는 커밋만을 취소하고, 취소한 버전을 커밋으로 남김.
(reset이나 restore은 되돌리거나 취소한 기록이 없음)

이미 서버 master branch에 commit된 아이들이라면 reset, rebase를 이용하기보다는 revert를 사용하는 것이 좋다. 새로운 커밋을 만들어서 추가된 내용(revert한 내용)을 변경하고 추가해서 안전하다. 즉, history를 수정하지 않기 때문이다.

  • revert를 이용할때 commit 남기지 않기
    : git revert --no-commit 해시코드(커밋아이디)

!중요 : git reset의 경우에는 되돌아갈 커밋해시 지정하는거고, git revert는 취소할 커밋해시 지정하는 것임!

이전의 커밋 수정하고 싶을때(최신 더 이전의 commit 수정)

git rebase -i 커밋아이디
(커밋아이디는 내가 변경하고 싶은 해시코드 이전의 것을 입력해야 한다. i는 interactive약자.)

rebase를 이용하기 때문에 수정하게되면, 수정한 커밋과 그 이후의 커밋도 새로운 커밋이 되기 때문에 주의해서 써야할 것. (다른개발자와 일을 할 때 같은 브랜치를 작업하면 rebase는 지양합시다,,)
명령어를 입력하면 'pick 해시코드 commit title'들이 줄줄이 나오는데 "pick"이라고 써진 부분이 명령을 내려서 우리가 할 수 있는 부분 (pick, reword, squash, e ... 다양하고 각 기능들은 외울 필요없이 어떻게 쓸지 안내되어있음)을 수정하고 원하는 대로 변경.

ex)

  • 깃 커밋 메시지 변경
git rebase -i 해시코드 (선택하고 싶은 해시코드 이전꺼 입력)
r 해시코드 commit title~~~ // pick -> r로 바꾸고 저장
메시지 변경 후 닫기
완료.
  • 필요없는 커밋 삭제
git rebase -i 해시코드 (선택하고 싶은 해시코드 이전꺼 입력)
drop 해시코드 commit title~~~ // pick -> drop으로 바꾸고 저장
여기서 문제는 같은 파일이 이후의 커밋에서도 똑같이 있으면 conflict이 발생한다.
이럴땐, merge conflict을 해결한 것처럼 해당파일을 열어서 수정하고 git add 파일명.
git rebase --continue
완료.
  • 커밋분할
git rebase -i 해시코드 (선택하고 싶은 해시코드 이전꺼 입력)
e 해시코드 commit title~~~ // pick -> e로 바꾸고 저장
커밋을 분할한다는 것은 파일을 각각 저장하고 커밋을 따로 만드는 것이기 때문에
파일을 만든 시점으로 돌아가야한다. 따라서 git reset 명령어를 적어서 각 파일을 만들고
커밋 하기 직전의 해시코드로 돌아간다. -> git reset 해시코드
git add 파일명1
git commit -m "분할1메시지" // 하나의 파일 하나의 커밋으로 분할
git add 파일명2
git commit -m "분할2메시지: // 다른 하나의 파일 하나의 커밋으로 분할
git rebase --continue 
완료.
  • 커밋 squash
git rebase -i 해시코드 (선택하고 싶은 해시코드 이전꺼 입력)
squash 하고 싶은 아이들 스캔
제일 처음(대표 squash할 commit)은 pick 옵션 그대로,
나머지 suqas할 commit들은 pick -> s로 바꾸고 저장
squah 메시지 입력
완료. (squash한 묶어진 새로운 커밋 하나 탄생)

✏️ 깃의 히스토리 (커밋들의 히스토리)를 수정하는 것은 나의 로컬에 있는 것만 변경 해야한다. 내가 이미 서버에 업로드한경우라면 되도록이면 수정하지 말자. 팀원들과의 커밋 히스토리가 꼬여버릴 수 있으니깐..! (나 혼자 로컬에서 일단 작업 다 해놓고 올리기.,) -> rebase와 마찬가지로 다시 새로운 커밋을 만들어서 되돌리는것과 같으므로.

✏️ 커밋의 메시지 중 WIP이라는 문구를 종종 볼 수 있을텐데 WIP은 Working In Progress의 약자로 아직 일이 진행중임을 말한다. 개인적으로 branch에서 일을 할 때 재빠르게 그냥 commit을 해놓고 싶을때 쓰는데 좋지 않다.


.gitignore파일로 버전관리에서 제외

: 버전관리 중인 디렉토리 안에 버전관리를 하지 않을 특정파일 or 디렉토리가 있다면 .gitignore 파일을 만들어 목록을 지정한다.
gitignore 파일 들어가서 작성하기만 하면됨!!

echo *.log > .gitignore

버전 이동하기

git checkout 해시코드 (해시코드로 돌아감)
git checkout master(main) (다시 메인으로 돌아옴)
git checkout v2.0.0 (특정태그로 이동)
git checkout 브랜치명 (브랜치 이동)

특정커밋 북마크

git tag 태그할이름(v1.0.0 요런식으로)
git tag v1.0.0 해시코드 (v1.0.0 태그 이름으로 해시코드에 해당하는 커밋에 태그 달기)
git tag v1.0.0 해시코드 -am "정보"(태그 + 정보도 같이 포함하고 싶을 때)
git tag (만들어진 모든 태그보기)
git tag -l "v1.0.*" (특정문자열 태그 모두 확인)
git tag -d v1.0.1 (태그 삭제)
git checkout -b testing v2.0.0 (testing이라는 브랜치가 태그 v2.0.0에서 새롭게 만들어짐)
git push origin v1.0.0 (내가 만든 태그 서버에 업로드)
git push origin --tags (모든 태그들 서버에 업로드)
git push origin --delete v1.0.0 (특정태그 삭제)


from. 드림코딩아카데미 git마스터과정,
from. Doit! 지옥에서 온 문서 관리자 깃&깃허브 입문
from. 애플코딩 매우쉽게 알려주는 git & github

profile
프론트엔드개발자가 되고 싶어서 열심히 땅굴 파는 자

0개의 댓글