2013-07-16 3 views
1

새 프로젝트에서 git를 처음 사용하는 팀에서는 에 직접 커밋을 시작했습니다. 실수로 우체통을 두 번째로 만들었습니다.중앙 게시판으로 푸시되고 전체 팀에서 철수했습니다.업스트림으로 푸시 된 마스터에 대한 커밋을 삭제합니다.

우리의 실수를 깨닫고, 우리는 다음 떨어져 기능 지점를 생성하여 나쁜을 커밋하기 전에 커밋합니다. 우리 팀은 이제 지부에서 행복하게 일하고 있습니다.

우리는 이제 나쁜 커밋를 다시 도입하지 않고, 우리의 마스터 지점이 기능 지점에서 정확한 코드를 포함합니다.

merge theirs 옵션이 최신 버전의 git에서 제거 된 것을 볼 수 있습니다. 그래서 최선의 방법은 을 버리고 악의를 버리고을 만들고 우리의 주인이 지사과 똑같이 보이게 만드시겠습니까?

  • Merge?
  • 재설정?
  • Rebase?

답변

6

당신은 HEAD (이전)으로 되돌아 가고 싶은 경우에 당신이 할 수 있습니다

git reset --hard [email protected]{1} 

참고 : 작업 디렉토리 변경 사항은 손실됩니다.

당신이뿐만 아니라 [자식 명령]을 확인할 수 있습니다

: http://git-scm.com/book/en/Git-Basics-Undoing-Things

당신이 주요 지점에

git checkout master_branch 

당신의 기능 분기를 병합 할 수 있습니다 나쁜 커밋하지 않고 안정적인 버전으로 이동하면 당신은 다음

git pull origin master 

마스터 분기를 가져 오려면 위의 명령으로 마스터로 전환

git merge feature_branch 

그러면 기능 분기가 변경된 마스터가 업데이트됩니다. 이제 두 가지가 동일해질 것입니다.

+0

안녕하세요. 방금 시도했지만 작동하지 않았다. 우리는 master_branch에서 시작하여'reset -hard'를합니다. 이것은 origin/master 뒤에 master 브랜치를 뒤로 이동시킵니다. 'git checkout master_branch'는 이미 master_branch에 있기 때문에 아무 것도하지 않습니다. 'git pull origin master'는'reset -hard'를 취소하고 잘못된 커밋을 다시 도입합니다. 그런 다음 병합 후에 master_branch에 여전히 잘못된 커밋이 포함됩니다. 어떤 아이디어? – KevSheedy

2

원하는 것을 얻는 데에는 최소한 두 가지 방법이 있으며, 이로 인해 다른 기록이 생성 될 수 있습니다. git 데이터 구조와 배관을 얼마나 편하게 사용하는지에 따라 선택할 수 있습니다.

먼저 두 부모와의 병합 커밋을 만듭니다. 현재 마스터와 기능 분기의 팁입니다. 이 커밋의 내용은 상위 분기의 팁에있는 내용과 정확히 동일합니다. 이것을 얻는 가장 쉬운 방법은 병합 (git merge --no-commit)을 실행하고 그 결과를 커밋하기 전에 지형지 물의 내용 (git reset FEATURE_BRANCH, 나는 생각한다)으로 색인의 내용을 대체하는 것입니다.

두 번째로, 기능 분기에서 수동으로 병합하기 전에 커밋 된 모든 커밋을 취소하는 커밋을 마스터에 추가합니다. git revert이 도움이 될 수도 있고, 아니면 git checkout LAST_GOOD_COMMIT을 사용하여 코드를 마지막으로 좋은 커밋 시점의 상태로 되돌릴 수 있으며이를 마스터 팁으로 커밋 할 수 있습니다. 마지막으로 평소처럼 병합 (또는 rebase)하십시오.

나는 종종 나무의 현재 구조와 내가 원하는 구조를 그려내는 데 도움이된다는 것을 안다. 그런 다음 하나에서 다른 하나에 이르기 위해 필요한 자식 동작을 찾는다. 사본을 작성하는 것을 잊지 마십시오. 그리고 어떤 경우에도 reflog는 모든 기록을 저장합니다 :).