Git이 잘못된 분기로 푸시


99

git로 작업하고 '커밋'하고 '푸시'한 후 잘못된 브랜치를 사용하고 있음을 깨달았습니다!

이제 나는 wrong_branch의 변경 사항을 어떤 식 으로든 제거하고 right_branch의 변경 사항을 커밋하고 푸시해야합니다.

이를 수행하는 가장 좋은 (그리고 간단한) 방법은 무엇입니까?

감사합니다



좋은 질문 @tokland : 루비 개발자의 99 %가 자식을 사용하고 내가 작업하고있는 프로젝트의 RoR에 ...하지만 난이 좋은 동기 부여가 될 수없는 알
알레산드로 드 시몬

3
내 관점에서 이것은 halfdan이 언급 한 내용의 중복이 아닙니다. 커밋을 제거하는 것뿐만 아니라 다른 브랜치로 이동하는 것도 마찬가지입니다.
olenz 2011 년

답변:


144

해당 분기로 전환하고 git loggit revert해당 커밋을 개별적으로 확인하십시오 . 그런 다음 원하는 분기로 다시 전환 git cherry-pick하면 git refs에서 특정 커밋을 선택하고 올바른 분기에 병합하는 데 사용할 수 있습니다 .

git checkout wrong_branch
git revert commitsha1
git revert commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

커밋이 함께 그룹화되고 더티 커밋 후에 푸시 된 커밋이없는 경우를 사용 git reset하여 커밋 직전 상태로 잘못된 브랜치를 가져온 다음 다시 사용 git cherry-pick하여 커밋을 올바른 브랜치로 가져올 수 있습니다.

git checkout wrong_branch
git reset commitsha3 #commit just before commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

Revert + cherry-pick은 헤드 재설정 및 / 또는 리베이스와 관련된 다른 가능한 방법보다 훨씬 간단 해 보입니다.
ChrisV

2
git cherry-pick의 경우 한 줄에 여러 개의 sha를 넣을 수 있습니다 git cherry-pick commitsha1 commitsha2.
ThomasW

생명의 은인! 그리고 복잡하지 않습니다. 감사합니다!
Craig Silver

wrong_branch (예 : 개발)를 right_branch (예 : feature / X)에 병합하려는 경우 어떤 일이 발생합니까? 그러면 체리가 선택한 변경 사항을 취소하는
되돌리기

revert너무 깨끗하고보다 덜 극적이다 reset당신이 정말로 중요한 것을 삭제하지 않으려면 (자격 증명을?)
Qumber

3

가장 간단한 방법은 git rebase. 해당 설정이 있다고 가정합니다.

A -- B -- C -- C1 -- C2 # right branch
          \
           \-- D -- C3 -- C4 # wrong branch

변경 C3, C4를 오른쪽 분기로 이동하려고합니다.

git checkout -b new_wrong_branch D
git checkout wrong_branch
git rebase D --onto right_branch
git checkout right_branch
git merge right_branch wrong_branch
git branch -d wrong_branch
git branch rename new_wrong_branch wrong_branch

이제 설정은

A -- B -- C -- C1 -- C2 -- C3 -- C4 # right_branch
          \
           \ -- D # wrong_branch

그런 다음 강제로 결과를 푸시해야합니다 (아직 원격 저장소와 동기화하지 않은 경우).

git push -f remote:right_branch

나는이 솔루션을 시도하지 않았으며 이미 첫 번째 답변에서 작업 중이었습니다 (작동했습니다). 나는 rebase에서 생각하지 않았습니다. 좋은 대안처럼 보입니다. 감사합니다
Alessandro De Simone

1
보다 git push -f더 나은 사용 git push --force-with-lease. 적어도 아무도 커밋 위에 다른 커밋을 푸시하지 않은 경우에만 원격 참조가 업데이트되도록합니다.
Pierre-Olivier Vares

2

Dhruva의 답변에 추가되는 약간의 지름길

git checkout wrong_branch
git revert commitsha1

git checkout right_branch
git push right_branch

git checkout wrong_branch
git reset commitsha2 #commit just before commitsha1
git push wrong_branch -f
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.