문제

누군가하는 방법을 알고 쉽게 취소 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 버전 작성 소프트웨어를 사용한 실수에 관계없이 이전의 파일/폴더 상태로 되돌릴 수 있습니다. 또 다른 실패가 달리는 것이 항상 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top