커밋 변경하기

shinyeongwoon·2022년 12월 21일
0

git

목록 보기
4/4

setup-tutorial down 받기

이전에 작성한 커밋 수정하기

--amend 옵션을 지정하여 커밋을 수행하면, 같은 브랜치 상에서 이전에 커밋했던 내용에 새로운 내용을 추가하거나 설명을 수정할 수 있음

누락된 파일을 새로 추가하거나 기존의 파일을 업데이트 해야할 때
이전 커밋의 설명을 변경하고 싶을 때

setup-turorial/tutorial1 folder로 이동

이력 확인 해 보기

$ git log

sample.txt 파일을 열고 commit 의 설명을 추가
commit : 인덱스의 상태를 기록하기

--amend 옵션을 이용하여 커밋하기

$ git add sample.txt
$ git commit --amend

열려진 편집기에서는 최근에 커밋한 내용이 포함되어 있을것
내용을 "add와 commit의 설명을 추가"로 바꾼후 저장하고 빠져 나온다.
이로써 커밋의 내용이 수정됨
log 명령어에서 이력과 커밋 메세지를 확인

$ git log

이전에 작성한 커밋 지우기

revert 명령어를 이용하면, 특정 커밋의 내용을 삭제할 수 있다.
rebase -i 명령어나 reset 명령어를 통해 커밋을 삭제할 수도 있지만,
해당 커밋이 이미 공개된 상태인 경우에는 이러한 삭제 작업을 함부로 하긴 어렵다.
이러한 경우 revert 명령어를 이용해서 특정 커밋의 내용을 지우는 새로운 커밋(b')을 만들어 보다 안전하게 처리 할 수 있다.

revert 명령어를 사용하여 커밋 B의 내용을 뒤집어 원래의 커밋 A의 상태로 돌아갈 수 있는 새로운 커밋 B'를 만들 수 있음을 알 수 있음

이전에 작성한 커밋을 안전하게 지우고 싶을 때 사용

revert를 사용하여 "pull의 설명을 추가"를 지워보자
stepup-tutorial2 폴더로 이동

$ git log
$ cat sample.txt
$ git revert HEAD

$ git log

커밋을 버리고 특정 버전으로 다시 되돌아가기

reset 명령어를 이용하면 더 이상 필요 없어진 커밋들을 버릴 수 있다.
명령어 실행 시 어떤 모드로 실행할 지 지정하여 'HEAD' 위치와 인덱스, 작업 트리 내용을 함께 되돌릴지 여부를 선택할 수 있다.

모드는 기본적으로 'mixed'가 지정되며
'soft' 와 'hard' 중에서 선택할 수 있다.

soft : HEAD 위치 변경 함 : 인덱스 변경 안 함 : 작업트리 변경 안함
mixed : HEAD 위치 변경 함 : 인덱스 변경함 : 작업트리 변경 안함
hard : HEAD 위치 변경 함 : 인덱스 변경함 : 작업트리 변경함

커밋만 되돌리고 싶을때 (soft)
변경한 인덱스의 상태를 원래대로 되돌리고 싶을때 (mixed)
최근의 커밋을 완전히 버리고 이전의 상태로 되돌리고 싶을 때 (hard)

reset 을 사용하여 'master' 브랜치 앞의 두 개의 커밋을 삭제한다.
다운로드 한 stepup-tutorial/tutorial3 폴더로 이동
이 저장소의 이력은 다음과 같음

$ git log
$ cat sample.txt

reset 을 사용하여 커밋을 삭제한다.

$ git reset --hard HEAD~~
$ cat sample.txt
$ git log

Tip)
reset 전의 커밋은 'ORIG_HEAD'라는 이름으로 참조할 수 있다.
실수로 reset 을 한 경우에는, 'ORIG_HEAD'로 reset 하여 reset 실행 전의 상태로 되돌릴 수 있다.

$ git reset --hard OIG_HEAD

다른 브랜치로부터 특정 커밋을 가져와서 내 브랜치에 넣기

cherry-pick 을 이용하면 다른 브랜치에서 지정한 커밋을 복사하여 현재 브랜치로 가져올 수 있음

특정 브랜치에 잘못 추가한 커밋을 올바른 브랜치로 옮기려고 할 때
다른 브랜치의 커밋을 현재 브랜치에도 추가하고 싶을 때

stepup-tutorial/tutorial4 폴더로 이동
이 저장소의 이력은 다음과 같음

