Git

[Git] 과거 커밋의 내용 수정 후 새로운 커밋 생성

순코딩 2024. 7. 23. 09:14
질문

git에 대해 질문할게.

git revert가 해당 커밋의 변경내용을 삭제 후 새로운 커밋을 만드는 과정으로 이해했어 맞지?

그렇다면 main 브랜치에 커밋 a,b,c,d가 있고(시간순) 현재 head가 d에 위치한 상태에서 커밋 b로 돌아가 어떠한 내용을 추가 후 해당 버전을 e로 커밋하고 싶다면 아래 방법 중 어느것을 선택해야해?

추가로 왜 해당 방법을 선택해야 하고 두 방법의 차이점이 무엇인지 설명해줘.

1. git revert d, c => 내용 추가 => e 커밋

2. git checkout b => 내용 추가 => e 커밋

답변(GPT-3.5o)

두 방법의 차이점과 각각의 장단점을 이해하면 어떤 방법을 선택할지 결정할 수 있습니다.

방법 1: 커밋 d와 c를 revert > 내용 추가 > 커밋 e 생성
1. 커밋 되돌리기

`git revert d`와 `git revert c` 명령어를 사용하여 `d`와 `c` 커밋의 변경 내용을 되돌리는 새로운 커밋을 만듭니다.

이 과정은 `d`와 `c`의 변경 사항을 "역으로 적용"하여 작업 트리에 반영합니다.

이 때, 각각의 `revert`는 새로운 커밋을 생성합니다.

    git revert d
    git revert c

 

2. 내용 추가

b 커밋의 상태로 돌아간 후 추가하고 싶은 내용을 작업 트리에 반영합니다.

 

3. 새로운 커밋 생성

변경된 내용을 새로운 커밋 'e'로 커밋합니다.

    git add .
    git commit -m "커밋 e"

 

방법 2 : git checkout b > 내용 추가 > 커밋 e 생성
1. 브랜치 체크아웃

`git checkout b` 명령어를 사용하여 `b` 커밋으로 체크아웃합니다.

이 경우, 현재 `HEAD`는 `b` 커밋을 가리키게 됩니다.

git checkout b

 

2. 내용 추가

`b` 커밋의 상태로 돌아간 후 추가하고 싶은 내용을 작업 트리에 반영합니다.

 

3. 새로운 브랜치 생성

새로운 브랜치를 생성하여 작업을 이어나갑니다.

    git checkout -b new-branch

 

4. 새로운 커밋 생성

변경된 내용을 새로운 커밋 `e`로 커밋합니다.

    git add .
    git commit -m "추가 내용과 함께 e 커밋"

 

차이점과 선택 이유

 

방법 1: `git revert`
역사 보존 :

`git revert`는 기존의 커밋 기록을 보존하면서 커밋 `d`와 `c`의 변경 사항을 되돌립니다.

`revert`는 새로운 커밋을 생성하기 때문에, 변경 이력이 명확하게 남습니다.

 

브랜치 이동 없음

현재 브랜치(예: `main`)에서 계속 작업할 수 있습니다.

 

충돌 가능성

되돌리는 과정에서 충돌이 발생할 수 있습니다.

 

방법 2: `git checkout`
새로운 브랜치

`git checkout b`로 `b` 커밋의 상태로 돌아가면 새로운 브랜치에서 작업을 이어나가야 합니다. `main` 브랜치는 그대로 유지됩니다.

 

간결한 역사

`b` 커밋을 기반으로 새로운 작업을 이어가므로, 기존 커밋 기록을 변경하지 않고 간결한 히스토리를 유지할 수 있습니다.

 

주의사항

이 방법은 기존 브랜치의 히스토리를 변경하지 않지만, `main` 브랜치와의 통합을 염두에 두어야 합니다.

어떤 방법을 선택해야 할까?
히스토리 보존이 중요한 경우

기존 커밋 기록을 유지하면서 변경 사항을 되돌리고 싶다면 `방법 1`을 선택하는 것이 좋습니다.

 

새로운 브랜치에서 작업을 하고 싶은 경우

`방법 2`를 선택하여 새로운 브랜치에서 `b` 커밋 기반으로 작업을 이어나갈 수 있습니다. 이 방법은 기존의 `main` 브랜치 히스토리를 깔끔하게 유지할 수 있습니다.

결론

따라서, `main` 브랜치에서 직접 변경 이력을 보존하며 작업을 이어가고 싶다면 방법 1을 선택하고, 새로운 브랜치에서 간결한 히스토리로 작업을 이어가고 싶다면 방법 2를 선택하는 것이 적절합니다.