우아한 테크코스/테크코스

[Git] commit 조작하기

jamie. 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
| 
|     내용 변경

 

반응형