programing

Git에서 마지막 커밋을 두 개로 나누는 방법은 무엇입니까?

starjava 2023. 5. 12. 20:09
반응형

Git에서 마지막 커밋을 두 개로 나누는 방법은 무엇입니까?

나는 두 개의 지점이 있습니다.master그리고.forum그리고 나는 방금 몇 가지 수정을 했습니다.forum내가 체리픽으로 선택하고 싶은 것.master하지만 안타깝게도, 제가 선택하고 싶은 약속에는 제가 원하지 않는 수정 사항도 포함되어 있습니다.

해결책은 어떻게든 잘못된 커밋을 삭제하고 두 개의 별도 커밋으로 교체하는 것입니다. 하나는 제가 선택하고 싶은 변경 사항입니다.master나머지 변경 사항이 있는 다른 변경 사항.

해봤어요

git reset --hard HEAD^

모든 변경사항을 삭제했기 때문에, 저는 다시 돌아가야 했습니다.

git reset ORIG_HEAD

마지막 커밋을 두 개의 커밋으로 분할하는 가장 좋은 방법은 무엇입니까?

인덱스를 사용해야 합니다.혼합 재설정("git reset HEAD^")을 수행한 후 첫 번째 변경 세트를 인덱스에 추가한 다음 변경 사항을 커밋합니다.그럼 나머지는 커밋하세요.

"git add"를 사용하여 파일의 모든 변경사항을 인덱스에 넣을 수 있습니다.파일의 모든 수정 사항을 스테이징하지 않으려면 일부 수정 사항만 "git add -p"를 사용할 수 있습니다.

예를 들어 보겠습니다.다음 텍스트가 포함된 myfile이라는 파일이 있다고 가정해 보겠습니다.

something
something else
something again

마지막 커밋에서 수정하여 다음과 같이 표시했습니다.

1
something
something else
something again
2

이제 저는 그것을 둘로 나누기로 결정했습니다. 그리고 첫 번째 줄의 삽입이 첫 번째 커밋에 있고 마지막 줄의 삽입이 두 번째 커밋에 있기를 바랍니다.

먼저 HEAD의 부모님께 돌아가지만 파일 시스템의 수정 사항을 유지하고 싶어서 인수 없이 "git reset"을 사용합니다(이 경우 "혼합" 재설정이 수행됨).

$ git reset HEAD^
myfile: locally modified
$ cat myfile
1
something
something else
something again
2

이제 "git add -p"를 사용하여 커밋할 변경사항을 인덱스에 추가합니다(=단계화합니다)."git add -p"는 파일이 인덱스에 추가해야 하는 변경 사항을 묻는 대화형 도구입니다.

$ git add -p myfile
diff --git a/myfile b/myfile
index 93db4cb..2f113ce 100644
--- a/myfile
+++ b/myfile
@@ -1,3 +1,5 @@
+1
 something
 something else
 something again
+2
Stage this hunk [y,n,a,d,/,s,e,?]? s    # split this section into two!
Split into 2 hunks.
@@ -1,3 +1,4 @@
+1
 something
 something else
 something again
Stage this hunk [y,n,a,d,/,j,J,g,e,?]? y  # yes, I want to stage this
@@ -1,3 +2,4 @@
 something
 something else
 something again
+2
Stage this hunk [y,n,a,d,/,K,g,e,?]? n   # no, I don't want to stage this

그런 다음 첫 번째 변경 사항을 적용합니다.

$ git commit -m "Added first line"
[master cef3d4e] Added first line
 1 files changed, 1 insertions(+), 0 deletions(-)

이제 다른 모든 변경 사항(즉, 마지막 줄에 "2"를 추가)을 커밋할 수 있습니다.

$ git commit -am "Added last line"
[master 5e284e6] Added last line
 1 files changed, 1 insertions(+), 0 deletions(-)

로그를 확인하여 어떤 커밋이 있는지 확인해 보겠습니다.

$ git log -p -n2 | cat
Commit 5e284e652f5e05a47ad8883d9f59ed9817be59d8
Author: ...
Date: ...

    Added last line

