2014-02-18 2 views
0

제 질문은 그 중 하나와 관련이 있습니다 : git-new-workdir: Commit in working tree A causes bogus changes in tree B. git-new-workdir을 사용하여 동일한 Git 저장소의 여러 작업 디렉토리를 갖습니다. 일반적으로 각 작업 디렉토리의 다른 분기에 대한 작업이 있지만 주어진 작업 디렉토리에서 분기 할 때 발생할 수 있습니다. 다른 작업 디렉토리는 동일한 분기의 체크 아웃입니다. 이런 일이 생기면, 두 번째 작업 디렉토리는 방금 전한 커밋의 역순으로 단계적으로 변경됩니다. 이제 내 질문이 왔습니다 ...Git에서 상연 된 변경 사항을 삭제하는 방법

무대 단 변경을 삭제하지 않고 어떻게 단계적 변경 사항을 삭제할 수 있습니까?

편집 : (git reset과 같은) 단계별 변경을 취소하고 싶지는 않지만 단계별 변경 사항을 완전히 삭제하고 싶습니다.

git diff HEAD > my.patch 
git reset --hard 
patch -p1 < my.patch 

하지만 자식 명령만을 사용하여 더 나은 방법이 있어야합니다 :

+0

대담한 코드를 재설정하기 위해'git reset -p'를 시도하십시오. – chepner

+0

@chepner : 잘 이해했다면,'git reset -p'는 변경 사항을 무대 뒤에서 만 처리하지만 버리지는 않을 것입니다. – lrineau

답변

0

은 무엇 하나 할 수있는 것은 git-diffpatch를 사용하여, 다음과 같다. 나는 그것이

git reset HEAD 
git checkout -- . 

다음 작업 트리를 건드리지 않고 인덱스를 폐기하기 위해 git rm filename

+1

질문은 작업을 잃지 않고 * 단계적 * 변경 사항을 삭제하는 것입니다. 준비된 변경 사항에 대해 신경 쓰지 않는다면, 원하는 변경 사항은'git diff'가 아니라'git diff HEAD'가 제공하는 것입니다. 만약 당신이 단계적인 변경을했다면,'git diff'는 당신에게 그 단계적인 변경과 작업중인 트리의 차이점을 줄 것입니다. 위가 당신을 위해 작동 한 경우에, 당신은 틀린 질문을 질문했다. – Kaz

+0

나는 네가 옳다고 생각한다. 실제로'git diff'는 작업 트리의 단계적 변경과 다른 변경이 다른 파일을 수정했기 때문에 저에게 효과적이었습니다. 그에 따라 답변을 수정했습니다. – lrineau

-1

방금이 작업을 수행 할 수 facepalmed :

git reset 

그렇습니다. 이는 자습서 "git 명령 사용"과 동일합니다. 최종 효과는 정확히 git diff HEAD의 결과를 제외하고 모든 것을 맨 위 커밋으로 롤백 한 다음 해당 diff를 HEAD에 다시 적용하여 원래 작업 트리를 다시 만드는 것과 같습니다.

그러나 실제로 삭제 된 변경 사항이 인덱스에서 제외되므로 해당 삭제 된 변경 사항이 실제로 작업에서 제외됩니다. 이 경우, 어떤 나는 변경을 잇기 대화 형 REBASE를 사용하는 것입니다 할 것 : 온다 편집기 창에서

git commit # commit the index 
git commit -a # commit the remaining changes 

git rebase --interactive HEAD^^ # rebase top two commits onto same branch 

, 나는 단순히 온 원치 않는 변경을 보유하고 커밋 삭제할 것 불필요한 인덱스에서 삭제 한 다음 저장하고 종료하여 대화 형 리베이스가 나머지 작업을 수행하게하십시오. 이전에 unstaged 원한 변경이 단계적으로 원치 않는 변경에 의존했을 수 있으므로 병합 충돌이있을 수 있습니다.

결국 나는 이전에 unstaged 된 변경 사항 만있는 단일 커밋을 가지게되며 원치 않는 변경 사항은 사라집니다. 바로 커밋하고 여기에 추가하고 메시지를 업데이트하기 위해 더 많은 일을 해킹 git commit --amend하여 작업을 계속 다른

git reset HEAD^ 

또는 : 그 시점에서, 나는 unstaged 변경으로 돌려, 커밋을 제거 얻을 수 있습니다.

rebase --interactive (실제로 비대화 형 리베이스가 수행하는 모든 작업)은 cherry-pick 명령으로 수행 할 수 있지만 편리한 "워크 플로 자동화"를 제공합니다.

커밋의 순서 변경, 커밋 삭제, 여러 커밋을 하나로 스쿼시하고, 커밋 메시지 (최상위 패치 제외)를 다시 작성하는 것과 관련된 모든 시나리오의 경우 사용 방법을 알고있는 것이 좋습니다 대화 형 리베이스.

아이디어는 모든 변경 사항의 표현을 별도의 커밋으로 전환 한 다음 커밋 - 쿵푸로 작업하고, 필요한 경우 마지막으로 "커밋 해제"합니다.

복잡한 작업을 수행 할 때 git은 임시 영역과 같은 unstaged 변경 또는 인덱스보다 커밋 작업을하는 것이 좋습니다. 그래서 당신은 거기에서 일을하고 먼저 커밋을하고 싶습니다. 실제로 무단 변경 또는 단계적 변경이있는 경우 git은 다양한 유용한 작업을 수행하지 못하도록합니다.

작업을 커밋해야하는 한 가지 이유는 git에서 작업 복사본이나 인덱스를 영원히 잃어 버리기 쉽다는 것입니다. 작업 복사본과 인덱스는 커밋 개체가 아니므로 reflog에서 복구 할 수 없습니다. 이들 중 하나 또는 둘 모두를 지우는 명령을 잘못 입력하면 명령이 올바르게 수행됩니다. 그러나 이 변경되면 커밋은 잃어버린 경우에도, reflog를 통해, 또는 설정할 수있는 분기 포인터 나 태그를 통해 복구 할 수 있습니다.

+0

'git checkout'은 추적 된 파일에 대한 단계적이지 않은 수정을 버립니다. 불행히도, 그건 내 질문에 대답하지 않습니다. – lrineau

1

으로뿐만 아니라 생성 한 로컬 파일을 제거 발견했을 때

관련 문제