초보 개발자

Git commit 되돌리기 amend, revert, reset 본문

AI 웹개발 트랙 - 내배캠/5주차

Git commit 되돌리기 amend, revert, reset

taehyeki 2022. 1. 11. 11:48

대부분의 되돌리기 작업을 하면 협업하는 다른 사람에게도 영향을 미칠 수 있다. 기본적으로 나만 작업하는 특정branch 하나에만 적용한다라고 생각하자.

 

amend

작업하다가 commit 메시지에 오타가 났다거나 수정하고싶을 때가 있을 것이다. 이 때 최신의 commit을 수정하는 것을

amend라고 한다. amend로는 가장 최신의 commit만 고칠 수 있다는 것을 꼭 기억해두자. 그 전의 commit은 못고침

먼저 브랜치를 하나 만들어주고 파일을 2개 수정해보자.

그런 뒤 2개가 아닌 하나만 커밋을 해버렸다. 그럼 소스트리에서는 아래와 같을 것이다.

이를 수정해주기 위하여 소스트리의 파일상태로 가서 커밋을 정정해주자.

커밋 메시지도 변경할 수 있다. 변경후 history를 보면 아래와 같이 잘 수정이 되었음을 확인할 수 있다.

이번엔 푸쉬까지 했을 때 어멘드 하는 경우를 생각해보자.

꼭 나만 사용하는 branch에서만 작업을해주자 그렇지 않으면 다른 사람의 commit history가 엉망이 될 수도 있다.

다른 사람이 작업하던 공간에서는 존재하는 commit이 원격 repo에는 없어져서 보인다. 다른 사람의 작업내역까지 꼬이게할 수 있다. 

 

push후에도 push한 commit을 되돌릴 수 있다. 강제로 commit을 덮어 씌우는 것과 같다.

force push라고도 한다. 이건 설정에서 강제푸쉬 허용으로 옵션을 바꿔주어야한다.

 

방금 커밋한 2개의 파일을 푸쉬해보자

일단 먼저 메시지 수정만 해보자. 지금 2개의 파일은 원격repo로 푸쉬된 상태이다.

다시 파일상태에 가서 커밋옵션 -> 마지막커밋 수정을 눌러주자 로컬의 브랜치에는 커밋이 수정이 된 상태이지만

아직 원격의 브랜치에는 수정이 반영이 되지 않은 상태이다.

.

푸쉬를 통해서 맞춰주도록 하자. 강제푸쉬를 눌러주어야 한다.

이러한 경고문구가 뜬다. 다른 사람에게 영향을 미칠 수 있기 때문이다. 따라서 영향을 안미치는 나의 개인적인 공간에만 해야한다. 예를 눌러주자

아래와 같이 잘 푸쉬된 커밋까지 수정이 반영된 것을 알 수 있다.

revert

앞서 배운 amend로는 가장 최신의 commit만을 되돌릴 수 있었다. 그리고 어떤 걸 되돌렸는지도 알 수 없다.

다른 사람들과 같이 협업하고 있다면 어떤 내용이 되돌려졌는지 기록으로 남기는 것도 중요하다. 어떤 내용을 되돌렸는지 새로운 commit을 남기는 것을 revert라고 한다. 최신 commit뿐만 아니라 이전에 했던 commit도 revert로 되돌릴 수 있다.

 

좀 전에 amend한 커밋을 가지고 사용해보겠다. 소스트리의 history에서 커밋을 누르고 커밋 되돌리기를 눌러준다.

아래와 같은 문구가 뜰 것이고 예를 눌러준다.

그럼 맨 위에 Revert 'amend테스트 메시지 수정'이라는 것이 생긴다. 그 밑의 커밋을 보면 amend 테스트라는 것이 적혀있는데

Revert 'amend테스트 메시지 수정'을 보면 커밋의 작업 전으로 되돌린 것을 확인할 수가 있다.

이걸 푸쉬 한 뒤 반영해주자.

 

reset

reset은 commit했던 작업내역을 말 그대로 리셋시키는 것이다. 과거로 돌아가서 새삶을 사는 것처럼 reset이후에 작업내역은 없어진 commit 기록과 관계가 없다. revert는 전의 했던 내역을 전으로 돌려주면서 기록이 존재하지만, reset은 타임머신을 타고 commit전으로 돌아간다고 생각하면 된다. ( 기록은 다 날아가버림 )

 

reset에는 3가지 종류가 있다.

revert는 사실 저 Merge branch 'main' ~~ 커밋으로 돌아간 것이나 다름없다. 왜냐하면 amend테스트 메시지 수정은 

Merge branch ~~커밋을 수정한 내용인데 그걸 되돌린 것이니까 다시 Merge branch의 상태로 돌아갔다.

 

로컬 repo에 2개의 커밋을 해주었다, 2개의 파일을 수정한 뒤에 한번에 커밋하지 않고 나누어 jeon을 먼저 커밋해주고 그리고 rice를 커밋해주었다. history를 보면 아래와 같다.

 

여기서 reset테스트 -jeon커밋-으로 reset해보려고한다. 그럼 어떻게 될까?? reset테스트-jeon커밋-을 한 뒤의 상황으로 돌아갈 것이다. 즉 reset테스트 -jeon커밋-의 시점으로 돌아간다.

 

초기화라는 것을 눌러주면된다. 커밋 되돌리기를 눌르면 revert가 되어버린다. 누르기 전에 확인해보면 현재는

2개의 커밋을 한 상황이다. jeon, rice커밋 

 

Mixed라는 옵션을 주어서 먼저 해보겠다. 확인을 눌러보자

rice커밋은 사라지고 아직 변경된 rice는 commit되지 않은 상태이다(변경 사항이 적용이 됨). 그리고 Mixed라는걸 사용했기 때문에 작업 내역(fried-rice.txt)은 날리지 않았다.

 

다시 커밋을 해보고 이번엔 hard옵션을 주겠다.

다시 jeon커밋으로 reset해보겠다. hard로 바꿔준 뒤 확인을 눌러보자

reset이 된 걸 확인할 수 있는데, 이건 우리가 아까 rice.txt파일을 수정해놓았던 것 조차 사라진 것을 확인할 수있다.

reset기준 이후로 모~든 것이 사라진다. 만약 내가 100개의 파일을 수정을 해놓고 -jeon커밋-에 20개의 파일만 커밋을 하고 그 다음 80개의 파일을 커밋한 뒤, 몇일이 지나서 수정을하려고 reset테스트 시점으로 돌아가는 상황이라면 이 때 Mixed를 사용하면 수정한 80개의 파일은 커밋되지 않은 상태로 남아있고 hard를 사용하면 수정한 80개의 파일의 수정내역 역시 삭제되어 수정 전의 파일인 상태로 돌아가게 된다. 따라서 hard모드는 잘 사용하지 않는 것이 좋다. 

원격으로 푸시할 때 역시 강제푸시를 사용해주어야한다. 전에 푸시한 내용을 덮어쓰어야하기 때문, 일반 푸시하면 오류남, 

만약 reset을사용하여 다른 파일들을 수정,커밋 후 강제푸쉬하면 원격 repo에서 reset이후 커밋 내역은 삭제 된 뒤 방금 커밋한 새로운 커밋 내역으로 바뀐다.

 

 

'AI 웹개발 트랙 - 내배캠 > 5주차' 카테고리의 다른 글

파이썬 힙 heap 간단 구현 !!!  (1) 2022.01.11
Git stash  (0) 2022.01.11
Git fork  (0) 2022.01.11
Git PR(pull request)  (0) 2022.01.10
Git 원격 repo와 branch  (0) 2022.01.10