가장 최근의 커밋을 GIT가있는 새 지점으로 이동하십시오.
질문
나는 새로운 지점에 훈련을 받고 헌신 한 마지막 몇 가지 커밋을 옮기고 그 커밋이 이루어지기 전에 마스터를 되찾고 싶습니다.불행히도, 내 git-fu는 아직 충분히 강하지 않고 도움이 필요합니까?
즉.어떻게 할 수 있니?
master A - B - C - D - E
이에?
newbranch C - D - E
/
master A - B
답변
기존 지점으로 이동합니다
커밋을 기존 분기로 이동하려면 다음과 같습니다.
git checkout existingbranch
git merge master
git checkout master
git reset --hard HEAD~3 # Go back 3 commits. You *will* lose uncommitted work.
git checkout existingbranch
Git Stash를 사용하여이를 수행하기 전에 커밋되지 않은 편집을 숨기기에 저장할 수 있습니다.일단 완료되면 으깬 커밋되지 않은 편집트를 Git Stash Pop으로 검색 할 수 있습니다.
새로운 지점으로 이사합니다
경고 :이 메서드는 첫 번째 명령을 가진 새 지점을 만들기 때문에 작동합니다. Git Branch NewBranch.기존 지점으로 커밋을 이동하려면 Git Reset - Hard Head ~ 3을 실행하기 전에 변경 사항을 기존 분기로 병합해야합니다 (위의 기존 분기로 이동 참조).처음 변경 사항을 병합하지 않으면 손실됩니다.
관련된 다른 상황이없는 한, 이는 분기 및 롤백으로 쉽게 수행 할 수 있습니다.
# Note: Any changes not committed will be lost.
git branch newbranch # Create a new branch, saving the desired commits
git reset --hard HEAD~3 # Move master back by 3 commits (Make sure you know how many commits you need to go back)
git checkout newbranch # Go to the new branch that still has the desired commits
그러나 얼마나 많은 커밋을 다시 돌아갈 수 있는지 확인하십시오.또는 HEAD ~ 3 대신 마스터 (/ current) 분기에서 "되돌리기"를 "되돌리려는"되돌리려는 커밋 (또는 원점 / 마스터 참조)의 해시를 제공 할 수 있습니다.
git reset --hard a1b2c3d4
* 1 마스터 지점에서만 "잃어버린"이지만 걱정하지 마십시오. 뉴 브랜치에있는 이메일을 보내드립니다!
경고 : GIT 버전 2.0 이상으로 나중에 원래 (마스터) 분기에 새 지점을 다시 제시하는 경우 Rebase 동안 Rebase 동안 명시 적으로 - 포크 포인트 옵션이 필요할 수 있으므로 운반 된 커밋을 잃지 않도록하십시오.Branch.AutosetuPrebase가 항상 설정되면 이렇게 해줍니다.자세한 내용은 John Mellor의 답변을 참조하십시오.
답변
왜 그것이 어떻게 작동하는지 궁금해하는 사람들을 위해서 (내가 처음에 있었던 것처럼) :
C로 돌아가서 D와 E를 새로운 지점으로 이동하려고합니다.처음에는 어떻게 생겼는지 여기에 있습니다.
A-B-C-D-E (HEAD)
↑
master
Git Branch NewBranch :
newBranch
↓
A-B-C-D-E (HEAD)
↑
master
git 재설정 후 - 머리 ~ 2 :
newBranch
↓
A-B-C-D-E (HEAD)
↑
master
가지는 포인터 일뿐 만 아니라 마스터가 마지막 커밋을 가리켰다.NewBranch를 만들 때 마지막 커밋에 대한 새로운 포인터를 만들었습니다.그런 다음 git 재설정을 사용하여 마스터 포인터를 두 가지 커밋을 다시 옮겼습니다.그러나 당신이 뉴 브랜치를 움직이지 않았으므로 원래 그것이 그랬던 것은 여전히 커밋을 가리킨다.
답변
일반적으로 ...
Sykora가 노출 된 방법은이 경우 가장 좋은 옵션입니다.그러나 때로는 가장 쉬운 것이 아니며 일반적인 방법이 아닙니다.일반적인 방법을 위해 Git Cherry-Pick을 사용하십시오.
OP가 원하는 것을 얻으려면 2 단계 프로세스 :
1 단계 - NewBranch에서 원하는 주인의 커밋
실행하다
git checkout master
git log
(3) 신규 브랜치에서 당신이 원하는 해시를 주목하십시오.여기에서는 다음과 같이 사용할 것입니다 : C 커밋 : 9AA1233. D 커밋 : 453AC3D. e 커밋 : 612ecB3.
참고 : 처음 7자를 사용하거나 전체 커밋 해시
2 단계 - 새로운 브랜치에 넣으십시오
git checkout newbranch
git cherry-pick 612ecb3
git cherry-pick 453ac3d
git cherry-pick 9aa1233
또는 (GIT 1.7.2+에서 사용 범위에서 사용)
git checkout newbranch
git cherry-pick 612ecb3~1..9aa1233
Git Cherry-Pick는 NewBranch에 3 가지 커밋을 적용합니다.
답변
이전의 답변은 위험합니다!
이 작업을 수행하지 마십시오.
git branch -t newbranch
git reset --hard HEAD~3
git checkout newbranch
다음 번에 Git Rebase (또는 Git Pull -rebase)를 실행하면 그 3 가지 커밋을 NewBranch에서 조용히 버릴 것입니다!(아래 설명 참조)
대신이 작업을 수행하십시오.
git reset --keep HEAD~3
git checkout -t -b newbranch
git cherry-pick ..HEAD@{2}
먼저 3 개의 가장 최근의 커밋을 삭제합니다. 그런 다음 새로운 브랜치에서 포크스. 그런 다음 체리 3 개를 뉴 브랜치로 되돌아 가게합니다.지점에서 더 이상 참조되지 않으므로 Git의 refrog를 사용하여 @ {2}는 2 개 운영을 참조하는 데 사용되는 헤드가 있습니다.재설정 3 커밋을 폐기하십시오.
경고 : Relfrog는 기본적으로 활성화되어 있지만 수동으로 비활성화 된 경우 (예 : "Bare"Git 저장소를 사용하여) Git 재설정을 실행 한 후 3 커밋을 다시 얻을 수 없습니다.삼.
리플래그에 의존하지 않는 대안은 다음과 같습니다.
# newbranch will omit the 3 most recent commits.
git checkout -b newbranch HEAD~3
git branch --set-upstream-to=oldbranch
# Cherry-picks the extra commits from oldbranch.
git cherry-pick ..oldbranch
# Discards the 3 most recent commits from oldbranch.
git branch --force oldbranch oldbranch~3
(OldBranch 대신 이전에 체크 아웃 한 분기 - @ {- 1}을 쓸 수 있습니다.
기술적 설명
왜 첫 번째 예제 이후에 3 명의 커밋을 버리겠습니까?인수가없는 Git Rebase는 기본적으로 --fork-point 옵션을 사용하여 현지 refrog를 사용하여 강제로 밀어졌습니다.
M1, M2, M3을 포함한 Commits M1, M2, M3을 포함한 경우 출발지 / 마스터를 분기 한 것으로 가정 해보십시오.
M1--M2--M3 <-- origin/master
\
T1--T2--T3 <-- topic
그러나 누군가가 M2를 제거하기 위해 원점 / 마스터를 강제로 밀어 넣는 역사를 다시 작성합니다.
M1--M3' <-- origin/master
\
M2--M3--T1--T2--T3 <-- topic
Local Relfog를 사용하여 Git Rebase는 원산지 / 마스터 브랜치의 초기 화신에서 분리되었고 M2와 M3 커밋이 주제 지점의 일부가 아니라는 것을 알 수 있습니다.따라서 M2가 업스트림 브랜치에서 M2가 제거되었으므로 주제 분기가 리베이 처리되면 주제 지점에서 더 이상 원하지 않는다고 합리적으로 가정합니다.
M1--M3' <-- origin/master
\
T1'--T2'--T3' <-- topic (rebased)
이 행동은 의미가 있으며 일반적으로 리베이를 할 때해야 할 일입니다.
따라서 다음 명령이 실패한 이유는 다음과 같습니다.
git branch -t newbranch
git reset --hard HEAD~3
git checkout newbranch
그들이 잘못된 상태로 refrog를 떠나기 때문입니다.Git은 새로운 브랜치를 3 가지 커밋을 포함하는 개정판에서 업스트림 지점을 분리 한 것처럼, 재설정 - 하드는 커밋을 제거하기 위해 업스트림의 역사를 다시 작성하므로 다음에 다른 커밋처럼 삭제하는 Git Rebase를 실행합니다.업스트림에서 제거되었습니다.
그러나이 특별한 경우에 우리는 그 3 가지 커밋이 주제 지점의 일부로 고려되도록 원합니다.이를 달성하기 위해 3 가지 커밋을 포함하지 않는 이전 개정판에서 업스트림을 포기해야합니다.그것이 제가 제안 된 솔루션이 무엇을 할 것입니다. 따라서 둘 다 올바른 상태로 refrog를 남깁니다.
자세한 내용은 Git Rebase 및 Git 병합 기본 문서에서 --fork-point의 정의를 참조하십시오.
답변
그러나 단 2 개의 명령을 사용 하여이 작업을 수행하는 또 다른 방법입니다.또한 현재 작업 트리를 그대로 유지합니다.
git checkout -b newbranch # switch to a new branch
git branch -f master HEAD~3 # make master point to some older commit
이전 버전 - Git Branch -f에 대해 배웠 기 전에
git checkout -b newbranch # switch to a new branch
git push . +HEAD~3:master # make master point to some older commit
밀어 넣을 수 있습니다.알고있는 좋은 트릭입니다.
답변
Git Stash를 사용하는 훨씬 간단한 솔루션
다음은 잘못된 지점에 대한 커밋을위한 훨씬 간단한 솔루션입니다.3 개의 잘못된 커밋이있는 지점 마스터에서 시작하는 것 :
git reset HEAD~3
git stash
git checkout newbranch
git stash pop
이것을 사용할 때?
기본 목적이 마스터를 롤백하는 것이라면 파일 변경을 유지하고 싶습니다 실수의 커밋에있는 메시지를 상관하지 않습니다. 당신은 아직 밀지 않았습니다 당신은 이것을 암기하기 쉽게하기를 원합니다 임시 / 새로운 분기와 같은 합병증을 원하지 않으며 해시를 찾아서 복사하고 다른 두통을 복사합니다.
이것이 무엇을 할 것인가, 행 번호로
- Undoes the last three commits (and their messages) to
master
, yet leaves all working files intact - Stashes away all the working file changes, making the
master
working tree exactly equal to the HEAD~3 state - Switches to an existing branch
newbranch
- Applies the stashed changes to your working directory and clears the stash
일반적으로 Git Add 및 Git Commit를 사용할 수 있습니다.모든 새로운 커밋이 뉴 브랜치에 추가됩니다.
이것이하지 않는 것
임의의 임시 분기가 당신의 나무를 어지럽게하는 것입니다 그것은 실수의 커밋 메시지를 보존하지 않으므로이 새로운 커밋에 새로운 커밋 메시지를 추가해야합니다. 업데이트!위쪽 화살표를 사용하여 커맨드 메시지로 이전 커밋을 다시 적용하려면 명령 버퍼를 스크롤하십시오 (감사 @ark).
목표
op은 변화를 잃지 않고이 솔루션을 잃지 않고 "그 commits가 만들어 졌기 전에 마스터를 되찾아 냈습니다."는 목표를 나타 냈습니다.
나는 실수로 새로운 커밋을 개발하는 대신에 새로운 커밋을 할 때 적어도 일주일에 한 번이 일을합니다.일반적으로 Git Reset Head를 사용하는 경우 롤백 롤백을 하나만 가지고 있습니다. ^ 라인 1은 단지 하나의 커밋을 롤백하는 더 간단한 방법입니다.
마스터의 변경을 업스트림으로 밀어 넣으면이 작업을 수행하지 마십시오.
다른 누군가가 그 변화를 뽑을 수있었습니다.로컬 마스터 만 다시 작성하는 경우 업스트림을 푸시 할 때 영향을 미치지 만 공동 작업자에게 재기록 기록을 누를 수 있습니다.
출처:https://stackoverflow.com/questions/1628563/move-the-most-recent-commits-to-a-new-branch-with-git
최근댓글