2011-09-17 2 views
14

난 그냥 내 develop 지점에자식 병합 스쿼시를 취소하는 방법은 무엇입니까?

git merge --squash feature-branch 

을 수행했다.

위의 명령은 새 커밋을 만들지 않고 헤드를 업데이트하는 것이 문제입니다. 제 의도는 develop의 머리에 적용 할 하나의 커밋을 만드는 것이 었습니다.

요약하면 병합 전후의 develop 분기에 대한 로그는 동일합니다.

developgit merge 이전의 상태로 되 돌리는 방법이 있습니까?

감사합니다.

댄 D.에서 주석과 나는 아래의 허용 대답을 기반으로 솔루션

내 문제를 해결할 수 있었다. 동일한 보트에있는 경우에 대비하여 내가 한 일을 아래에서보십시오.

1 - git reflog을 실행했으며 내 develop 지점으로 수행 한 모든 커미트 및 체크 아웃을 나열했습니다.

2 - 제안한대로 git reset [email protected]{1}을 수행하는 대신 마지막으로 내가 저지른 개발을 위해 그 번호를 찾았습니다. 제 경우에는 [email protected]{188}이었습니다. 그래서 git reset [email protected]{188}을 입력했습니다.

3 - 나는 git log을 돌 렸으며 잘못된 병합을 수행하기 전에 내가 가진 커밋만을 보여주는 깨끗한 로그를 가졌습니다.

4 - 기능 개발 중에 생성 된 모든 새 파일을 실행하기 위해 git add -A .을 실행했습니다.

5

- 난

6 git commit -m "install feature-x"를 실행 - 결과 지금은 올바른 파일 분기 develop을 가지고 로그가 깨끗한 - 하나의 내가 feature-x의 개발 기간 동안했던 모든 변경 내용을 커밋 보여주는.

원래 git merge --squash feature-branch이 의도 한대로 작동하지 않는 이유를 알아야합니다.

해결 방법 2

마크 Longair의 대답은 내 문제에 대한 확실한 해결책이다. 나는 단지 그것을 테스트하고 작동합니다. 나는 feature-branch 내의 모든 내부 커밋 스쿼시 지금 사용하고 그냥 하나가 develop 브랜치에 커밋을 포함하는 프로세스 아래 참조 :

git checkout develop 
git merge --squash feature-branch 
git commit -m "install of feature-branch" 

위의 순서는 마치 마법처럼 작동합니다.

+2

'git reflog'를 사용하십시오. –

답변

17

git merge --squash <other-branch>을 실행하면 작업 트리와 인덱스가 병합 결과와 함께 업데이트되지만 커밋을 생성하지 않습니다.당신이해야 할 모든 실행하는 것입니다 :

git commit 

을하지만, 당신이 커밋하기 전에 당신의 마음을 변경하고 그냥 병합을 취소하려는 경우, 당신은 간단하게 실행할 수 있습니다

git reset --merge 

당신은 필요하지 않습니다를 reflog를 사용합니다. 현대 자식 구문을 사용하여 병합 중단

:

git merge --abort 

그리고 오래된 구문 :

git reset --merge 

그리고 정말 당신이 커밋하기 전에 당신의 마음을 변경하는 경우

+0

우 우우, 감사합니다. 저는 새로운 지사에서 일하고 있으며 그것이 작동하는지 확인하기 위해 제안을 테스트 할 것입니다. 나는이 질문을 결과로 업데이트 할 것이다. 고맙습니다. – jdias

+0

테스트를 거쳐 작동합니다. Mark 감사합니다. 방금 당신의 대답으로 내 질문을 업데이 트했습니다. – jdias

+0

+1 다른 thinko 다림질 아웃. 고마워! (다소 좌절 된 노트 : 이것은 git에서 모든 하위 명령이 약간 비 일관 적으로 동작하기 때문입니다 - 병합, 숨김 적용, 로컬 변경으로 계산, 모두 다르게 작동합니다. 'git checkout HEAD -'와 'git checkout HEAD - .','git rebase --abort'가 아니라'git merge --abort','git push --all'가 아니라'git pull --all'과 많은 미묘한 인스턴스들) – sehe

0

, 당신은이 옵션을 사용할 수 있습니다 구 학교 :

그러나 실제로는 git merge --abort은 이있는 경우에만 git reset --merge에 해당합니다. 이것은 merge 명령에 대한 자식 도움말에서 읽을 수 있습니다. 더 MERGE_HEAD이없는 경우 실패한 병합 후

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present. 

, 실패한 병합 git reset --merge으로 취소 할 수 있지만 반드시 git merge --abort로, 는 그래서 그들은하지 같은 일 만 이전 및 새 구문입니다. 개인적으로 나는 git reset --merge이 일상 생활에서 훨씬 더 유용하다고 생각합니다.

관련 문제