Git: 특정 commit 으로 이동 후, amend 하기


Git 으로 local branch 를 생성 한 후, 특정 source 를 수정함에 있어 여러개의 commit 이 만들어 질 수 있다.

이 때, 기존에 했던 commit 에 추가적인 수정을 하려면 git add/commit --amend 를 하면 되는데 최상위에 있는

commit 은 바로 수정 후, git add/git commit --amend 하면 적용이 되지만 현재 수정하려는 내용이 이전에 있던 commit 에 반영되었으면 하는 경우가 발생한다.


예를 들어, 아래와 같이 commit 들이 있다고 가정하자.

commit ec88cc08f5a29f98a3c5f14ca642f235fb1c0fb8

Author: Daeseok Youn <daeseok.youn@gmail.com>

Date:   Fri Feb 28 15:34:22 2014 +0900


    staging: cxt1e1: fix checkpatch errors with open brace '{'


    clean up checkpatch.pl error:

     ERROR: that open brace { should be on the previous line


    Signed-off-by: Daeseok Youn <daeseok.youn@gmail.com>


commit 6007a41fffd430b79775871a2c9eb6c35eb3e6a6

Author: Daeseok Youn <daeseok.youn@gmail.com>

Date:   Fri Feb 28 15:27:51 2014 +0900


    staging: cxt1e1: fix checkpatch error 'assignment in if condition'


    checkpatch.pl error:

     ERROR: do not use assignment in if condition


    Signed-off-by: Daeseok Youn <daeseok.youn@gmail.com>


commit aa877600a98048d056b65d0c9e7426616e9ccc2f

Author: Daeseok Youn <daeseok.youn@gmail.com>

Date:   Fri Feb 28 15:22:13 2014 +0900


    Staging: cxt1e1: Fix line length over 80 characters in hwprobe.c


    clean up checkpatch.pl warnings:

     WARNING: Line length over 80 characters


    Signed-off-by: Daeseok Youn <daeseok.youn@gmail.com>


commit 2f61d921981a45c687e5dc26d6f7e6a3925ca0e5

Author: Daeseok Youn <daeseok.youn@gmail.com>

Date:   Fri Feb 28 15:14:39 2014 +0900


    staging: cxt1e1: Fix no spaces at the start of a line in hwprobe.c


    clean up checkpatch.pl warnings:

    WARNING: please no spaces at the start of a line in


    Signed-off-by: Daeseok Youn <daeseok.youn@gmail.com>


이 때, 추가적인 수정사항이 발생 되었는데, 이 내용이 맨 아래에 있는 "staging: cxt1e1: Fix no spaces at the start of a line in hwprobe.c" 에 적용되었으면 하는 바램이 생겼다.


그렇다면, 일단 그 commit 을 수정할 수 있는 mode(?) 로 가야한다.

$ git rebase --interactive 2f61d921981a45c687e5dc26d6f7e6a3925ca0e5^

라고 한다. 맨 마지막에 "^" 를 넣어줘야 그 commit 을 포함하여 rebase  를 진행한다.


위에서 처럼 입력하면, 나의 경우는 vim 이 열리면서 아래와 같은 내용이 입력된다.

pick 2f61d92 staging: cxt1e1: Fix no spaces at the start of a line in hwprobe.c

pick aa87760 Staging: cxt1e1: Fix line length over 80 characters in hwprobe.c

pick 6007a41 staging: cxt1e1: fix checkpatch error 'assignment in if condition'

pick ec88cc0 staging: cxt1e1: fix checkpatch errors with open brace '{'


# Rebase b9ea35b..ec88cc0 onto b9ea35b

#

# Commands:

#  p, pick = use commit

#  r, reword = use commit, but edit the commit message

#  e, edit = use commit, but stop for amending

#  s, squash = use commit, but meld into previous commit

#  f, fixup = like "squash", but discard this commit's log message

#  x, exec = run command (the rest of the line) using shell

#

# If you remove a line here THAT COMMIT WILL BE LOST.

# However, if you remove everything, the rebase will be aborted.

#


여기서 내가 수정하고 싶은 것은 맨 위에 있는 commit 이다. "pick" 을 "edit" 로 변경하고 저장 하고 나와 git log를 하면

최상위에 그 commit 이 올라와 있다. 


이제 원하던 수정을 하자.


수정이 완료되면,

$ git add <file>

$ git commit --amend


이렇게 하면 일단 현재 원하던 commit 에 추가 반영이 된다.


이제 원래 갖고 있던 commit 들을 복구 해야 한다.

$ git rebase --continue


이렇게 하면 수정한 commit 이 후에 생성된 commit 들을 merge 하기 시작한다. 하나씩 merge 를 하다가 conflict 날 수 있다.

그러면 rebase 가 중지 되고, conflict 를 해결 한 후에 다시 git rebase --continue 를 입력하라고 한다.


이렇게 해서 마지막으로

Successfully rebased and updated ref/heads/<local branch name>

이라고 나오면 성공한 것이다.



'Development Tip' 카테고리의 다른 글

VIM 에서 spelling 확인하기  (0) 2016.07.08
Git add -p 로 수정사항 분리하기  (0) 2014.04.16
const char* vs. char const*  (0) 2014.02.19
Fish shell environment  (0) 2013.12.03
Kernel mailing list 활용 방법  (0) 2013.11.08

+ Recent posts