컴퓨터 과학/[인프런: 얄팍한 코딩사전] Git & GitHub

Chapter 02. 시간 여행하기

계란💕 2022. 6. 2. 15:07

2.1 변화를 타임캡슐에 담아 묻기

  1) 프로젝트의 변경사항을 타임캡슐(버전)에 담기 

 - git status로 확인해보면 아래와 같이 나온다.

    -> no commits yet => 아직 commit(번전 / 타임캡슐)이 없다. 즉, 버전이 없다는 뜻이다.

    -> "untracked": 아직 깃이 관리한 적 없는 파일을 말한다.

 

  - git add "파일이름"

  - git add . : 모든 파일을 깃에 담는다.

    -> git status로 확인하면 "change to commit": 묻을 준비가 됐다.

   -> 각 파일을 다른 버전에 넣을 수도 있다.

 

 

  2) 타임캡슐 묻기

    - commit: 새로운 버전으로 만든다.

    - git commit를 입력하면 아래와 같이 뜬다. 마우스가 쓰이지 않던 시절에 쓰던 vim모드가 뜬다.

     

   

 

    - 'i'를 눌러서 insert 모드를 바꾼 다음, "FIRST COMMIT"을 입력한다.

      -> esc + :wq로 빠져나온다. (저장하고 빠져나와야 커밋이 된다. )

      -> 빠져 나오면 VScode 창의 좌측 git_practice 폴더 아래에 파일들의 색이 초록 -> 흰색으로 바뀐 걸 볼 수 있다.

      -> 버전이 저장됐기 때문에 현재 버전에서 어떤 변화가 없다는 뜻.

 

    - git commit를 입력한다.

      -> git commit를 한 번 더 입력하면 "nothing to commit"

      -> first commit 상태 현재 버전에서 어떤 변화가 없다.

 

    - git log 입력

      ->  모든 커밋마다 있는 고유한 문자열이 출력된다. 

      -> "FIRST COMMIT" - 첫번째 버전이 저장된 것을 볼 수 있다.

 

    - 커밋 메시지 까지 함께 작성하려면??

      -> git commit -m "FIRST COMMIT"

 

 

 

  3) 다음 변경사항들을 만들고 타임캡슐에 묻기

    (1) lions 파일을 삭제한다.

    (2) tiger의 매니저를 Donald로 바꾼다. =>'M' 표시 (수정되었다는 뜻)

    (3) 새로운 파일 leopards.yaml을 만든다. => 'U' 초록색 표시

<hide/>
team: Leopards

manager: Luke

members:
- Linda
- William
- David

    (4) git status로 확인하면, 

        아래와 같이 삭제한 파일과 수정된 파일 새로운 파일이 뜬다.

 

    (5) git diff로도 확인 가능하다. (변경 사항 내용을 구체적으로 볼 수 있다.)

      - j 누르면 올라가고, k 누르면 한 줄씩 내려간다.

 

 

   (6) 캡슐에 담기

    - git add . 입력한다.

    - git status 로 확인하면 변경된 사실이 모두 캡슐에 담긴 것을 볼 수 있다.

 

     - git commit -m "Replace Lions with Leopards"  입력하고  git  log를 확인하면 

      -> 두 개의 버전이 만들어진 것을 볼 수 있다. 소스트리에서도 확인 가능하다.

 

  

    - add와 commit을 한번에 하려면? git commit -am "메시지"를 입력한다. (커밋 전에 add로 담을 필요 없다. )

      -> 단, 새로 추가된 파일(untracked)이 없을 때만 한정된다. 

 

 

  4) 다음 강을 위한 준비

    (1) 첫 번째 추가 커밋  

      - Tigers에 George를 추가하고  커밋 메시지 "Add George to Tigers"

      -> 소스트리에서 바뀐 내역을 확인할 수 있다.

 

 

 

    (2) 두 번째 추가 커밋

      - 아래와 같이 새로운 cheetas 파일을 만든다.

      - git commit -am " Add team Cheetas"

 

      - 아래와 같이 4개의 버전이 만들어진 것을 볼 수 있다.

 

    (3) 세 번째 추가 커밋 

       - cheetas 파일을 삭제한다.

       - leopard의 감독을 Nora로 바꾼다.

       -  새로운 팀을 만든다.

