힘내 : 마스터의 단계적 / 커밋되지 않은 변경 사항으로 분기 만들기


991

컨텍스트 : 간단한 기능을 추가하는 마스터 작업 중입니다. 몇 분 후 나는 그것이 그렇게 간단하지 않다는 것을 깨닫고 새로운 지사로 일하는 것이 더 좋았을 것입니다.

이것은 항상 나에게 발생하며 다른 지점으로 전환하고 커밋되지 않은 모든 변경 사항을 마스터 지점을 깨끗하게 유지하는 방법을 모릅니다. 나는 git stash && git stash branch new_branch단순히 그것을 달성 할 것이라고 생각 했지만 이것이 내가 얻는 것입니다.

~/test $ git status
# On branch master
nothing to commit (working directory clean)

~/test $ echo "hello!" > testing 

~/test $ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

~/test $ git stash
Saved working directory and index state WIP on master: 4402b8c testing
HEAD is now at 4402b8c testing

~/test $ git status
# On branch master
nothing to commit (working directory clean)

~/test $ git stash branch new_branch
Switched to a new branch 'new_branch'
# On branch new_branch
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b)

~/test $ git s
# On branch new_branch
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

~/test $ git checkout master
M   testing
Switched to branch 'master'

~/test $ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

이것을 달성하는 방법이 있는지 아십니까?


1
문제에 대한 간단한 해결책이 있지만 원하는 결과와 다른 결과를 지정할 수 있습니까?
Gauthier

2
위 또는 아래의 답변을 수행하면 커밋되지 않은 변경 사항이 마스터 및 새 지점 모두에 있습니다. 나는 주위에 떠있는 이러한 변경을하지 않고 다른 일에 마스터 작업을 체크 아웃 할 수 있습니다 만 새로운 분기를 원하는
knoopx

1
내 편집 답변을 참조하십시오. 클린 마스터를 체크 아웃하려면 새 브랜치에서 로컬 변경 사항을 커밋해야합니다. 로컬 변경 사항은 현재 HEAD와 디스크의 파일 간의 차이점입니다. 로컬 파일에 대한 이러한 변경 사항은 버전이 지정되지 않으므로 나중에 검색하려는 경우 git에게 어딘가에 저장하도록 지시해야합니다.
Gauthier

답변:


1207

숨길 필요가 없습니다.

git checkout -b new_branch_name

로컬 변경 사항을 건드리지 마십시오. 현재 HEAD에서 분기를 작성하고 HEAD를 설정합니다. 그래서 당신이 원하는 것 같아요.

--- 체크 아웃 마스터의 결과를 설명하기 위해 편집 ---

checkout master변경 사항을 버리지 않기 때문에 혼란 스럽 습니까?

변경 사항은 로컬이기 때문에 git은 너무 쉽게 잃기를 원하지 않습니다. 분기를 변경하면 git은 로컬 변경 사항을 덮어 쓰지 않습니다. 당신의 결과는 다음 checkout master과 같습니다

M   testing

즉, 작업 파일이 깨끗하지 않습니다. git은 HEAD를 변경했지만 로컬 파일을 덮어 쓰지 않았습니다. 당신이 켜져 있지만 마지막 상태가 여전히 로컬 변경 사항을 표시하는 이유입니다 master.

로컬 변경 사항을 실제로 삭제하려면을 사용하여 강제로 체크 아웃해야 -f합니다.

git checkout master -f

변경 사항이 커밋되지 않았으므로 잃게됩니다.

지점으로 돌아가서 변경 사항을 커밋 한 다음 마스터를 다시 체크 아웃하십시오.

git checkout new_branch
git commit -a -m"edited"
git checkout master
git status

당신은 가야 M최초의 체크 아웃 후 메시지를,하지만하지 더 이상 후 checkout master, 그리고 git status더 수정 된 파일을 보여주지해야한다.

--- 작업 디렉토리 (로컬 파일)에 대한 혼란을 없애기 위해 편집하십시오 ---

첫 번째 의견에 대한 답변으로, 로컬 변경 사항은 ... 로컬입니다. Git은 자동으로 저장하지 않으므로 나중에 저장하도록 지시해야합니다. 변경하고 명시 적으로 커밋하거나 숨기지 않으면 git은 버전을 변경하지 않습니다. HEAD ( checkout master) 를 변경하면 저장되지 않은 이후 로컬 변경 사항을 덮어 쓰지 않습니다.


32
여기서 혼란스러운 점은 git의 매뉴얼 페이지에 git checkout"작업 트리의 파일을 인덱스 또는 지정된 트리의 버전과 일치하도록 업데이트합니다."라는 내용입니다. 즉 파일 시스템의 변경 사항이 될 것입니다 가정 사라졌다 후. 그들을 다시 얻을 수있는 기회가 없습니다. 당신이 그들이하지 않을 것이라고하더라도, 이것은 여전히 ​​매우 나쁜 느낌을 남깁니다. 난이 신뢰하지 않는 전혀 . 문서가 실제로 잘못되었거나 git의 기본 동작이 실제로 위험합니다. 이 경우 변경 사항을 잃고 싶지 않다는 것을 감지하기 위해 "자동"휴리스틱을 신뢰하지 않아도됩니다.
Evi1M4chine

