문제
누군가하는 방법을 알고 쉽게 취소 git 리베?
는 유일한 방법은 온 마음에 가서 그것은 수동:
- git 체크 아웃 커밋하는 부모 모두 가지의
- 를 만들 temp 점에서 거
- 체리 모두 선택 커밋에 의해 손으로
- 대체는 지점에는 나의 주소에 의해 수동으로 만들어진 지점
시 상황에서 이것은 작동하기 위하여 려고 하고 있기 때문에 나는 쉽게 알아볼 수 commits 에서 모두 지점(하 나의 재료,다른 동료의 물건).
그러나 나의 접근 방식으로 나를 친 차선하고 오류가 발생하기 쉬운(말하자 나는 그냥 기준으로 2 내가 내 자신의 지점은 불가).
어떤 아이디어가?
설명:나는 이야기에 대해 리베이스는 동안 무리의 커밋이었 재생됩니다.뿐만 아니라 하나입니다.
해결책
가장 쉬운 방법은 Rebase가 시작되기 직전에 지점의 헤드 커밋을 찾는 것입니다. 리플 로그...
git reflog
현재 지점을 재설정하려면 ( --hard
옵션).
오래된 커밋이었다고 가정 해 봅시다 HEAD@{5}
심판 로그에서 :
git reset --hard HEAD@{5}
Windows에서는 참조를 인용해야 할 수도 있습니다.
git reset --hard "HEAD@{5}"
당신은 그냥 git log HEAD@{5}
(Windows : git log "HEAD@{5}"
).
분기 반사당 당 비활성화되지 않으면 단순히 할 수 있어야합니다. git reflog branchname@{1}
리베이스가 최종 헤드로 재 부착하기 전에 분기 헤드를 분리합니다. 나는 이것을 최근에 확인하지 않았지만 이것을 두 번 확인할 것입니다.
기본값에 따라 모든 반사체는 비 보유 리포지토리에 대해 활성화됩니다.
[core]
logAllRefUpdates = true
다른 팁
실제로 Rebase는 출발점을 저장합니다 ORIG_HEAD
따라서 이것은 일반적으로 다음과 같이 간단합니다.
git reset --hard ORIG_HEAD
그러나, 그 reset
, rebase
그리고 merge
모두 원본을 저장합니다 HEAD
포인터로 ORIG_HEAD
따라서 rebase를 취소하려는 이후로 해당 명령을 작성했다면 리플 로그를 사용해야합니다.
Charles의 답변은 작동하지만이를 원할 수도 있습니다.
git rebase --abort
후에 정리합니다 reset
.
그렇지 않으면 메시지를받을 수 있습니다.Interactive rebase already started
”.
git reflog
Rebase 전후의 모든 변경 사항을 보여주고 재설정 할 올바른 변경 사항을 찾을 수 있습니다. 그러나 나는 아직이 다른 매우 간단한 방법을 언급 한 사람이 아무도 없다는 것에 놀랐습니다.
Rebase는 이전 상태를 그대로 둡니다 ORIG_HEAD
, 그래서 당신은 다음을 실행하여 마지막 레바이스를 되돌릴 수 있습니다.
git reset --hard ORIG_HEAD
기존 팁의 매달려 커밋 객체에 분기를 재설정하는 것은 최상의 솔루션입니다. 노력을 기울이지 않고 이전 상태를 복원하기 때문입니다. 그러나 그 커밋을 잃어버린 경우 (F.Ex. 그 동안 쓰레기를 수집했거나 그 동안 신선한 복제본이기 때문에) 언제든지 지점을 다시 다시베이스 할 수 있습니다. 이것의 열쇠는 --onto
스위치.
주제 지점이 상상력으로 불려 졌다고 가정 해 봅시다. topic
, 당신은 분기했습니다 master
팁이있을 때 master
was the 0deadbeef
저지르다. 어느 시점에서 topic
지점, 당신은했습니다 git rebase master
. 이제 당신은 이것을 취소하고 싶습니다. 방법은 다음과 같습니다.
git rebase --onto 0deadbeef master topic
이것은 모든 커밋이 필요합니다 topic
그건 켜져 있지 않습니다 master
그리고 그들을 위에 재생합니다 0deadbeef
.
와 함께 --onto
, 당신은 당신의 역사를 거의 다시 정리할 수 있습니다 어떤 모양이든.
재미있어. :-)
사소한 작업을 수행하기 전에 실제로 지점에 백업 태그를 넣었습니다 (대부분의 리바스는 사소하지만 복잡한 곳에서 보이면 그렇게 할 것입니다).
그런 다음 복원은 쉽습니다 git reset --hard BACKUP
.
경우에 당신은 당신의 지점을 원격 저장소로 밀었습니다 (보통 원점입니다) 그리고 당신은 성공적인 rebase를했습니다 (병합없이) (git rebase --abort
"REBASE NO REBASE NO REBASE"를 제공 할 수 있습니다. 지점을 재설정하십시오 명령 사용 :
git reset -hard origin/{branchname}
예시:
$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is ahead of 'origin/{branchName}' by 135 commits.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
$ ~/work/projects/{ProjectName} $ git reset --hard origin/{branchName}
HEAD is now at 6df5719 "Commit message".
$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is up-to-date with 'origin/{branchName}.
nothing to commit, working directory clean
Rebase를 완료하지 못하고 그 중간에 다음이 작동합니다.
git rebase --abort
사용 reflog
나를 위해 일하지 않았습니다.
나를 위해 일한 것은 설명과 비슷했습니다 여기. 파일을 .git/logs/refs로 열어 놓은 분기의 이름을 딴 다음 "Rebase Finsihed"가 포함 된 선을 찾으십시오.
5fce6b51 88552c8f Kris Leech <me@example.com> 1329744625 +0000 rebase finished: refs/heads/integrate onto 9e460878
라인에 나열된 두 번째 커밋을 확인하십시오.
git checkout 88552c8f
일단 확인한 후에 나는 잃어버린 변경 사항이 포함되어 있음을 확인하고 분기하고 안도의 한숨을 쉬었다.
git log
git checkout -b lost_changes
여러 커밋의 경우, 커밋은 그 커밋으로 이어지는 모든 역사를 참조하십시오. 찰스의 대답에서 "오래된 커밋"을 "오래된 커밋의 최신"으로 읽으십시오. 당신이 그 커밋에 재설정하면, 그 커밋으로 이어지는 모든 역사가 다시 나타날 것입니다. 이것은 당신이 원하는 것을해야합니다.
@allan과 @zearin의 해결책을 따라 간단히 의견을 제시 할 수 있지만 평판이 충분하지 않으므로 다음 명령을 사용했습니다.
하는 대신 git rebase -i --abort
(참고 -나) 나는 단순히해야했다 git rebase --abort
(없이 그만큼 -나).
둘 다 사용합니다 -i
그리고 --abort
동시에 GIT가 저에게 사용/옵션 목록을 보여줍니다.
따라서이 솔루션의 이전 및 현재 지점 상태는 다음과 같습니다.
matbhz@myPc /my/project/environment (branch-123|REBASE-i)
$ git rebase --abort
matbhz@myPc /my/project/environment (branch-123)
$
당신이 성공적으로 기준에 대한 원격지점과할 수 없 git rebase --abort
당신은 여전히 할 수 있는 몇 가지 작업을 저장하고 있지 않 강제로 밀어.가정한 현재 지점는 기준에 의한 실수가 불 your-branch
와 추적 origin/your-branch
git branch -m your-branch-rebased
#이름 바꾸기에 현재git checkout origin/your-branch
#체크아웃 최신 상태로 있는 것으로 알려진 원산지git checkout -b your-branch
- 체크
git log your-branch-rebased
, 비교기git log your-branch
및 정의 커밋에서 누락된your-branch
git cherry-pick COMMIT_HASH
에 대한 모든 커밋에your-branch-rebased
- 밀어 변경합니다.시는 것을 알고 두 지역의 분지와 관련된
remote/your-branch
당신은 밀만your-branch
내 기능 지점에 마스터를 다시베이스하고 30 개의 새로운 커밋을 얻는 것이 무언가를 깨뜨 렸습니다. 나는 종종 나쁜 커밋을 제거하는 것이 가장 쉽다는 것을 알았습니다.
git rebase -i HEAD~31
지난 31 번의 커밋에 대한 대화식 레바이스 (너무 많이 선택하면 아프지 않음).
당신이 제거하고 싶은 커밋을 가져 가서 "선택"대신 "d"로 표시하십시오. 이제 커밋이 Rebase를 실행 취소하는 효과적으로 삭제됩니다 (Rebasing시 방금 얻은 커밋 만 제거하는 경우).
지점에있는 경우 사용할 수 있습니다.
git reset --hard @{1}
헤드에 대한 기준 로그만이 아닙니다 ( git reflog
), 각 지점에 대한 반사기도 있습니다 ( git reflog <branch>
). 그래서 당신이 있다면 master
그 다음에 git reflog master
해당 지점에 대한 모든 변경 사항을 나열합니다. 그 변경 사항을 참조 할 수 있습니다 master@{1}
, master@{2}
, 등.
git rebase
일반적으로 헤드가 여러 번 변경되지만 현재 지점은 한 번만 업데이트됩니다.
@{1}
단순히 a입니다 현재 지점의 바로 가기, 그래서 그것은 동일합니다 master@{1}
당신이있는 경우 master
.
git reset --hard ORIG_HEAD
사용하면 작동하지 않습니다 git reset
대화식 동안 rebase
.
초보자/하드 리셋을하는 것을 두려워하는 사람의 경우, 리플 로그에서 커밋을 확인한 다음 새 지점으로 저장할 수 있습니다.
git reflog
재건을 시작하기 직전에 커밋을 찾으십시오. 그것을 찾으려면 더 아래로 스크롤해야 할 수도 있습니다 (Enter 또는 Pagedown을 누릅니다). 헤드 번호를 기록하고 57을 교체하십시오.
git checkout HEAD@{57}
이 헤드를 사용하여 새 지점을 만드는 것이 좋으면 분기/커밋을 검토하십시오.
git checkout -b new_branch_name
git reset -hard origin/{branchname}
Rebase가 수행 한 모든 로컬 변경 사항을 재설정하기위한 올바른 솔루션입니다.
내가 보통하는 것은git reset #commit_hash
내가 Rebase가 아무런 영향을 미치지 않았다고 생각하는 마지막 커밋에.
그 다음에 git pull
이제 당신의 지점은 마스터와 똑같이 일치해야하며 리베이지 커밋은 그 안에 있지 않아야합니다.
이제이 지점에서 Commits를 체리 픽시 할 수 있습니다.
당신이 git rebase 안에서 무언가를 엉망으로 만들면, 예를 들어 git rebase --abort
, 당신은 커밋되지 않은 파일이있는 동안 손실되고 git reflog
도움이되지 않습니다. 이것은 나에게 일어 났고 당신은 여기서 상자 밖에서 생각해야 할 것입니다. 당신이 나처럼 운이 좋고 Intellij webstorm을 사용한다면 right-click->local history
버전 작성 소프트웨어를 사용한 실수에 관계없이 이전의 파일/폴더 상태로 되돌릴 수 있습니다. 또 다른 실패가 달리는 것이 항상 좋습니다.