GIT을 사용해서 여러 버전 넘나들기(커밋 생성, Reset, Revert)

도토리·2023년 4월 5일
0

git & github

목록 보기
3/10

현재 상황

'git status' 입력 시 현재 상황

  • No commits yet: commit == 버전이라고 생각하자.
  • untracked 파일: git의 관리에 들어간 적이 없는(git이 버전으로 관리해본 적이 없는) 파일, 해당 파일을 버전 안에 넣은 적이 없다는 뜻

버전 만들기

add: 버전으로 만들 준비하기
commit: 버전 만들기


  • 특정 폴더의 모든 파일에 대해, 버전으로 만들 준비하기
git add .


'.'은 '해당 폴더(git-practice) 안의 모든 것'이라는 뜻임


Changes to be commited: 버전으로 만들 준비가 되었다는 뜻이다.

  • 특정 파일에 대해, 버전으로 만들 준비하기
git add tigers.yaml

참고) commit 전에 add가 존재하는 이유(내가 생각한 이유)
.gitignore가 아닌 tigers.yaml, lions.yaml만 커밋하고 싶다('git add .'가 아닌 'git add 파일명'를 입력해야 함). 그런데, 만약, commit 전에 add가 없다면, 둘만 커밋할 수가 없다. add는 commit하기 전에, commit할 것들을 모으는 작업이라고 생각하면 될 것 같다.

  • 버전 만들기(= 커밋 만들기)
git commit -m "FIRST COMMIT"

▶ git commit: 커밋하기
▶ -m "FIRST COMMIT": 커밋할 때, 메시지 주기
'FIRST COMMIT': 통상적으로 프로젝트의 첫 버전을 만들 때 쓰이는 메시지
▶ 커밋 메시지는 "" 또는 ''를 사용해서 작성하면 되고, 해당 버전에서 무엇을 했는지를 작성해주면 된다.

  • 커밋이 되었는지 확인하기

▶ CLI

git log


모든 커밋은 d65660... 같은 고유의 문자열을 가진다.

▶ GUI(소스트리)

  • add, commit을 한 번에 하기
git commit -am "커밋 메시지"

단, 새로 추가된 파일(untracked 파일)이 없을 때에만 가능하다.


버전2를 만들어보자. 변경 사항은 다음과 같다.
1. lions.yaml 삭제
2. tigers.yaml의 manager를 Donald로 변경
3. leopards.yaml 추가

  • git status

  • git diff로 좀 더 자세하게 보기
    git이 관리하는 파일(lions.yaml, tigers.yaml)에 대해, 변경 사항을 자세하게 보여준다.

  • 커밋하기(버전2 만들기)

git add .
git commit -m "Replace Lions with Leopards"

과거 버전으로 돌아가기 - Reset, Revert

Reset: 과거 버전으로 돌아간 다음, 이후 버전들은 모두 히스토리에서 제거한다.
Revert: 특정 과거 버전에서 수행했던 모든 것들을 전부 반대로 수행한 커밋이 새로 하나 생성된다.

언제 Revert를 하는가?

  • 과거 버전에 대해 취소한 것까지도 기록으로 남길 때
    추가한 것, 취소한 것이 zero sum이 되는 것이 아니라, 추가한 것도, 취소한 것도 전부 히스토리로 남는다.
  • 특정 과거 버전 이후의 버전들은 그대로 유지하되, 해당 과거 버전에서 실행했던 내용만 취소하는 경우
  • 협업할 때 공유된 커밋에 대해서는 Reset이 아닌 Revert를 사용한다.

현재 커밋 히스토리는 아래와 같다.



  1. Reset 통해 과거 버전으로 돌아가기
git reset --hard 커밋해시

해당 커밋으로 돌아가고, 이후의 모든 커밋들이 히스토리에서 제거된다.
참고로, 커밋해시는 'git log' 명령어를 수행함으로써 알 수 있다.

EX1)

git reset --hard da80e8692e23c0f52b5f4d64ca3a9ab4924019d0

EX2)

git reset --hard d65660cedb6189ea026e2d3c84ecfbda0c9c9956


