2009-12-28 6 views
22
이후

이전에 나는 좋은 생각처럼 보였지만 실제로는 상황을 악화 시켰습니다. 나는 그것이 도움이되지 않기 때문에 역사에서 변화를 제거하고 싶다. 그리고 모든 커밋을 리베이스하라 - 그것들은 모두 문제없이 병합되어야한다.GIT가 가장 최근의 rebase가 아닌 커밋을 실행 취소합니다.

나는 즉시 전에 (newMaster라는) 새로운 지점을 만들려고 나쁜 커밋 (gitx 포함), 그것을 및 실행 확인 : AFAICS 나에게 마스터에 커밋의 목록을 제공해야

git rebase -i master 

병합 또는 병합 할 수있는 옵션이 있지만 대신에 아무 것도 말하지 않고 newMaster를 마스터와 동등하게 빨리 전달했습니다.

내가 원하는 것을 수행하는 가장 쉬운 방법은 무엇입니까?

답변

12

git rebase -i이 올바른 명령이지만 지점에서 최신 변경 사항을 적용하고 rebase 조작의 기본 (개정판은 잘못된 커미트) 인 개정을 전달하려고합니다. 당신이 마지막 커밋 좋은 가리키는 지점 last-good-commit을 만든다면, 당신은 master에서 다음 동안 실행하려는 것 :

rebase를 사용
git rebase -i last-good-commit 
+3

더 많은 인수를 제공하면보다 직관적으로 만들 수 있습니다. -'git rebase -i last-good-commit master'는 똑같은 일을합니다 (마지막으로 좋은 커밋을 기본으로 사용하여 마스터를 체크 아웃합니다). – Cascabel

29

원하는 작업을 수행하는 가장 쉬운 방법은 편집하려는 분기를 그대로 유지하고 다시 실행하는 것입니다.

git rebase --onto <sha1-of-bad-commit>^ <sha1-of-bad-commit> 

잘못된 커밋의 부모에 대한 나쁜 커밋 이후에 모든 것을 리베이스하여 현재 분기 기록에서 나쁜 커미트를 효과적으로 제거합니다. 물론 충돌이 발생하면이를 해결해야합니다.

+7

한 데이터 포인트에 밀어 수 있었다 :이 내 저장소를 파괴 . – Malvolio

+1

작동하려면'git push --force'를해야합니다. 그러나 매우 조심해야합니다. – redolent

2

, 내가 원격으로 변경 사항을 푸시 할 수 없습니다, 내 리베이스는 매번 당길 때마다 취소되었습니다.

나는 단지와 (하지 마지막) 커밋 정확한 되 돌리는 데 성공 :

git revert <sha-of-bad-commit> 

을 그리고 나는 또한 원격

+0

푸시 후에 리베이스하면'git push -f'를 사용하여 강제로 푸시해야합니다. 대상에서 다른 사람들의 변경 사항을 삭제할 수 있으므로이 기능을 사용할 때 특히주의하십시오. – rjmunro

관련 문제