본문 바로가기
Git

Git] Command Line으로 실수를 되돌리는 17가지 방법![1] - restore, revert, reset

by Fastlane 2022. 6. 21.
728x90
반응형

목차

  • 하나의 파일에서 commit하지 않은 local change 버리기
  • 삭제된 하나의 파일 복구
  • 하나의 파일의 수정사항 중 일부분만 버리기
  • local changes 모두 버리기
  • 마지막 commit 문구 수정하기 (원격저장소로 push된 경우 사용하지 않는다!)
  • 중간에 있는 commit 원복하기
  • 최근 커밋을 지우고 과거 커밋으로 돌아가기 (원격저장소로 push된 경우 사용하지 않는다!)
  • 하나의 파일만 과거 커밋버전으로 되돌리기

 

1. 하나의 파일에서 commit하지 않은 local change 버리기 : $ git restore <filename>

$ git status
On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   src/SimpleAPI/Program.cs
$ git diff src/SimpleAPI/Program.cs
diff --git a/src/SimpleAPI/Program.cs b/src/SimpleAPI/Program.cs
index 632a615..8ea822e 100644
--- a/src/SimpleAPI/Program.cs
+++ b/src/SimpleAPI/Program.cs
@@ -23,3 +23,4 @@ app.UseAuthorization();
 app.MapControllers();

 app.Run();
+

$ git restore src/SimpleAPI/Program.cs

$ git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

2. 삭제된 하나의 파일 복구 : $ git restore <filename>

$ git status
On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        deleted:    src/SimpleAPI/Program.cs

no changes added to commit (use "git add" and/or "git commit -a")

$ git restore src/SimpleAPI/Program.cs

$ git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

3. 하나의 파일의 수정사항 중 일부분만 버리기 : $ git restore -p <filename>

4. local changes 모두 버리기 : $ git restore .  (하지만, 다시 돌릴 수 없으니 주의해야함!!)

 

5. 마지막 commit 문구 수정하기 : $ git commit --amend -m "수정된 커밋 문구!"

문구변경 후 log를 살펴보면 commit hash가 변경된 것을 알 수 있다. 내부적으로는 새로운 commit이 생기고, 기존 commit과 교체한다. 

$ git log
commit 721d7883e843e4d925f7db3c02607cfe565412f9 (HEAD -> main)
Author: 
Date:   Tue Jun 21 09:59:20 2022 +0900

    test commmmmmiiiit!

$ git commit --amend -m "test commit!"
[main ad2796a] test commit!
 Date: Tue Jun 21 09:59:20 2022 +0900
 1 file changed, 2 insertions(+)

$ git log
commit ad2796adef3bf4af6a31f210797fdcd37a5834a5 (HEAD -> main)
Author: 
Date:   Tue Jun 21 09:59:20 2022 +0900

    test commit!

6. 중간에 있는 commit 원복하기 : $ git revert <commit hash>

C1과 C3는 유지하되, C2의 수정사항만 원복하려고 한다. Revert는 C2를 잘라내는 것이 아닌, C2수정사항의 반대내용이 포함된 새로운 커밋을 만든다. 

 

96060d5d80fe5f9e7d5df2df1ca83a5d7488d4e0 커밋의 수정사항을 원복해보자. 

$ git log
commit f7a09f9f7bcf288e9a1b4db62ca79a96428d7681 (HEAD -> main)
Date:   Tue Jun 21 10:26:00 2022 +0900

    test commit!

commit 96060d5d80fe5f9e7d5df2df1ca83a5d7488d4e0
Date:   Tue Jun 21 10:15:33 2022 +0900

    주석 수정

96060d5d80fe5f9e7d5df2df1ca83a5d7488d4e0 커밋의 수정사항은 다음과 같다. 

$ git show 96060d5d80fe5f9e7d5df2df1ca83a5d7488d4e0
commit 96060d5d80fe5f9e7d5df2df1ca83a5d7488d4e0
Date:   Tue Jun 21 10:15:33 2022 +0900

    주석 수정

diff --git a/src/SimpleAPI/Program.cs b/src/SimpleAPI/Program.cs
index 632a615..a4c9271 100644
--- a/src/SimpleAPI/Program.cs
+++ b/src/SimpleAPI/Program.cs
@@ -16,9 +16,9 @@ if (app.Environment.IsDevelopment())
     app.UseSwaggerUI();
 }

-//app.UseHttpsRedirection();
+app.UseHttpsRedirection();

-app.UseAuthorization();
+//app.UseAuthorization();

 app.MapControllers();

해당 커밋만 revert 해보자. 

$ git revert 96060d5d80fe5f9e7d5df2df1ca83a5d7488d4e0
Auto-merging src/SimpleAPI/Program.cs
[main 1956ced] Revert "주석 수정"
 1 file changed, 2 insertions(+), 2 deletions(-)

$ git log
commit 1956ced7e1717708ccd4e52a5c00d6afbd99b1be (HEAD -> main)
Date:   Tue Jun 21 10:41:08 2022 +0900

    Revert "주석 수정"

    This reverts commit 96060d5d80fe5f9e7d5df2df1ca83a5d7488d4e0.

commit f7a09f9f7bcf288e9a1b4db62ca79a96428d7681
Date:   Tue Jun 21 10:26:00 2022 +0900

    test commit!

commit 96060d5d80fe5f9e7d5df2df1ca83a5d7488d4e0
Date:   Tue Jun 21 10:15:33 2022 +0900

    주석 수정


$ git show 1956ced7e1717708ccd4e52a5c00d6afbd99b1be
commit 1956ced7e1717708ccd4e52a5c00d6afbd99b1be (HEAD -> main)
Date:   Tue Jun 21 10:41:08 2022 +0900

    Revert "주석 수정"

    This reverts commit 96060d5d80fe5f9e7d5df2df1ca83a5d7488d4e0.

diff --git a/src/SimpleAPI/Program.cs b/src/SimpleAPI/Program.cs
index f94ba6b..a263516 100644
--- a/src/SimpleAPI/Program.cs
+++ b/src/SimpleAPI/Program.cs
@@ -16,9 +16,9 @@ if (app.Environment.IsDevelopment())
     app.UseSwaggerUI();
 }

-app.UseHttpsRedirection();
+//app.UseHttpsRedirection();

-//app.UseAuthorization();
+app.UseAuthorization();

7. 최근 커밋을 지우고 과거 커밋으로 돌아가기 : 

$ git reset --hard <commit hash>

$ git reset --mixed <commit hash>

reset에 여러가지 option이 있다. --hard는 local change를 유지하지 않고 과거 커밋 상태로 돌아간다. 

--mixed는 local change를 유지한 채, 과거 커밋 상태로 돌아간다. 

C3, C4가 원격 저장소에 남아있고, 팀원과 공유하는 브랜치의 커밋 히스토리를 바꾸게 되면 다른 팀원이 PUSH할때 충돌이 생긴다. 따라서 공유하는 브랜치에서 과거 커밋을 수정하고 싶을때는 revert를 사용하자! 

혼자 작업하는 브랜치에서는 reset을 사용해도 된다. 

8. 하나의 파일만 과거 커밋버전으로 되돌리기 : git restore --source <commit hash> <filename>

 

728x90
반응형

댓글