Diff --git a/myfile b/myfile
Index f9e1a67..2f113ce 100644
--- a/myfile
+++ b/myfile
@@ -2,3 +2,4 @@
 something
 something else
 something again
+2

Commit cef3d4e0298dd5d279a911440bb72d39410e7898
Author: ...
Date: ...

    Added first line

Diff --git a/myfile b/myfile
Index 93db4cb..f9e1a67 100644
--- a/myfile
+++ b/myfile
@@ -1,3 +1,4 @@
+1
 something
 something else
 something again

목표:

  • 의 커밋을 나누고 싶습니다.$splitme둘로
  • 커밋 메시지를 유지하고 싶습니다.

계획:

  1. rebase 는 화형을의 기커재반로다의 .$splitme$splitme~하듯이edit.
  2. 첫 번째 커밋에 포함되지 않아야 하는 파일의 스테이징을 해제합니다.
  3. 현재 커밋을 수정하고 커밋 메시지를 유지하며 필요한 경우 수정합니다.
  4. 첫 번째 커밋에서 누락된 파일을 스테이징백합니다.
  5. 커밋, 새 메시지 포함.
  6. 계속해서 기지개를 켜세요.

step (1, 7)이 생략된 에는 rebase step (1, 7할 수 .$splitme가장 최근의 커밋입니다.

git rebase -i $splitme^  # mark $splitme as edit
git reset HEAD^ -- $files
git commit --amend
git add $files
git commit
git rebase --continue

첫 번째 커밋에 있는 파일과 두 번째 커밋에 있는 파일을 교환하려면 다시 대화형으로 전환하여 커밋 라인을 교환해야 합니다.

현재 커밋을 두 커밋으로 변경하려면 다음과 같은 작업을 수행합니다.

다음 중 하나:

git reset --soft HEAD^

마지막 커밋은 실행 취소되지만 모든 것은 스테이징된 상태로 유지됩니다.그런 다음 특정 파일의 스테이징을 해제할 수 있습니다.

git reset -- file.file

선택적으로 해당 파일의 일부를 다시 준비합니다.

git add -p file.file

새 첫 번째 커밋:

git commit

두 번째 커밋에서 나머지 변경 사항을 준비하고 커밋합니다.

git commit -a

또는:

마지막 커밋의 모든 변경 내용 실행 취소 및 스테이징 해제:

git reset HEAD^

첫 번째 변경 단계를 선택적으로 준비합니다.

git add -p

커밋:

git commit

나머지 변경 사항을 커밋합니다.

git commit -a

단계 에서 새 하고 두 으로 (으)로 commit -a이미 추적된 파일에만 변경 사항을 단계화합니다.)

려달을 합니다.git gui"마지막 커밋 수정" 라디오 단추를 선택하고 첫 번째 커밋에 들어가지 않을 단계를 해제합니다([커밋] > [커밋에서 단계 해제] 또는 U-).그게 가장 쉬운 방법인 것 같아요.

이 할 수 또 않고 것입니다.git cherry-pick -n그 그런다수또를사는용여하로와 .git gui커밋하기 전에 원하는 변경 사항을 선택합니다.

git reset HEAD^

하드가 당신의 변화를 죽이는 것입니다.

도 제안하지 않은 것이 놀랍습니다.git cherry-pick -n forum최신 버전에서 변경된 내용을 스테이징합니다.forum커밋하지만 커밋하지 않음 - 그러면 할 수 있습니다.reset필요하지 않은 변경사항을 제거하고 보관할 내용을 커밋할 수 있습니다.

이중 반전 스퀴시 방법

  1. 원하지 않는 변경사항을 제거하는 다른 커밋을 수행합니다.(파일당 파일 수라면 매우 쉽습니다.)git checkout HEAD~1 -- files with unwanted changes그리고.git commit그렇지 않은 경우 변경 내용이 혼합된 파일을 부분적으로 준비할 수 있습니다.git reset file그리고.git add -p file중간 단계로서.)이것을 되돌림이라고 부릅니다.
  2. git revert HEAD원치 않는 변경 사항을 다시 추가하는 다른 커밋을 수행합니다.이것은 이중 반전입니다.
  3. 지금 만든 2개의 커밋 중 첫 번째 커밋을 분할할 커밋에 밀어넣습니다.git rebase -i HEAD~3이 커밋은 두 번째커밋에 않는이 없습니다. 이제 이 커밋은 두 번째 커밋에 포함된 원치 않는 변경 사항이 없습니다.

