테크매니아
Git commit을 수정하는 3가지 방법 본문
1. amend : commit을 수정
commit을 수정 할 수 있다.
dkdk@DESKTOP-HLOMORS:~/git/GitSampleProject (main) $ ls
README.md test.py
dkdk@DESKTOP-HLOMORS:~/git/GitSampleProject (main) $ git log
commit 992b7c9209ddb451e84d9212c01169dff1e48aaa (HEAD -> main)
Author: dankernel <dkdkernel@gmail.com>
Date: Fri Mar 4 00:58:17 2022 +0900
add test.py
commit 38e96219afacb708d817e111c85b799e5aee0e42
Author: dankernel <dkdkernel@gmail.com>
Date: Fri Mar 4 00:52:52 2022 +0900
First commit
예시의 경우 README.md와 test.py가 있는 상태에서 이미 commit을 해버렸고
추가로 run.py 파일을 추가 해야 하는 상황에서 git commit --amend
을 쓰면 된다.
dkdk@DESKTOP-HLOMORS:~/git/GitSampleProject (main) $ git commit --amend
[main 3b56000] add test.py run.py
Date: Fri Mar 4 00:58:17 2022 +0900
2 files changed, 7 insertions(+)
create mode 100644 run.py
create mode 100644 test.py
commit id가 바뀌고 내용도 바뀐다. 그래서 remote에 이미 push 해 버렸다면 -f 옵션을 줘서 강제로 업데이트 해야 한다. 다른 사용자가 있을 때 혼란을 줄 수 있으니 remote에 이미 push 한 경우 지양해야 겠다.
dkdk@DESKTOP-HLOMORS:~/git/GitSampleProject (main) $ git log
commit 3b5600080c98ee1f8ff6c9e6f675d5cd00252980 (HEAD -> main)
Author: dankernel <dkdkernel@gmail.com>
Date: Fri Mar 4 00:58:17 2022 +0900
add test.py run.py
commit 38e96219afacb708d817e111c85b799e5aee0e42
Author: dankernel <dkdkernel@gmail.com>
Date: Fri Mar 4 00:52:52 2022 +0900
First commit
2. git checkout
아래 3개의 commit이 있는 상황에서 HEAD는 최신 0765d
에 있고, 3b560
으로 가고 싶을 때git checkout <commit id>
를 쓰면 해당 commit으로 이동할 수 있다.
dkdk@DESKTOP-HLOMORS:~/git/GitSampleProject (main) $ git log
commit 0765d7e4b6c80a675094420ae232de57a0934b33 (HEAD -> main)
Author: dankernel <dkdkernel@gmail.com>
Date: Fri Mar 4 01:05:56 2022 +0900
Update README.md
commit 3b5600080c98ee1f8ff6c9e6f675d5cd00252980
Author: dankernel <dkdkernel@gmail.com>
Date: Fri Mar 4 00:58:17 2022 +0900
add test.py run.py
commit 38e96219afacb708d817e111c85b799e5aee0e42
Author: dankernel <dkdkernel@gmail.com>
Date: Fri Mar 4 00:52:52 2022 +0900
First commit
특정 파일만 해당 commit의 상태로 바꾸려면 git checkout <commit id>--<file path>
하면 된다.
해당 commit에서 특정 파일이 없으면 없어지고, 있으면 생기고, 바뀌면 바뀐게 적용 된다.
아래와 예제와 같이 실행할 수 있다.
(main) $ git checkout 3b560--README.md
–soft, –mixed, –hard
soft는 HEAD만, mixed는 index까지, hard는 working 디렉토리까지 바꾼다.
reset
* commit cea2b0ae87b71fd1f509ae3818ac76f9bca65f79 (main)
| Author: dankernel <dkdkernel@gmail.com>
| Date: Fri Mar 4 01:18:35 2022 +0900
|
| Update README logger
|
| * commit 74a0d1f59e01a01b646d625f6598c34024834e20 (HEAD -> feature-01)
| | Author: dankernel <dkdkernel@gmail.com>
| | Date: Fri Mar 4 01:17:15 2022 +0900
| |
| | Add error log
| |
| * commit cd819b5513f7c724bb36fa28164b7c833f1cbc15
|/ Author: dankernel <dkdkernel@gmail.com>
| Date: Fri Mar 4 01:16:40 2022 +0900
|
| logger.py
|
* commit 0765d7e4b6c80a675094420ae232de57a0934b33
| Author: dankernel <dkdkernel@gmail.com>
| Date: Fri Mar 4 01:05:56 2022 +0900
|
| Update README.md
|
* commit 3b5600080c98ee1f8ff6c9e6f675d5cd00252980
| Author: dankernel <dkdkernel@gmail.com>
| Date: Fri Mar 4 00:58:17 2022 +0900
|
main 브랜치와 feature-01 브랜치로 나눠진 상황에서 checkout과 reset을 비교 해 보려고 한다.
git checkout main
checkout으로 main 브랜치로 옳기면 아래와 같이 (당연히 feature-01 브랜치는 그대로 있고) HEAD만 main으로 이동 한다.
(main) $ git log --branches --graph
* commit cea2b0ae87b71fd1f509ae3818ac76f9bca65f79 (HEAD -> main)
| Author: dankernel <dkdkernel@gmail.com>
| Date: Fri Mar 4 01:18:35 2022 +0900
|
| Update README logger
|
| * commit 74a0d1f59e01a01b646d625f6598c34024834e20 (feature-01)
| | Author: dankernel <dkdkernel@gmail.com>
| | Date: Fri Mar 4 01:17:15 2022 +0900
| |
| | Add error log
| |
| * commit cd819b5513f7c724bb36fa28164b7c833f1cbc15
|/ Author: dankernel <dkdkernel@gmail.com>
| Date: Fri Mar 4 01:16:40 2022 +0900
|
| logger.py
|
* commit 0765d7e4b6c80a675094420ae232de57a0934b33
| Author: dankernel <dkdkernel@gmail.com>
| Date: Fri Mar 4 01:05:56 2022 +0900
|
| Update README.md
|
* commit 3b5600080c98ee1f8ff6c9e6f675d5cd00252980
| Author: dankernel <dkdkernel@gmail.com>
| Date: Fri Mar 4 00:58:17 2022 +0900
|
근데 이렇게 안하고, git reset main
을 해버리면 아래와 같이 main 브랜치와 feature-01브랜치가 같은 commit을 향하게 된다.
(feature-01) $ git log --branches --graph
* commit cea2b0ae87b71fd1f509ae3818ac76f9bca65f79 (HEAD -> feature-01, main)
| Author: dankernel <dkdkernel@gmail.com>
| Date: Fri Mar 4 01:18:35 2022 +0900
|
| Update README logger
|
* commit 0765d7e4b6c80a675094420ae232de57a0934b33
| Author: dankernel <dkdkernel@gmail.com>
| Date: Fri Mar 4 01:05:56 2022 +0900
|
| Update README.md
|
* commit 3b5600080c98ee1f8ff6c9e6f675d5cd00252980
| Author: dankernel <dkdkernel@gmail.com>
| Date: Fri Mar 4 00:58:17 2022 +0900
|
| add test.py run.py
|
* commit 38e96219afacb708d817e111c85b799e5aee0e42
Author: dankernel <dkdkernel@gmail.com>
Date: Fri Mar 4 00:52:52 2022 +0900
First
## git reset을 되돌리는 방법
git reset을 하면 HEAD도 옮겨지고 브랜치도 옮겨져 버리는데 이걸 되돌리는 방법은 다음과 같다.
git reflog
로 기록을 보고 git reset --hard
로 복구 할 수 있다.
(feature-01) $ git reflog
cea2b0a (HEAD -> feature-01, main) HEAD@{0}: reset: moving to main
74a0d1f HEAD@{1}: checkout: moving from main to feature-01
cea2b0a (HEAD -> feature-01, main) HEAD@{2}: checkout: moving from feature-01 to main
74a0d1f HEAD@{3}: checkout: moving from main to feature-01
cea2b0a (HEAD -> feature-01, main) HEAD@{4}: commit: Update README logger
0765d7e HEAD@{5}: checkout: moving from feature-01 to main
74a0d1f HEAD@{6}: commit: Add error log
cd819b5 HEAD@{7}: commit: logger.py
(feature-01) $ git reset --hard HEAD@{1}
HEAD is now at 74a0d1f Add error log
revert
잘못된 commit을 고쳤다는 내용의 새로운 commit을 만들 수 있다.