2016-07-26 2 views
2

병합 나는이 같은 상황했다없이 같이 정확하게 커밋 :힘내 "이동"이 파일을 자식에

a - b - c - d - #be2c15 
        ^

내가 커밋에서 일부 파일을 복구하고 싶었다 "는"내가 리셋이 한을 SOFT는없는

a - b - c - d - #be2c15 
^ 

가 그럼 난 삭제 된 파일이 표시 복구 작업 트리를 수정합니다. 이 시점에서

나는 # be2c15에 인덱스를 다시 재설정 한 후 커밋 않지만 내가 실수를 바로이 같은 변화 노력 : 커밋 #의 88ae59e 정확하게 모두 포함 이제

a - b - c - d - #be2c15 
\ 
    #88ae59e 

를 나는 그 원하지 만 잘못된 위치에있다. 내가 가지고있는 파일을 건드리지 않고 어떻게 "옮길"수 있습니까? 이처럼 :

a - b - c - d - #be2c15 - #88ae59e 
+1

리베이스가 아닙니까? 아니면 체리 피클? – melpomene

+0

@melpomene 리베이스는'# be2c15'의 맨 위에'a'에서'# 88ae59e'까지 diff를 적용 할 것입니다. 이것은 parrent'# be2c15'와'# 88ae59e'의 트리를 가지고 새로운 커밋을 만드는 것과 근본적으로 다른 것으로, OP가하려고하는 것입니다. – cmaster

답변

2

내가합니다 (REBASE을하는 동안 만 병합 충돌 사이의 변화에 ​​따라하면 발생할 수 있습니다)을 git rebase이 일할 수있는 것 같아요.

$ git rebase be2c15 88ae59e 

및 후

아마도 당신은 당신이 원하는 것을 얻을 수있는 고정 일부 병합 충돌합니다. 이 작업을 수행 할 수있는 쉬운 방법이있을 수 있습니다 일부 삭제 된 파일을 복구하기를 원한다면

사용 git rebase --abort 다시


그러나을 되돌리려. 망할 놈의 문서에서

<paths> 또는 --patch이 주어진다
git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>…​ 

,

git checkout에 대한 자식 체크 아웃 하지 스위치 가지를 않습니다. 작업 트리의 이름이 지정된 경로를 색인 파일 또는 이름이 <tree-ish> (가장 자주 커밋)에서 업데이트합니다. 이 a 커밋의 당시로

그래서

$ git checkout a -- path-to-folder/or/file/ 

path-to-folder/or/file을 확인합니다.

당신은 충돌이나 자극의 기회를 피하기 위해 아주 쉽게 자식의 외부를 할 수
+0

그러나 체크 아웃은 인덱스를 설계된 커밋 오른쪽으로 이동해야합니까? 실은 # be2c15에 남아있는 커밋 # 88ae59e의 정확한 내용을 얻는 방법이 있는지 추측합니다.

그렇지 않으면 내가 가지고 :
1. 체크 아웃 # 88ae59e
복사합니다 임시 버전없는 폴더
3. 체크 아웃 # be2c15
4. 임시 폴더에 자신의 작업 트리를 교체에서 작업 트리
5. 커밋하기

저에게 git이 자동으로 명령을 내 보내지 않습니다. – user2572526

+0

내 편집이'git checkout - some-file'의 사용법을 좀 더 잘 설명하기를 바랍니다. – AnimiVulpis

+0

불행히도 checkout 명령이 실행될 때 작동하지 않습니다. git은 작업 트리에서 일부 작업을 수행합니다 (충돌을 어떻게 처리해야하는지 묻습니다) – user2572526

0

:

git checkout 88ae59e 
tar cf /tmp/tmp.tar --exclude=.git 
git checkout be2c15 
tar xf /tmp/tmp.tar ; rm /tmp/tmp.tar 
git add... ; git commit 
1

당신이 #88ae59e의 나무와 커밋 만들려한다고 가정은이 명령 시퀀스가 ​​트릭을 할해야 : 당신이 분리 된 머리 상태에 git reset --soft을 수행 할 경우 두 번째 git checkout를 통해 리셋 후 분기에 머리를 가리 키도록해야합니다 있도록

git checkout 88ae59e #checkout the tree that you want to commit 
#you should be in detached head state now 
git reset --soft master #switch HEAD to the intended parent commit 
#you should still be in detached head state now 
git checkout master  #reattach to your branch so it will see the following commit 
git commit ... 

, 당신은 분리 된 머리 상태를 떠나지 않을 것입니다.

+0

checkout 명령까지 모든 기능이 작동합니다. 그것은 브랜치를 다시 붙일뿐만 아니라 작업 트리의 파일을 병합하려고 시도합니다. – user2572526

+0

제 생각에'HEAD'가'master'와 동일한 커밋을 가리키는 지 확인해야합니다.'git show -s HEAD'와'git show -s master'를 사용합니다. 이 두 가지는 동일해야합니다. 'git checkout master'는 순간적으로 파일을 건드릴 필요가 없으므로 실패하지 않습니다. (두 번째'checkout '의 유일하고 의도 된 효과는'HEAD -> be2c15' 상태에서'HEAD -> master -> be2c15' 상태로 이동하여 다음'commit'이'master' 'HEAD '뿐만이 아니다.) – cmaster