<공부전 나의 생각>**************************************************
part 1에서는 기본적인 git명령어, git의 3가지 작업영역(워킹 디렉토리, 스테이징 에리어, 레파지토리), git의3가지 파일상태(모디파이드, 스테이징, 언트랙드or커밋티드)이렇게 배웠었다. 이후 git config, git status, git log --oneline 등 사용자 정보 설정, 저장소의 상태, 커밋기록 확인등 다양한 활용법 또한 익히게 되었다. 이제 다시 커밋 로그에서 HEAD, 해시(커밋id)를 알아보도록 하자
<공부중 필기>**********************************************************
# mater는 알겠어 그럼 HEAD는 뭐야?
HEAD 또한 특정 커밋을 가르킴(가장 최근에 커밋한 것을 가르킴) 이때 master를 통해서 가르키므로 이중 포인터 형태로 참조하고 있다고 생각하면 된다. HEAD --> Master --> 가장최근커밋기록
# 해시: 커밋 항목의 고유 id번호
Hash는 커밋항목의 고유 식별자로 쓰인다고 생각하면 된다. 이건 몰라도 되지만 SHA1알고리즘으로 만들어 지는 암호 이다.(중복이 없는 임의의 문자열), Git이 추구하는 분산형 버전 관리를 위해 어떠한 상태에서도 형상관리를 하기 위함이다.
이제부터 커밋ID가 아닌 Hash로 부르기로 한다.
# git show: 특정 커밋정보를 자세히 보기
git show
part1에서 실습했던 git log -p -1과 똑같은 결과를 출력한다.(가장 최근 커밋항목 1개의 상세정보 출력)
만약 특정 커밋항목을 상세확인 하고 싶다면 해당 커밋 Hash를 적어주면 된다.
git show 커밋해시
근데 커밋해시는 너무 긴것같은데 저걸 다 외워서 쳐야 하나요? --> ㄴㄴ 해시의 앞 몇글자만 치면 됩니다.
위의 사진같은 경우는 472a로 시작하는데 이걸 한번 출력해보겠습니다.
앞에 몇글자만 입력하면 된다는 말씀~
<정리>
git status: 저장소내의 파일 상태 출력
git status -s: 저장소 내의 파일 상태를 간단하게 출력 (??, M, MM, A)
git log: 저장소의 커밋 히스토리를 출력
git log --pretty=oneline: 로그 출력시 커밋을 한줄로 간략하게 표기
git log --oneline: 로그 출력시 커밋을 한 줄로 표시(해시도 앞자리 7글자만 출력)
git log --graph: 로그를 그래프 형태로 출력
git show: 가장 최근 커밋기록 1개를 자세히 표기
git show 커밋해시: 해당 커밋해시를 가지고 있는 커밋기록 을 자세히 표기
git show HEAD-숫자: HEAD를 기준으로 숫자만큼의 이전에 가르킨걸 출력함(숫자가 1이면 최근 커밋기록중 2번째것을 출력하게 된다.
# git diff: 파일의 수정 내용 비교하기
git diff는 파일의 수정 또는 변경 사항을 비교하는 명령입니다.
이전에서 git show 명령어를 통해 -붉은색 글씨는 삭제, +초록색 글씨는 추가되었다는걸 알수 있었습니다.
그럼 git diff는 뭐가 다르냐?
--> 커밋간에 파일 내용 비교에 더 특화된 명령입니다.
비교할 대상 커밋들을 지정할 수 있습니다. 우선 git diff만 입력을 해보도록 하겠습니다.
git diff
이렇게 옵션없이 입력하면 Modified(Unstaged)상태의 파일과 최신 커밋의 파일을 비교합니다.
간단히 말해
가장최신커밋파일 <==> 현재 수정중인 파일 을 비교하게 됩니다.
현재 hello.py 파일을 만들고 add commit을 해주었습니다. 이후 주석을 달아주고 ctrl+s를 눌러 저장해준뒤 이제 git diff를 입력하겠습니다.
그럼 modified 상태의 파일을 스테이지에 올리고 commit 해보겠습니다.
이렇게 가장최근커밋과 작업중(modified, unstaged)인 파일을 비교할수 있었습니다. 그럼 staging area에 올라간 파일과 가장 최근 커밋과 작업중 비교는 어떻게 수항할까요? 바로 --staged 옵션입니다.
git diff --staged
다시 파일을 수정하고 스테이지에 올려본뒤 위의 명령어를 입력해보도록 하겠습니다.
잘되네요
# 이번에느 커밋 <==>커밋 끼리의 비교를 시작하도록 하겠습니다.
방금 전 작업한 파일을 커밋하고 한번 로그를 보도록 하겠습니다.
git diff 과거커밋해시 현재커밋해시
왼쪽게 과거, 오른쪽게 비교적 최신의 해시를 입력해주면 됩니다.(굳이 현재커밋이 아니여도 됨)
git diff HEAD^ HEAD 처럼 상대경로 형식으로 커밋항목을 비교하는게 가능합니다.(이런게 있다고만 알자 HEAD에 ^붙으면 최신HEAD가 가르키는 해시 이전의 해시를 포인터로 가르키게 된다.
<정리>
git diff: 가장최근커밋 <==> 현재 수정만한(Modified 상태) 파일 비교
git diff --staged: 가장최근커밋 <==> 현재 staging된 파일과 비교
git diff 커밋해시1 커밋해시2: 커밋1 <==> 커밋2 끼리 비교 (뒤에 오는게 초록색)
# reset: 실수로 add(staging)해버린 파일을 되돌리기(Unstaging 하기)
작업을 하다보면 스테이징 하지 말아야 할것까지 같이 올려버리는 경우가 있습니다. (git add . 해버리는 상황) 이때 다시 Working Directory로 이동시키는법을 알아보겠습니다.
우선 touch 명령어를 사용해서 2개의 빈 메모장 파일을 만들어 보도록 하겠습니다.
touch memo1.txt
touch memo2.txt
그리고 git add .을 통해서 스테이지에 올리도록 하겠습니다.
그럼 git reset 명령어를 통해서 Staging area에 존재하는 2개의 txt파일을 다시 Working Directory로 끌어내리겠습니다.
그 전에 확실하게 눈으로 보기 위해서 git status 명령어를 사용하도록하겠습니다.
git reset
위의 명령어를 입력한뒤 다시 git status를 보도록 하겠습니다.
이렇게 옵션 없이 git reset을 하면 스테이징된 모든 파일이 다시 워킹 디렉터리로 내려간다는 것을 알수 있습니다.
만약 특정 파일만 reset 하고 싶다면
git reset 파일이름(혹은경로명)
이렇게 하면 됩니다. git reset memo1.txt 이렇게 입력하면 될것같네요!
# git commit amend: 최근에 작성한 커밋 수정하기(최근 커밋 기록 덮어씌우기)
현재목표: text1, text2를 커밋하는것
나의 실수: 실수로 text1은 워킹디렉에 내버려두고, text2는 commit 해버린 상황
나의 실수를 덮기 위해서 text1과 text2를 동시시에 커밋했다고 최근 커밋 히스토리를 수정해야 한다.
test2만 커밋한 상황을 만들겠습니다.
memo2만 커밋된 상황입니다. 그렇다면 이제 memo1과 memo2가 동시에 커밋되었다는 기록으로 master 로그를 변경하도록 하겠습니다.
일단 memo1도 스테이징 해주겠습니다. git add memo1.txt를 입력해줍시다.
이후
git commit --amend
이렇게 작성 하시면 가장 최근에 작성한 커밋을 덮어 씌우게 됩니다. 만약 커밋 메시지까지 덮어씌우고 싶다면
git commit --amend -m "덮어씌울메시지"
이렇게 적용하시면 됩니다. 그럼 수정 전과 후를 비교해보도록 하겠습니다.
누가봐도 처음부터 2개의 txt파일이 올라간것처럼 꾸며졌습니다. 커밋 메시지 까지도 그대로 입니다. 나중에 실수하면 사용하면 좋겠군요~~
단, 커밋해시는 기존과 똑같지 않습니다. 이점을 유의하시길 바랍니다.
<정리>
git commit --amend: 커밋내용물 추가함
git commit --amend -m "메시지': 커밋내용물 추가 + 메시지도 변경함
# checkout: 해당 커밋 시점으로 Working directory의 파일내용을 복원
그전에 git log --oneline 명령을 통해서 로그를 확인합니다.
저는 여기서 가장 처음의 "im testing now" 커밋메시지를 가진 시점으로 되돌려보겠습니다.
git checkout 커밋해시
맨 첫줄에 You are in detached HEAD state라는 문구가 뜨네요
맨 아래에는 HEAD 포인터가 472a62a 커밋해시를 가르키고 있다는걸 알려줍니다.
그 다음으로는 경로 옆에 (master) 대신에 ((472a62))라고 변경된걸 알수있습니다. 이때 시점으로 잠시 시간역행 한것 같습니다. 실제로 바탕화면에서 폴더 내의 구성도 hello.txt만 남아 있고 나머지는 없어졌네요. 완전 신기하네요 한번 과거로 돌아간 상황에서 git log를 입력해보겠습니다.
그렇다면 이제 다시 현재로 돌아갈 시간입니다.
git checkout master
다시 이때 시점으로 돌아가려면 위의 명령어를 입력하시면 됩니다. 원래는 가장 최근의 커밋해시를 적어주어야 하지만, 기억하기도 어렵고 HEAD는 가르키는 대상이 바뀌었지만, master는 기존의 최근 커밋을 가르키고 있기에, master를 활용한것입니다.
이제 다시 원상복구가 되었습니다. 이렇게 특정 커밋 시점으로도 돌아가는게 가능합니다.
참고로 그럼 이런 의문이 듭니다. 과거로 돌아가서 미래와 똑같이 하지 않는다면, 새로운 타임 패러독스가 발생하는게 아닌가? 맞습니다. master브랜치에서 벗어나 일정 과거 커밋은 똑같지만 특정 분기점을 기준으로 완전히 다른 타임라인이 발생하게 됩니다. 만약 새로운 분기점을 저장하고 싶다면, 새로은 브랜치를 만들어서 해당 커밋 히스토리를 저장하면 됩니다.
참고로 Working directory에서 수정중인 파일을 수정작업 시작하기 전으로 돌리고 싶으면
git checkout 파일명
이렇게 입력하면 파일을 원본으로 되돌릴수 있다.
그럼 staging area에 올라간 파일을 Unmodified 상태로 되돌리려면 어떻게 해야 할까요
순서1: git reset 해당파일명(스테이징에리어 -> 워킹디렉토리로 내리기)
순서2: git checkout 해당파일명(워킹디렉토리에서 수정전으로 돌리기)\
@내 지금까지 헷갈렸던것
Untracked(기존에 주시하던게 아님): 새로 생성된 파일을 의미
Unmodified(변경된것 없음): 기존파일이 변경되니 않음을 의미
<공부 후기>*********************************************************
ㅇ
ㅇ
알게된점:
'알아두면좋은IT상식' 카테고리의 다른 글
CPD(Change Point Detection, 변화 지점 탐지)란 무엇인가?~ (0) | 2023.12.24 |
---|---|
[CS] 디자인 패턴과 프로그래밍 패러다임 part 1 (2) | 2023.10.26 |
[머신러닝/딥러닝] 자주 등장하는 용어 정리 (0) | 2023.07.20 |
[Git&Github] 깃이란 무엇인가 그리고 깃허브는 어떻게 쓰는건가? part 1 (0) | 2023.07.06 |
[딥러닝] YOLO(You Only Look Once) 객체 탐색 알고리즘 (0) | 2023.07.05 |