혜택들

  • 커밋 메시지를 보존합니다.
  • 분할에 대한 커밋이 마지막이 아닌 경우에도 작동합니다.원하지 않는 변경 사항이 이후의 커밋과 충돌하지 않으면 됩니다.

체리를 따는 중이므로 다음을 수행할 수 있습니다.

  1. cherry-pick과 함께--no-commit옵션이 추가되었습니다.
  2. reset 및사를 합니다.add --patch,add --edit아니면 그냥add무대에 올릴 수도 있어요.
  3. commit단계적 변화
    • 원래 커밋 메시지를 다시 사용하려면 다음을 추가할 수 있습니다.--reuse-message=<old-commit-ref>또는--reedit-message=<old-commit-ref>commit지휘권
  4. 사용하여 단계별 변경사항을 제거합니다.reset --hard.

원본 커밋 메시지를 보존하거나 편집하는 다른 방법:

  1. cherry-pick원래의 약속은 정상입니다.
  2. 않는 로 하여 합니다.add반전을 준비합니다.
    • 이 단계는 추가한 내용을 제거하는 경우에는 쉬우나, 제거한 내용을 추가하거나 변경 내용을 되돌리는 경우에는 약간 까다롭습니다.
  3. commit --amend벚꽃놀이 약속을 뒤집기 위해서입니다.
    • 필요에 따라 유지하거나 수정할 수 있는 동일한 커밋 메시지가 다시 표시됩니다.

이 방법은 커밋이 너무 커서 소량의 파일을 새 커밋으로 이동해야 하는 경우를 위한 또 다른 솔루션일 수 있습니다.이 기능은 다음과 같은 경우에 작동합니다.<path>HEAD의 마지막 커밋에서 파일을 추출하고 모든 파일을 새 커밋으로 이동합니다.여러 커밋이 필요한 경우 다른 솔루션을 사용할 수 있습니다.

먼저 코드를 수정 전과 수정 후로 되돌리는 변경 사항을 포함하는 준비된 영역과 준비되지 않은 영역에 패치를 만듭니다.

git reset HEAD^ <path>

$ git status
On branch <your-branch>
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   <path>

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   <path>

앞으로 일어날 일을 이해하려면(화살표와 주석은 명령의 일부가 아님):

git diff --cached   -> show staged changes to revert <path> to before HEAD
git diff            -> show unstaged changes to add current <path> changes

<path>마지막 커밋의 변경 사항:

git commit --amend  -> reverts changes on HEAD by amending with staged changes

다음을 사용하여 새 커밋 만들기<path>변경 사항:

git commit -a -m "New Commit" -> adds new commit with unstaged changes

이렇게 하면 마지막 커밋에서 추출한 변경 사항이 포함된 새 커밋을 만들 수 있습니다.

사용할 수 있습니다.git rebase -i <commit>서, 디에어<commit>현재 상태로 유지하려는 최신 커밋입니다. 추가break새 분할 커밋을 삽입할 각 지점에서.마다 그고각휴시에간식리,를 사용합니다.git checkout -p <commit containing parts you want>분리하고 싶은 부분을 당겨서 커밋합니다.그리고나서git rebase --continue나중의 커밋에서 해당 부분을 제거합니다.

가장 최근의 커밋을 분할하는 간단한 경우는 다음과 같습니다.

$ git rebase -i HEAD^
# add 'break' at the start

$ git checkout -p master # or whatever your branch is called
# choose the parts you want to split out

$ git commit
# commit the newly-split-out parts

$ git rebase --continue
# rebase the remaining parts of the change onto the split-out parts

이것은 당신이 나중에 커밋 메시지를 원래대로 유지하기를 원한다고 가정합니다. 그것이 내가 보통 (준비적 변화를 고려하는) 상황입니다.

언급URL : https://stackoverflow.com/questions/1440050/how-to-split-the-last-commit-into-two-in-git

반응형