다른 브랜치에서 수행한 "commit의 설명 추가" 커밋 내용을 'master' 브랜치로 가져와 보자

'master' 브랜치로 이동 한 후 , cherry-pick 을 이용하여 "commit의 설명을 추가"한 커밋을 꺼내 'master'에 추가합니다.
(문서 내의 커밋 "99daed2"와, 다운로드한 저장소 내의 커밋은 다를 가능성이 있다. 다운로드한 저장소 내에 'git log'를 실행하여, 적절한 커밋을 확인하고 사용)

$ git checkout master
$ git cherry-pick 99daed2

충돌이 발생. sample.txt 를 열고 충돌 부분을 수정한 후 커밋한다.

$ git add sample.txt
$ git commit

커밋 이력 편집하기

rebase 명령어에 'i' 옵션을 지정하면 커밋을 다시 쓰거나 다른 커밋과 바꿔 넣을 수 있으며 특정 위치의 커밋을 삭제하거나 여러 커밋을 통합하는 작업을 할 수 있다.

push 하기 전에 이전의 커밋 내용을 정리하고자 할 때
그룹으로 묶을 수 있는 커밋들을 알기 쉽게 하나로 통합하려고 할때
이전 커밋에 누락된 파일들을 나중에 추가하고자 할때

rebase -i 으로 커밋 모두 통합하기

stepup-tutorial/tutorial5 폴더로 이동
이 저장소의 이력은 다음과 같다

"commit의 설명을 추가" 한 커밋과 "pull의 설명을 추가"한 커밋을 하나의 커밋으로 통합

$ git rebase -i HEAD~~

텍스트 에디터가 열리고 'HEAD'에서 'HEAD~~'까지의 커밋이 다음과 같이 표시

두번째 줄의 'pick' 문자를 squash로 변경하고 저장/종료 한다.
이로써 두 개의 커밋이 하나의 커밋으로 통합 되었다.
log 명령어를 실행하여 이력을 확인

rebase -i 로 커밋 수정하기

stepup-tutorial6 폴더로 이동
이 저장소의 이력은 다음과 같음

"commit의 설명을 추가" 한 커밋을 수정해 보자

$ git rebase -i HEAD~~

텍스트 에디터가 열리고 'HEAD'에서 'HEAD~~'까지의 커밋이 다음가 같이 표시됨

첫 번째 줄의 'pick' 문자를 'edit'으로 변경하여 저장/종료 한다
그러면 다음과 같은 출력되고 수정할 커밋이 체크아웃 된 상태가 됨

sample.txt를 열어, commit의 설명 부분을 적당히 변경

원숭이도 이해할 수 있는 Git 명령어
add: 변경 사항을 만들어서 인덱스에 등록해보기
commit: 인덱스의 상태를 저장하기
pull: 원격 저장소의 내용을 가져오기

commit --amend 를 실행하여 변경한 내용을 저장

$ git add sample.txt
$ git commit --amend

commit을 실행했다고 해서 rebase 작업이 끝난것은 아니다
이 커밋 작업이 종료했다는 것을 알리면, --continue 옵션을 지정하여 rebase를 실행 해야 한다.

$ git rebase --continue

이제 커밋 수정이 완료 됨

브랜치상의 커밋을 하나로 모아 병합한다

병합할때 사용할 수 있는, 조금 특별한 옵션인 '--squash'
이 옵션을 지정하여 브랜치를 병합하면 해당 브랜치의 커밋 전체를 통합한 커밋이 추가됨

토픽 브랜치 안의 커밋을 한꺼번에 모아서 통합 브랜치에 병합하고자 할 때

merge --squash

stepup-tutorial/tutorial7 folder로 이동
저장소 이력은 다음과 같다

issue1 브랜치의 모든 커밋을 하나의 커밋으로 병합하여 'master' 브랜치로 가져와 보도록 하자

'master' 브랜치로 이동 후 '--squash' 옵션을 지정하여 merge 실행

$ git checkout master
$ git merge --squash issue1

충돌이 발생하므로, sample.txt를 열어 충돌 부분 수정 후 커밋 하기

$ git add sample.txt
$ git commit

이로써 'issue1' 브랜치 상의 모든 커밋을 하나로 병합한 내용이 'master' 브랜치에 추가 되었다.
log 명령어를 실행하여 이력 확인 해보기

$ git log

0개의 댓글