ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Git] commit 조작하기
    우아한 테크코스/테크코스 2020. 3. 9. 16:22
    반응형

    git reset: 복원

     과거 상태로 보관하여, 토픽 브랜치를 만들기도 함(그만큼 유연하기도 하다는 것)

    git reset --hard : 레파지토리의 HEAD & Stage & working tree를 지정한 상태까지 복원

     복원하고 싶은 commit hash값 이용

     복원한 후 브랜치 분기 하나 더 해주기(테스트)

    $ git reset --hard 3cb0815dff87c72281e8b07bb41f45d0aa001fa9
    $ git checkout -b feature/jamie2
    Switched to a new branch 'feature/jamie2'
    $ git checkout -

    git reflog : 레파지토리에서 수행된 모든 commit 로그 확인 (이후 시점 포함)

     git log : 현재 브랜치의 로그만 확인 / git reflog : 현재 레파지토리에서 수행된 모든 commit 로그 확인

     commit / checkout / reset / merge 등의 Git 명령어를 실행한 변경 로그가 나타남

     Git의 GC(Garbage Collection)가 실행되어 이전의 상태를 제거하지 않았다면, 로그에 나와있는 변경 내역을 오갈 수도 있음

    $ git reflog
    3cb0815 (HEAD -> master, feature/jamie2) HEAD@{0}: checkout: moving from feature/jamie2 to master
    3cb0815 (HEAD -> master, feature/jamie2) HEAD@{1}: checkout: moving from master to feature/jamie2
    3cb0815 (HEAD -> master, feature/jamie2) HEAD@{2}: reset: moving to 3cb0815dff87c72281e8b07bb41f45d0aa001fa9
    a762510 HEAD@{3}: merge feature/jamie: Merge made by the 'recursive' strategy.
    3cb0815 (HEAD -> master, feature/jamie2) HEAD@{4}: checkout: moving from feature/jamie to master
    28f398e HEAD@{5}: commit: 한 줄 추가함
    3cb0815 (HEAD -> master, feature/jamie2) HEAD@{6}: checkout: moving from master to feature/jamie
    3cb0815 (HEAD -> master, feature/jamie2) HEAD@{7}: checkout: moving from feature/jamie to master
    3cb0815 (HEAD -> master, feature/jamie2) HEAD@{8}: checkout: moving from master to feature/jamie
    3cb0815 (HEAD -> master, feature/jamie2) HEAD@{9}: checkout: moving from feature/jamie to master
    3cb0815 (HEAD -> master, feature/jamie2) HEAD@{10}: checkout: moving from master to feature/jamie
    3cb0815 (HEAD -> master, feature/jamie2) HEAD@{11}: commit: 첫 번째 요약줄 - Readme2 추가
    610b929 HEAD@{12}: commit (initial): [Add] Readme
    

    충돌 문제 해결하기

    reflog를 통해 확인한 해시값을 이용해 commit 복원 : 시점 merge

    $ git reset --hard a762510
    HEAD is now at a762510 Merge branch 'feature/jamie'
    

    feature/jamie2에서 README 수정 후 머지하기

     충돌 발생 - README.md

    $ git checkout feature/jamie2
    Switched to branch 'feature/jamie2'
    $ echo "Feature/jamie2" > README.md
    $ git add README.md
    $ git commit -m "jamie2"
    $ git checkout master
    $ git merge --no-ff feature/jamie2
    Auto-merging README.md
    CONFLICT (content): Merge conflict in README.md
    Automatic merge failed; fix conflicts and then commit the result.

    README.md 파일 확인 및 수정

     확인 후 원하는 방향으로 직접 수정하기

     HEAD : 현재 브랜치 최신본 / feature/jamie2 : 병합하려는 브랜치 내용

    $ cat README.md 
    <<<<<<< HEAD
    \n와아아
    =======
    Feature/jamie2
    >>>>>>> feature/jamie2
    
    // 수정
    $ cat README.md
    \n와아아
    Feature/jamie2

    add & commit

     충돌 문제를 해결했으므로 add & commit

     git commit -am으로 한 번에도 가능

    $ git add README.md 
    $ git commit -m "[Fix] conflict"
    [master c64eca2] [Fix] conflict
    
    $ git commit -am "[Fix] conflict"

    git commit --amend : commit 메시지 수정

     바로 직전의 커밋 메시지를 수정할 수 있음

    /* 여러 줄 */
    $ git commit --amend
    [master 0dbb0ed] [Fix] conflict
     Date: Mon Mar 9 16:01:55 2020 +0900
    $ git log
    commit 0dbb0ed759714a207225c7ee98c674a0d60c71cf (HEAD -> master)
    Merge: a762510 3165eb5
    Author: jamie <jamie@example.com>
    Date:   Mon Mar 9 16:01:55 2020 +0900
    
        [Fix] conflict
        
        변경 성공!
    
    /* 한 줄 */
    $ git commit --amend -m "[Fix] conflict ^^"
    [master a10ab94] [Fix] conflict ^^
     Date: Mon Mar 9 16:01:55 2020 +0900
    $ git log
    commit a10ab944eb4868eafcdf3c0e4d7e3753b0e5d367 (HEAD -> master)
    Merge: a762510 3165eb5
    Author: jamie9504 <jamie9504@kakao.com>
    Date:   Mon Mar 9 16:01:55 2020 +0900
    
        [Fix] conflict ^^
    

    git rebase -i : 변경 내역 조작(묶기/합치기)

    작업 - README.md에 내용 추가하기

    $ git checkout -b feature/jamie3
    Switched to a new branch 'feature/jamie3'
    $ echo "# Jamei" > README.md 
    $ git commit -am "내용 변경"
    [feature/jamie3 0a33ccb] 내용 변경
     1 file changed, 1 insertion(+), 2 deletions(-)
     $ cat README.md 
    # Jamei
    

    작업 - README.md에 오타 정정하기

    $ echo "# Jamie" > README.md
    $ git commit -am "오타 수정"
    [feature/jamie3 c3870d3] 오타 수정
     1 file changed, 1 insertion(+), 1 deletion(-)

    변경 내역 조작하기

     HEAD~2 : 현재 브랜치의 HEAD(최신 commit)를 포함한 두 개의 변경 내역

    $ git rebase -i HEAD~2
    pick 0a33ccb 내용 변경
    pick c3870d3 오타 수정
    
    # Rebase a10ab94..c3870d3 onto a10ab94 (2 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

     

     pick을 fixup으로 변경 후 저장 - 오타 수정 커밋을 내용 변경 커밋에 합치기 위하여, 아래 두 개가 하나가 됨

    pick 0a33ccb 내용 변경
    fixup c3870d3 오타 수정

     결과 확인 - 내용 변경에 합쳐짐

    $ git log --graph
    * commit b62ab5301001c34c09f28ec8427e671797d56530 (HEAD -> feature/jamie3)
    | Author: jamie <jamie@kakao.com>
    | Date:   Mon Mar 9 16:15:17 2020 +0900
    | 
    |     내용 변경

     

    반응형

    댓글

Designed by Tistory.