2016-09-16 2 views
3

실수로 커다란 파일로 커밋을 푸시 한 다음 되돌립니다. 하지만이 브랜치를 당기는 사람은이 파일을 히스토리에서 가져 오게되므로이 두 커밋을 제거하거나 스쿼시하려고 결정합니다. 그러나 일부 지점이 병합되었습니다. "git rebase -i"를 만드는 방법을 모릅니다. 구조를 유지하십시오.git - 병합 된 분기에서 커밋을 제거합니다.

H - new commits 
| 
G - merge 
| \ 
| F - commits on another branch 
| | 
E | - some other commits 
| | 
D | - corrected B 
| | 
C | - revert B 
| | 
B | - huge files 
|/
A - early commit 

내가이 다음에 변경할 수 있습니다처럼

역사는 지금 보이는?

h - new commits 
| 
g - merge 
| \ 
| F - commits on another branch 
| | 
e | - some other commits 
| | 
d | - corrected B 
|/
A - early commit 
+0

다른 당사자가 다시 병합 할 가능성이 있습니까? –

+0

@TimBiegeleisen 예.하지만 구조를 유지해야합니다. – Xiao

+0

대화 형 리베이스 (rebase) 및'거대한 파일'과'되돌리기 B'. 그런 다음 병합을 다시 실행하십시오. 마지막으로, 체리 - 그 이후에 오는 새로운 커밋을 선택하십시오. –

답변

2

수 있지만하지 않아야합니다.

히스토리를 다시 쓰고 서버에 이미 푸시 된 기록을 바꿔야합니다. (강제 푸시가 필요하며 대부분 사용자에게 소리 치며 나타납니다).

하지만 실제로 다음을 원하면 git filter-branch을 사용하고 싶습니다. this SO answer과 매우 유사합니다.

있습니다
git filter-branch --commit-filter ' 
    if [ "$GIT_COMMIT" = "<your commit to remove here>" ] 
    then 
     skip_commit "[email protected]"; 
    else 
     git commit-tree "[email protected]"; 
    fi' HEAD 

몇 가지 더 예 here : 그래서 당신은 같은 것을 할 것입니다.

+0

위대한, 이것이 내가 찾고있는 것입니다. 그것은 내부의 repo이지 다른 사람이 강요당하는 문제는 아닙니다. – Xiao

0

아니요.

각 커밋의 해시에는 색인에있는 모든 파일의 해시 된 콘텐츠뿐만 아니라 커밋의 부모의 해시도 포함됩니다.

"수정 된 B"는 현재와 다른 상위를가집니다. 그건 해시를 바꿀거야.

이 문제를 해결할 수는 있지만, 수정 사항을 강제로 누르지 않아도 모든 사람이 강제로 당길 수는 없습니다.

다음과 같은 과정이 될 것입니다이 문제를 해결하는 유일한 방법 : 분기가 갈래 전에

git checkout A 

체크 아웃은 부모가 커밋합니다. 그런 다음 두 가지 작업 브랜치를 만듭니다.

git checkout -b corrected-mainline 
git checkout -b corrected-fork 

이제 수정 된 분기 분기가 있습니다. 이제이 지점에서 git cherry-pick까지 모든 커밋을 F까지 커밋하고 거대한 파일로 커밋을 건너 뛰고 되돌릴 수 있어야합니다. 이러한 커밋 중 하나라도 병합되면 동일한 병합을 수행하십시오.

지금, 이제, 마지막까지 본선 분기에 git cherry-pick 모든 커밋의 G 병합하기 전에 커밋 corrected-mainline 지점

git checkout corrected-mainline 

에 동일한 작업을 수행. 그런 다음 corrected-fork 분기와 병합하십시오. 이제 수정 된 G 병합 커밋입니다.

다이어그램에서 처음에 G 위에 있던 모든 커밋을 체리 피킹하여 원래 분기의 마지막 커밋으로 마무리합니다.

이 시점에서 작업 분기의 내용은 원래 분기의 내용과 동일해야합니다. 이것이 사실인지 확인하십시오.

그런 다음 원래 분기를 삭제하고 작업 분기의 이름을 해당 이름으로 변경합니다. 또는 git reset --hard을 사용하여 원래 분기를 수정 된 작업 분기로 다시 설정하십시오.

그런 다음 수정 된 분기를 밀어 넣으려면 git push --force을 수행하십시오. 물론 지점을 잡아 당기는 사람은 강제로 당길 것입니다.

+0

'git filter-branch'를 사용 중입니다. 귀하의 답변에 감사드립니다. – Xiao

관련 문제