2013-08-19 4 views
1

여기 내 슬픈 이야기가있다git pull을 실행 취소하면 역사에 미치는 영향이 있습니다.

오늘 나는 다른 저장소에서 나의 것을 끌어 당기는 실수를했다. 리포지토리 A에서 작업 중이며 리포지토리 B의 내용을 A로 가져 왔습니다. 리포지토리의 일부 파일을 원했기 때문에이 작업을 수행했습니다.

그 후 나는 내 저장소를 원격지로 푸시했다.

두 저장소가 모두 다르기 때문에 제 문제는 제 코드가 아닙니다. 그러나 문제는 역사입니다.

이제 일반인이 볼 수있는 원격 저장소에는 로그에 내 커밋과 혼합 된 저장소 B의 모든 커밋 기록이 있습니다.

기록 로그에서 해당 커밋을 제거하려면 어떻게해야합니까?

내 저장소를 어제와 같은 상태로 좀 더 재설정 할 수있는 방법이 있습니까? 역사상 리포지토리 B의 커밋이 사라지게할까요?

Merge, Reset Re-base 및 Cherry-pick을 재설정하려고 시도했지만 어느 경우에도 기록이 삭제되지 않았습니다. 시간

답변

0

감사합니다. 나는 내 문제를 해결했다. 나는 다른 기사 및 질문에 대한 참조로 그것을 해결할 수있었습니다.

나는 여기서 내가 나의 투쟁을 통해 배운 것들과 함께 대답을 설명 할 것이다. 선택적으로 가장 좋은 방법은 주위에 흩어져있는 역사에서 커밋을 제거하기 위해, 우선

question에 대한 답변에서 찾을 수 있습니다 Charles Bailey에 의해

구체적으로 대답. 이 답변에 가장 가까운 것은 Stuart입니다.

참고 : 커밋을 되돌릴 수는 기록에서 제거되지 않습니다.

내 특정 상황에 대해서는 내가 원하지 않는 모든 커밋에 대해 이전 방법을 따라야한다고 생각했지만 실제로는 대답이 더 간단했습니다.

제 상황에서는 저장소 B를 가져 오기 전에 git를 커밋해야만합니다. 모든 브랜치에 대해 완료해야합니다. 이 작업이 끝나면 B의 모든 원하지 않는 커밋이 내 역사에서 사라졌습니다.

재미있는 또 다른 언급은 git Cherry-Pick 또는 Revert를 많은 커밋에 사용하는 것이 온라인 기사에서 들리는 것처럼 간단하지 않다는 것입니다.

감사합니다.

1

당신이 지점의 모든 어제 어디 있었는지, 당신이 통과하고 원래 위치로의 각을 재설정 할 수 있습니다 알고있는 경우에 대한

감사합니다. 관련 부서별 :

git checkout <branch name> 
git reset --hard <old hash> 
git push -f <repository A> <branch name> 

그런 다음 원하지 않는 새 분기를 삭제할 수 있습니다. 각 해당 지점에 대해 :

git branch -D <branch name> 
git push <repository A> :<branch name> 

다른 사람이 저장소 A에서 가져온 것일 수도있는 매우 과장입니다. 이 솔루션은 부분적으로는 기술적 인 것은 물론 사회적인 것일 수도 있습니다 - 저장소를 사용하는 다른 사람들은 무슨 일이 일어나고 있는지 알려야 할 필요가 있으므로 로컬 클론을 수정할 수 있습니다.

+0

문제는 Repo B의 커밋이 내 커밋보다 오래되었고 내 커밋과 함께 내 기록에 나타납니다. –

0

git reflog 당신이보고 싶은 곳입니다. 가비지 수집을하지 않는 한 git reset --hard [email protected]{x}을 수행해야합니다. x는 로컬 브랜치의 모든 항목을 다시 설정하려는 기록의 특정 지점입니다.

즉시 다른 사람이 이미 원격에서

이 불행한 문제가 뽑아 경우 것을 ... 나는 다시 당신이 그것을 원하는 위치로 공개 REPO를 넣어 git push --force을 할 거라고, 그렇게으로 그들의 역사는 엉망이 될 것입니다.

+1

명시 적 명령이 없으면 git는 90 일 동안의 기록을 reflogs에 유지하고 그곳에서 도달 할 수있는 커밋을 제거하지 않습니다. – jthill