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
둘로 - 커밋 메시지를 유지하고 싶습니다.
계획:
- rebase 는 화형을의 기커재반로다의 .
$splitme
킹$splitme
~하듯이edit
. - 첫 번째 커밋에 포함되지 않아야 하는 파일의 스테이징을 해제합니다.
- 현재 커밋을 수정하고 커밋 메시지를 유지하며 필요한 경우 수정합니다.
- 첫 번째 커밋에서 누락된 파일을 스테이징백합니다.
- 커밋, 새 메시지 포함.
- 계속해서 기지개를 켜세요.
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
필요하지 않은 변경사항을 제거하고 보관할 내용을 커밋할 수 있습니다.
이중 반전 스퀴시 방법
- 원하지 않는 변경사항을 제거하는 다른 커밋을 수행합니다.(파일당 파일 수라면 매우 쉽습니다.)
git checkout HEAD~1 -- files with unwanted changes
그리고.git commit
그렇지 않은 경우 변경 내용이 혼합된 파일을 부분적으로 준비할 수 있습니다.git reset file
그리고.git add -p file
중간 단계로서.)이것을 되돌림이라고 부릅니다. git revert HEAD
원치 않는 변경 사항을 다시 추가하는 다른 커밋을 수행합니다.이것은 이중 반전입니다.- 지금 만든 2개의 커밋 중 첫 번째 커밋을 분할할 커밋에 밀어넣습니다.
git rebase -i HEAD~3
이 커밋은 두 번째커밋에 않는이 없습니다. 이제 이 커밋은 두 번째 커밋에 포함된 원치 않는 변경 사항이 없습니다.
혜택들
- 커밋 메시지를 보존합니다.
- 분할에 대한 커밋이 마지막이 아닌 경우에도 작동합니다.원하지 않는 변경 사항이 이후의 커밋과 충돌하지 않으면 됩니다.
체리를 따는 중이므로 다음을 수행할 수 있습니다.
cherry-pick
과 함께--no-commit
옵션이 추가되었습니다.reset
및사를 합니다.add --patch
,add --edit
아니면 그냥add
무대에 올릴 수도 있어요.commit
단계적 변화- 원래 커밋 메시지를 다시 사용하려면 다음을 추가할 수 있습니다.
--reuse-message=<old-commit-ref>
또는--reedit-message=<old-commit-ref>
에commit
지휘권
- 원래 커밋 메시지를 다시 사용하려면 다음을 추가할 수 있습니다.
- 사용하여 단계별 변경사항을 제거합니다.
reset --hard
.
원본 커밋 메시지를 보존하거나 편집하는 다른 방법:
cherry-pick
원래의 약속은 정상입니다.- 않는 로 하여 합니다.
add
반전을 준비합니다.- 이 단계는 추가한 내용을 제거하는 경우에는 쉬우나, 제거한 내용을 추가하거나 변경 내용을 되돌리는 경우에는 약간 까다롭습니다.
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
'programing' 카테고리의 다른 글
구성에서 원격에서 와 병합하도록 지정했지만 이러한 참조를 가져오지 않았습니다. (0) | 2023.05.12 |
---|---|
Bash에서 글로벌에 일치하는 항목이 있는지 테스트 (0) | 2023.05.12 |
어셈블리의 net standard, Version=2.0.0.0에 대한 참조를 추가해야 합니다. (0) | 2023.05.12 |
VBA를 사용하여 프로그래밍 방식으로 참조를 추가하는 방법 (0) | 2023.05.12 |
데이터 바인딩 드롭다운 목록 - 초기 값 (0) | 2023.05.12 |