<hide/>
team: Panthers

manager: Sebastian

members:
- Violet
- Stella
- Anthony

       - 커밋 메시지: "Replace Cheetas with Panthers"

       - git add .

       - git commit -m 'Replace Cheetas with Panthers'

        -> 다섯 개의 commit내역을 확인할 수 있다.

       - 이처럼 5개의 버전이 있으면 성공적으로 수행한 것이다.

         -> 5개의 각 커밋은 묻어놓은 타임캡슐과도 같다.

 

 

2.2 과거로 돌아가는 두 가지 방법

  (1) Reset: 시간을 과거로 되돌린다. 과거로 돌아간 다음 이후의 행적은 히스토리에서 지워버린다.

  (2) Revert: 변경된 파일에 대해 변화를 거꾸로 수행하는 캡슐을 하나 넣음으로써 과거의 상태로 돌아간다.

 

  Note) 

    - 개발자들은 Git을 사용해서 코드를 공유하고 협업하는데 한 번 공유 공간에 올라간 내역을 reset하면 협업 시 문제가 발생한다.

      -> 그걸 기반으로 작업한 다른 사람들의 코드와 심각한 충돌을 일으키기 때문이다.

    - 따라서, 한 번 공유된 commit들은 Revert를 사용해서 되돌려야한다.

 

 

2.3 과거로 돌아가기 실습

  (1) 실습 전 내역 백업하기

    1) .git 폴더를 다른 곳에 백업해놓는다.

    2) Git_practice폴더의 .git폴더를 삭제한다.

    3) 소스트리를 보면 아래와 같이 창이 뜬다.

    4) git status를 보면 git이 관리하는 repository가 아니라는 메시지가 뜬다. 

 