'FIRST COMMIT' 이후의 커밋들이 전부 사라진 것을 볼 수 있다.

  1. Reset 통해 과거 버전으로 돌아가기
git reset 커밋해시

Reset은 되돌아갈 커밋의 해시를 구했지만, Revert는 취소할 커밋의 해시를 구해야 한다.

EX1)

git revert 3bb0ad51d1aababe79ff37d139ebd31c955d0421

'Add George To Tigers' 커밋에서 수행했던 것들을 전부 반대로 수행한 커밋 하나가 새로 생성된다.
이 커밋에서는, tigers.yaml의 members에 'George'를 추가했다. then, 커밋5에 대해, 이를 반대로 수행한(tigers.yaml의 members에서 'George'를 제거한) 커밋이 새로 1개 생성된다.

EX2)

git revert c57e3e9bdc60678a8cfc74b098b40184010c46a8


커밋5에서 leopards.yaml을 수정한 것, 커밋7에서 leopards.yaml을 삭제하려고 하는 것이 충돌을 일으킨다.

conflict 상황을 해결한 후에, 'git revert --continue' 명령어를 입력한다.
EX2에서는, leopareds.yaml을 삭제하는 것으로 결정하겠다.

git rm leopards.yaml
git revert --continue

참고) Revert할 때 conflict가 발생하는 상황에 대해서,

  • 특정 커밋에서 파일 삭제 -> Revert 커밋에서 파일 추가 [ 문제 없음 ]
  • 특정 커밋에서 파일 추가 -> Revert 커밋에서 파일 삭제 [상황에 따라 다름]
    해당 커밋 ~ Revert 커밋 사이에 파일 변경이 있었다면, [ conflict 발생 ]
    파일 변경이 없었다면, [ 문제 없음 ]
  • 특정 커밋에서 파일 변경 -> Revert 커밋에서 파일 변경 [ 상황에 따라 다름 ]
    예를 들어, 특정 커밋에서 tigers.yaml의 manager를 A->B이라면, Revert 커밋에서는 manager를 B->A한다. 그런데, 그 중간에 있는 커밋이 manager를 C라고 한다면, 이때는 conflict가 발생한다. 만약, 중간에 있는 커밋이 tigers.yaml 파일을 변경하더라도, 이러한 변경이 없었다면, 문제 없다.
  1. 커밋하지 않고 revert하기
git revert --no-commit 커밋해시

revert + 다른 작업도 함께 커밋하고 싶을 때


현재 상황

버전6를 만들어보자. 변경 사항은 다음과 같다.
1. leopards.yaml 삭제
2. .gitignore에 *.config 추가
3. hello.txt 추가(내용: hello)


GUI 통해서 커밋 생성하기

  • 버전으로 만들 준비하기
    해당 파일을 '스테이지에 올라간 파일'에 추가한다.
    ('+', '선택 내용 스테이지에 올리기', '모두 스테이지에 올리기' 버튼 클릭)

  • 버전 만들기(= 커밋 만들기)
    좌측 상단 '커밋' > 커밋 메시지 입력 > 우측 하단 '커밋'


GUI 통해서 과거 버전으로 돌아가기

  1. Revert 통해 과거 버전으로 돌아가기
    해당 커밋 우클릭 > '커밋 되돌리기...' > '예'


커밋3에서 수행한 것(tigers.yaml의 members에 George 추가)을 전부 반대로 수행한(tigers.yaml의 members에서 George 제거) 커밋이 새로 1개 생성되었다.

  1. Reset 통해 과거 버전으로 돌아가기
    해당 커밋 우클릭 > '이 커밋까지 현재 브랜치를 초기화' > '사용 중인 모드'를 'Hard'로 선택 후 '확인'

  2. Revert 시 발생한 Conflict를 해결하기
    커밋2에 대해 Revert한 결과, Conflict가 발생했다.

leopards.yaml 파일을 삭제하는 방향으로 conflict를 해결하려고 한다.

  • 스테이지되지 않은 leopards.yaml 우클릭 > '충돌 해결' > ''저장소'것을 사용하여 해결' > '예'

아래와 같이 leopards.yaml에 '-' 표시가 된 것을 볼 수 있다.

  • 커밋하기

0개의 댓글