16
로컬 변경 사항을 덮어 쓰는 커밋을 체크 아웃하는 경우 (현재 커밋과 대상 커밋 사이의 기록이 로컬로 수정 된 파일에 닿는 경우) git은 거부합니다. checkout로컬 변경 사항과 충돌하지 않는 경우에만 체크 아웃이 작동하고 로컬 변경 사항은 그대로 둡니다. 나는 나쁜 느낌을 이해하지만 매뉴얼 페이지는 "작업 트리에서 수정되지 않은 파일을 업데이트합니다"라고 말해야합니다. 반면 Git은 로컬 변경 사항을 잃기 쉽도록 만듭니다. git checkout지역 변경 만 허용하거나 충돌이있을 경우 거부합니다.
Gauthier

1
글쎄, 로컬 변경 사항을 적용하지 않고 다른 지점에 어떻게 체크 아웃합니까?
아렉 쿠스

5
@ 알렉스 git checkout <other_branch> -f. 경고없이 로컬 변경 사항을 잃게됩니다.
Gauthier

2
@ Evi1M4chine 첫 번째입니다. 설명서 정말 나쁩니다.
Qwertie

62

시험:

git stash
git checkout -b new-branch
git stash apply

6
이것은 'git checkout -b new-branch'자체를 수행하는 것과 다른가요?
Adrian Mouat

답이 원래 쓰여졌을 때라고 생각하지는 않지만 잘못 될 수 있습니다. 불행히도 작업 환경으로 인해 지난 몇 년 동안 perforce를 사용해 왔으므로 지금은 정확성을 증명할 수 없습니다.
그랜트 림 버그 (Grant Limberg)

6
또는 마지막 두 단계 대신 : git stash branch new-branch
rethab

1
git stash는 더 이상 필요하지 않습니다
kory

당신이 모든 것을 넣기를 원하는 기존의 브랜치를 가지고 있다면, 숨김은 나에게 의미가 있습니다. 자식 체크 아웃 <기존 브랜치>; 자식 숨김 적용;
Paolof76

24

당신이 할 수있는 두 가지 :

git checkout -b sillyname
git commit -am "silly message"
git checkout - 

또는

git stash -u
git branch sillyname stash@{0}

( git checkout -<-대시는 이전 분기의 바로 가기입니다)

( git stash -u<- -u스테이지되지 않은 변경도 필요함을 의미)


7

GitHub Windows 클라이언트를 사용하고 있고 (있는 그대로) 새 브랜치로 이동하려는 커밋되지 않은 변경이있는 경우 GitHub 클라이언트를 통해 "새 브랜트를 걸기"만하면됩니다. 새로 작성된 분기로 전환되고 변경 사항이 보존됩니다.

여기에 이미지 설명을 입력하십시오


새 분기를 만들기 전에 변경 사항을 숨겨서 새 분기를 유지하지 않도록합니다 (Mac OS의 경우 버전 223)
Fernando Gallego

2

현재 분기에서 커밋되지 않은 현재 변경 사항을 새 분기로 이동하려면 다음 명령을 사용하여 새 분기를 만들고 커밋되지 않은 변경 사항을 자동으로 복사하십시오.

git checkout -b branch_name

그러면 현재 브랜치에서 새 브랜치를 생성하고 (마스터로 가정) 커밋되지 않은 변경 사항을 복사하고 새 브랜치로 전환합니다.

새로운 지점에 변경 사항을 적용하십시오.

git commit -m "First commit"

새 분기가 만들어 지므로 원격으로 푸시하기 전에 업스트림을 설정해야합니다. 아래 명령을 사용하여 업스트림을 설정하고 원격으로 푸시하십시오.

git push --set-upstream origin feature/feature/NEWBRANCH

이 명령을 누르면 원격에서 새 분기가 생성되고 새 로컬 분기가 원격으로 푸시됩니다.

이제 커밋되지 않은 변경 사항을 마스터 브랜치에서 버리고 싶다면 다음을 사용하십시오.

git checkout master -f

체크 아웃시 커밋되지 않은 로컬 변경 사항이 모두 삭제됩니다.


이 답변은 허용되는 답변과 어떻게 다릅니 까?
kometen

허용되는 답변과 일부 겹치기는하지만 간단한 단계별 가이드를 제공하며 새 분기를 원격으로 푸시하는 데 필요한 작업도 포함됩니다. 간단하고 명확하며 유용합니다.
Kjartan

이 답변은 분명하고 많은 도움이되었습니다.
Vadim

0

커밋되지 않은 변경 사항이있는 경우 Windows 용 최신 GitHub 클라이언트 에서 새 브랜치를 작성하도록 선택하십시오. 이 정확한 시나리오를 처리하는 방법을 묻습니다.

여기에 이미지 설명을 입력하십시오

단순히 분기를 전환하는 경우에도 마찬가지입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.