[Git] git rebase활용해서 이전 commit 내용 수정 / 이전 커밋에 개발 코드 추가하기

2020. 3. 1. 23:25Etc/Git

반응형

이전 커밋 내용에 대해 수정이 필요할 때가 있다.
아래 4가지의 케이스로 나누어 작성해두었으니 케이스에 맞는 해결 방법 찾아가시면 될 것 같다!

  1. 바로 직전 커밋 메세지 수정하고 싶을 때
  2. 바로 직전 커밋에 새로 작성한 코드 추가하기
  3. (바로 직전이 아닌) 이전 특정 코드 수정하기 (message)
  4. (바로 직전이 아닌) 이전 특정 코드 수정하기 (author)

활용 git 명령어

우선, 활용한 명령어들에 대해 간단히 살펴보자.

git log

이전 commit log(이력)를 확인하고자 할 때 사용한다.
명령어를 입력하면 아래와 같이 나의 내역이 뜬다.

git rebase

git rebase는 주로 A 브랜치에서 작업하던 내용을 B 브랜치에 병합 후 이어 작성하고 싶을 때 사용한다.
아래 그림을 참고하면 이해가 쉬울 것이다.

이전이후

하지만 우리는 git rebase -i | -interactive를 사용하여 이전 커밋들을 command를 사용해 수정할 수 있다.
수정 후에는 git rebase --continue를 입력해 커밋 작업의 종료를 알린다.

자세한 내용은 git 공식문서를 확인하세요!

git commit --amend

해당 명령어를 사용해 직전 커밋 내용을 수정할 수 있다.


이전 커밋 수정하기

그럼 위에 설명한 3가지 케이스에 따라 이전 커밋을 수정하는 구체적인 방법을 알려주겠다.

1. 바로 직전 커밋 메세지 수정하고 싶을 때

이미 git add - git commit으로 작성이 끝났는데, 메세지에 오타가 있다거나 급하게 수정해야 할 경우 사용할 수 있다.

 

주의사항이 있는데, 직전 git 명령어가 git commit -m "message"로 커밋을 남긴 경우에만 사용가능하다.
(예를 들어, checkout했다거나 하면 사용할 수 없다.)

$ git commit --amend

그럼 아래처럼 문서 편집기가 켜저서 vi로 수정가능하다.

commit message가 이 곳이 뜹니다.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Sun Mar 1 21:29:37 2020 +0900
#
# On branch javascript
# Changes to be committed:
#       new file:   FileName.js

2. 바로 직전 커밋에 새로 작성한 코드 추가하기

이전 commit 내용과 같은 범위의 코드를 신규 작성하여, 이전 commit에 새로 작성한 코드를 사용하고 싶을 경우 유용하다.
예를 들어 급하게 추가 수정한 코드 한 두줄 같은 것...?

 

1번과 방법 및 조건은 동일하다. 대신 신규 코드를 추가해야 하니 git add를 추가하면 된다.

$ git add .
$ git commit --amend

그럼 위의 편집기가 똑같이 뜰거다. 내용을 수정해야하면 수정하고, 필요 없으면 그냥 :wq눌러서 나오면 된다.

3. (바로 직전이 아닌) 이전 특정 코드 수정하기 (message)

계속 개발은 하고 있었는데 git log로 우연히 이전 커밋의 오타를 발견했거나 메세지 수정을 원할 때 유용하다.

1) git log로 수정하고자 하는 커밋 정보 확인

$ git log

수정하고자 하는 커밋의 특정 commit 정보를 알아내기 위해 log를 확인하자. 여러개도 수정 가능하다.
그리고 수정하고자 하는 커밋의 직전 commit ID 정보를 복사해두자.

 

예를 들어, 위의 로그에서 '완주하지 못한 선수 해결','[2020카카오공채] 문자열 압축 js 해결'의 커밋 내용을 수정하고 싶다면

master가 가르키고 있는 커밋의 정보를 복사해놓으면 된다.

2) git rebase -i로 커밋 수정 작업 실시

git rebase -i [Commit ID]

위 명령어를 입력하면 Commit ID 이후부터 HEAD(현재)까지의 커밋 내역이 표시된다.
(저는 1)에서 master가 가르키는 Commit의 ID를 입력하였습니다.)

 

그럼 아래와 같은 편집기가 뜹니다! 우리는 여러 commands 중 edit을 사용할 예정!
원하는 커밋의 pickedit으로 수정한다.

edit 1df56d1 [2020카카오공채] 문자열 압축 js  해결
edit 9039a31 완주하지 못한 선수 해결
pick 9dc8324 K번째 수 - merge sort 해결 - quick sort (몇 개 시간초과 뜸) - 내장 sort 사용해서 해결

# Rebase 3845985..9dc8324 onto 3845985 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

:wq를 눌러 저장하고 나오면 아래처럼 수정할 커밋이 체크아웃된 상태가 된다.

3) git commit --amend를 사용해 커밋 내용 변경

이제 이 상태에서 아래 명령어를 치면 2)에서 edit으로 변경한 커밋들의 내용을 하나씩 수정할 수 있다.

$ git commit --amend
  • 아래처럼 하나의 commit만 수정할 수 있습니다! 반드시 위에 지정해둔 개수만큼 위의 명령어를 쳐서 각각 편집해주세요.

4) 커밋 작업 종료 알리기

아래 명령어를 입력해 종료를 알리면 끝!

$ git rebase --continue
  • 만약, 아래 사진과 같은 텍스트가 뜬다면, 위의 명령어를 한번 더 쳐서 완벽히 종료해주세요.

4. (바로 직전이 아닌) 이전 특정 코드 수정하기 (author)

뒤늦게 author가 잘못 작성된걸 알았을 경우 유용하다. (저처럼...)

 

나의 경우는 노트북 초기화 이후 git global config정보를 작성한 걸 잊고 커밋을 해놔서
이전 커밋의 author 정보를 수정하는 예시이다.

 

위의 3.과 똑같은 방법으로 메세지를 수정해주면 된다.
우선 3.의 2)git rebase -i로 커밋 수정 작업 실시 내용까지 똑같이 실시!

git commit --amend --author로 정보 수정

위의 3. 3)내용에 작성되어 있는 author 내용을 암만 수정해도 수정되지 않는다.
author는 아래와 같은 옵션 명령어로 수정해야 한다.

$ git commit --amend --author="AuthorName <email@address.com>"

그럼 똑같이 편집기가 뜰텐데, author의 정보가 달라진걸 확인할 수 있다!

  • 해당 작업도 수정하고자 했던 커밋 각각에 대한 명령을 내려야 합니다.

    (명령어 한번을 내리면 한 커밋에 내한 내용이 변경되고 다음 edit을 지정했던 커밋으로 자동 체크아웃 됨)

그 후 똑같이 아래 명령어로 커밋 작업 종료 알리면 성공!

$ git rebase --continue

최종 결과

사실 마지막 케이스 4에 해당되어서 해결하고, 알던 내용 추가해서 블로그 글을 정리하던 차라
log의 전,후 차이는 author밖에 없긴 하다.....

여튼 성격이 급한 편이라 은근 자주 사용하고 찾게되는 내용이라 한번 정리해보았다.
다들 도움이 되셨으면 좋겠습니다...!😄😘

반응형