--- 오류 --- 

 

 

    5) 백업해둔 폴더를 다시 Git_practice에 복사하고나면, 소스트리에서도 아까 만들어 놓은 5개의 커밋을 볼 수 있다.

 


  (2) reset 으로 돌아가기

    - 마지막 커밋에서 leopards를 수정하고 매니저를 Nora로 바꿨다. 그리고 panthers를 추가하고 cheetas를 삭제했다.

    - 이전 커밋인 Add team Cheetas로 돌아가려면? 

      -> git log 를 통해 "Add team Cheetas"의 커밋 번호를 확인한다.

    - git reset --hard 26fe1a9c55  를 입력한다. (앞 부분만 입력해도 된다.)

      -> 현재  "Add team Cheeta" 상태로 돌아간 것을 확인할 수 있다.

      -> 그리고 마지막에 추가했던 파일인 panthers 파일이 삭제된 것을 볼 수 있다.

      -> leopards의 매니저도 Luke로 돌아간 것을 볼 수 있다.

      -> 마지막에 지웠던 cheeats 파일도 다시 생긴 것을 볼 수 있다.

    - 즉,  파일의 생성, 추가, 삭제가 모두 과거로 돌아간 것이다.

  

  (2) -1 첫번째 커밋으로 돌아가려면? 

    1) git log로 조회한다.

    2) FIRST COMMIT의 hash를 확인한다. 

      -> git reset --m hard  002ddcf80f3

 

    3) git log로 확인하면 첫 버전으로 돌아간 걸 볼 수 있다. 소스트리에서도 확인 가능

 

  (3) reset 하기 전 시점으로 복원하려면?

    - .git을 삭제한다.

    - 백업해둔 .git폴더를 다시 붙여넣기한다.

     -> 소스트리를 보면 5개의 커밋 내역이 다시 돌아온 걸 볼 수 있다.

    - git status를 보면 아래 변화를 볼 수 있다.

      ->  ??????????

 

    - git reset --hard (돌아갈 커밋 해시): 해시가 없으면 마지막으로 묻힌 타임캡슐 상태로 돌아간다.

 

    -  git status로 확인하면 아래와 같이 확인 가능

      -> lions 파일을 새로 만들어진 파일로 인식한다. 파일 삭제한다.

     

    -  또 다시 git status로 확인하면  더이상 수정할 게 없이 완벽하게  다섯 번째 커밋 "Replace Cheetas with Panters"상태로 돌아와있다.

 

 

  (4) revert로 과거의 커밋 되돌리기

    - git log로 "Add George to Tigers"의 커밋을 찾는다. => fbdb7506f16861

    - git revert fbdb7506f16861 입력

     아래와 같이 나오며 그대로 저장해서 빠져나온다.

 

    - 그러면 아래와 같이 새로운 커밋이 생긴다. Add George to Tigers를 반대로 실행하는 커밋이 새로 생겨난 것이다.

    - replace Lions with Leopards의 해시를 복사해서 07f3eade717859db4492a66157f9bf7db7e956f9 

      -> git revert 07f3eade717859db4492a66157f9bf7db7e956f9 

      -> "Reverting"

     -> 힌트: git에서 add / remove를 쓰고나서  revert를 continue해라

 

    - git rm   leopards.yaml .. 삭제한다.

    -  git revert --continue 

      -> :wq로 빠져나온다.

    - 소스트리를 확인한다.

      -> 성공적으로 revert가 이뤄진 것을 볼 수 있다.

      -> lions파일이 생겨나고 John으로 매니저가 바뀌었다.

 

 

    - Replace Cheetas with Panthers의 커밋을 복사한다.

    - git reset --hard 커밋번호

 

    - > 이전

 

  -> 이후

 

 

    - Add George to Tigers 커밋을 복사한다.

    - git revert --no-commit fbdb7506f168616cda36

      -> 아직 커밋은 되지 않은 상태가 된다. 다시 커밋을 해줘야한다.'

 

    - git status을 보면 

 

    - git reset --hard 

      -> 마지막 커밋의 상태로 되돌아간다.

      -> Replace Cheetas with Panthers 상태로 돌아간 걸 확인할 수 있다.

 

 

2.4  Source Tree로 진행해보기

  1) 변경 사항 만들고 커밋하기

 

    - leopard를 삭제한다.

    - gitignore에  *.config를 추가한다.

    - hello.txt 파일을 추가한다.

    - 위 변경 사항을 저장하고 소스트리에서 모든 스테이지에 올리기를 선택한다.

    - 소스트리 창 좌측 상단에 커밋+ 버튼을 클릭한다.

    - 창의 아래 메시지 박스에 커밋 메시지 "Commit with SourceTree"를 입력하고 커밋을 누르면 끝난다.

 

  2) revert

    - Add George to Tigers의 수정사항을 되돌려보기

    - 아래 창과 같이 커밋 되돌리기를 클릭한다. (팝업: 해당 커밋을 거꾸로 하는 새로운 커밋을 추가하겠는가? -> 예)

      -> 그러고  나서 Tigers 팀에 George가 없어진 걸 볼 수 있다.

 

 

 

  3) reset

    - 소스트리의 Replace Cheetas with Panthers 에 대해  아래와 같이 실행한다. reset 실행

 

 

 

      - 아래의 선택지에서 hard를 선택한다. 알림 예 선택

 

      -> 그러고 나면 hello.txt 파일도 사라지고 다른 부분도 이전으로 돌아간 걸 확인할 수 있다.

 

 

 

출처: 얄팍한 코딩사전

https://www.inflearn.com/course/%EC%A0%9C%EB%8C%80%EB%A1%9C-%ED%8C%8C%EB%8A%94-%EA%B9%83