2010-01-08 4 views
15

여기 상황이 있습니다. 나는 master 지점에서 일하고 있습니다. 나는 file1을 만들고 커밋한다. 나는 file2를 만들고 커밋한다. 오케이. 언젠가 file2를 사용하고 싶지만 master 브랜치에 넣어야하는 것은 아닙니다. 그래서 파일 2를 잃지 않아야합니다.git : 병합시 모든 로컬 변경 사항을 어떻게 덮어 쓰시겠습니까?

git checkout head~1 
git branch new-branch 
git checkout new-branch 

그래서 개발을 계속할 수 있습니다. file3을 new-branch에 추가합니다. 주의를 기울 였다면 "file1"과 "file2"가 포함 된 master 브랜치와 "file1"과 "file3"이 포함 된 new-branch 브랜치가 있습니다.

이제 master 브랜치에 적용한 변경 사항을 가져와야 할 때입니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 나는 브랜치의 헤드가 new-branch에 나타나는 것처럼 파일을 가리 키길 바랄 뿐이지 만, 사용하고자하는 경우에 재설정을 수행하여 file2에서 수행 한 작업을 잃고 싶지는 않습니다.

이것은 단순화 된 것입니다. 단 3 개의 파일 대신 수십 줄의 코드가 여러 커밋으로 변경되었습니다. 필자는 솔루션이 파일 별 병합/체크 아웃을하지 않기를 바랄뿐입니다. 왜냐하면 그것이 큰 고통이 될 것이기 때문입니다.

아이디어가 있으십니까? 당신이 무엇을해야

+0

당신은 "이게 내가 필요한 것 같아."라고 말했지만, 대답에서 지적한대로 지점을 바꾸려고 했습니까? – VonC

+0

나는했다. Randal의 대답은 내 솔루션에 더 가깝습니다. 열쇠는'git reset -hard HEAD ~ 1'입니다. 하나의 명령으로 커밋 문자열을 재설정 할 수 있다는 것을 알지 못했습니다. 내가해야 할 일은 현재의 master 브랜치에서 분기 한 다음 다시 원래대로 돌아가는 것입니다. – kubi

답변

3

저는 master 브랜치에서 작업하고 있습니다. I file1을 작성하고 커밋하십시오.

date >file1 
git add file1 
git commit -m 'added file1' 

나는 파일 2를 생성하고 커밋합니다.

date >file2 
git add file2 
git commit -m 'added file2' 

으악. 언젠가는 이라는 file2를 사용하고 싶지만, 마스터 브랜치 에 넣어야 할 것은 없습니다.

아주 간단합니다.

git checkout -b savingfile2 

이것은 파일 2가 savingfile2의 커밋 변경하게됩니다 : 당신이 곳에서 새로운 지점을 확인합니다. 이제 돌아가서이 시점에서 마스터

git checkout master 
git reset --hard HEAD~1 

에 한 걸음 긴장을 풀고, 마스터에 이르기까지의 커밋은 FILE1, 의 추가를 반영하고 추가는 것과 파일 2의 추가됩니다 마스터와 savingfile2 사이에 커밋 .

date >file3 
git add file3 
git commit -m 'adding file3' 
date >file4 
git add file4 
git commit -m 'adding file4' 

을 그리고 지금 우리는 마침내 파일 2를 원하는 :

당신이 마스터에 더 변경 한 다음 다시 결국 파일 2 가져하려면 새 주인에 그 곁가지를 리베이스 할 것입니다 :

git checkout savingfile2 
git rebase master # might need to fix conflicts here 
git checkout master 
git merge savingfile2 # will be a fast-forward 
git branch -d savingfile2 # no need any more 

그렇게해야합니다.

+0

"git merge savefile2 # 빨리 감기"<- -'-ff-only'를 추가하면 어떨까요? – weakish

+0

@weakish - 그 옵션은 대답보다 새로운 것입니다. :) –

1

는 파일 2를 커밋 당신의 실수를 발견 할 때 했어야 것입니다 : (가) (대신에 새로운 지점을 만드는) 커밋 취소 :

git checkout master 
git reset HEAD^ 

이 잎 파일 2의 비 추적하고 무사히 가능 수정되지 않은 수정.

:

git stash save "modifications that should not be in the master branch" 

보관 한이 masternew-branch에 지점을 할 수 있도록 로컬 변경, 제거됩니다 : 그럼 당신은 경우에 미트되지 않은 수정하면 나중에 사용하려는 stash (ED) (이)한다

git merge new-branch 

여기에 목표는 master의 조상을 new-branch으로 만드는 두 분기 간의 차이를 제거하는 것이 었습니다. 이 방법은 실제 병합을 수행 할 필요가 없으며 마지막 명령은 master 브랜치 (로컬 변경이없는 경우)입니다.

+0

내가 알아 차리기 전에 master 브랜치에 여러 개의 커밋을 만든 경우 어떻게됩니까? 'git reset'은 HEAD를 되감기 만하고, 부적절한 커밋을 이동시키지 않을 것입니다, 맞습니까? – kubi

+0

커밋 히스토리 ('git reset'과 반대)에서 임의의 커밋을 삭제할 수 있습니다 (대화 형). –

1

Tomi Kyöstilä으로 설명 된 optimal workflow을 따르지 않았으므로 아직 아무것도 게시 (푸시)하지 않았으므로 두 가지를 전환하지 않으시겠습니까?

$ git checkout master    #start from master 
$ git branch tmp     # tmp points on master HEAD 
$ git checkout new-branch   # switch to new-branch 
$ git branch -f master new_branch # master points at new-branch HEAD 
$ git checkout tmp     # switch back to *former* master branch 
$ git branch -f new_branch tmp  # new-branch points at former master HEAD 
$ git checkout master    # go to new master 
$ git branch -D tmp    # remove tmp pointer 

...하면됩니다 :

masternew-branch은 그냥 약간의 SHA1에 대한 포인터 (제공되는 모든 최선을 다하고 있습니다).
(면책 조항 : 아직 테스트 때문에주의를하지;))

참조 :

+0

이것은 내가 필요한 것처럼 보입니다. 감사! – kubi

관련 문제