-
[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 | | 내용 변경
반응형'우아한 테크코스 > 테크코스' 카테고리의 다른 글
[IntelliJ] 상수 추출 private으로 설정하기 (1) 2020.03.13 [Git] Remote(원격) Repo 송수신 (0) 2020.03.09 [Git] stash(임시저장) (0) 2020.03.09 [Git] branch(브랜치) (0) 2020.03.09 [Git] 기본 사용법(in Local Repo) (0) 2020.03.09