커밋되지 않은 기존 작업을 Git의 새 지점으로 이동


3125

나는 새로운 기능에 대한 연구를 시작했으며 약간의 코딩을 한 후에이 기능이 자체 지점에 있어야한다고 결정했습니다.

커밋되지 않은 기존 변경 사항을 새 브랜치로 옮기고 현재 브랜치를 재설정하려면 어떻게해야합니까?

새 기능에 대한 기존 작업을 유지하면서 현재 지점을 재설정하고 싶습니다.


같은 흥미로운 주제 stackoverflow.com/q/556923/269514 ?
Gilberto

답변:


3640

다음을 사용하십시오.

git checkout -b <new-branch>

현재 지점을 그대로두고 새 지점을 생성 및 체크 아웃하고 모든 변경 사항을 유지합니다. 그런 다음 커밋 할 파일의 변경 사항을 준비 할 수 있습니다.

git add <files>

다음과 같이 새 지점에 커밋하십시오 .

git commit -m "<Brief description of this commit>"

작업 디렉토리의 변경 사항과 인덱스에서 준비된 변경 사항은 아직 어떤 브랜치에도 속하지 않습니다. 수정이 끝나는 지점이 변경됩니다.

원래 브랜치를 재설정 하지 않고 그대로 유지합니다. 마지막 커밋 <old-branch>은 여전히 ​​동일합니다. 그러므로 당신은 checkout -b다음 커밋합니다.


2020 업데이트 / 힘내 2.23

Git 2.23 switch은 과부하 된 사용법 checkout(브랜치 전환, 파일 복원, HEAD 분리 등)으로 인한 혼란을 없애기 위해 새로운 하위 명령을 추가합니다 .

이 버전의 Git부터는 위의 명령을 다음과 같이 바꾸십시오.

git switch -c <new-branch>

동작은 동일하며 변경되지 않습니다.


15
원래 브랜치를 재설정하기 전에 완료되지 않은 기능을 커밋해야합니까? 아니면 커밋에 관계없이 커밋되지 않은 파일이 보존됩니까?
Dane O'Connor

192
참고 : 작업 디렉토리의 변경 사항 및 색인에서 스테이징 된 변경 사항은 분기에 속하지 않습니다. git checkout -b <new branch>변경이 끝나는 위치 변경
Jakub Narębski

152
지점이 이미 있고 기존 지점으로 변경 사항을 이동하려면 stackoverflow.com/questions/556923/…을 확인하십시오.
Chirantan

14
새 브랜치를 원격 저장소로 푸시하려면 : stackoverflow.com/questions/2765421/…
Dewayne

10
@JDSmith : 커밋되지 않은 변경 사항 어떤 브랜치에도 속하지 않습니다 . 그들은 단지 작업 디렉토리에 git checkout ./ git reset --hard복구 할 수없는 것이다 제거
knittl

329

또는

  1. 임시 변경 사항에 현재 변경 사항을 저장하십시오.

    $ git stash

  2. 이 숨김을 기반으로 새 분기를 작성하고 새 분기로 전환하십시오.

    $ git stash branch <new-branch> stash@{0}

팁 : 숨김 키 입력을 줄이려면 Tab 키를 사용하십시오.


51
다른 지점이 이미 존재하면 결제를 통해 지점으로 전환하면됩니다 git stash apply.
Archonic

6
"도움말 : 숨김 키 입력을 줄이려면 탭 키 사용"팁을 이해하지 못합니다. 이름이 "stash @ {0}"이 아닙니까? 성공적으로 실행할 수 없습니다.
Herbert

7
이것이 허용되는 답변 stackoverflow.com/a/1394804/754997 보다 나은 이유는 무엇 입니까?
Chris 페이지

10
이것이 왜 더 나은지 이해가되지 않습니다git checkout -b <new branch name>
Noitidart

6
git add -A숨기지 않아도됩니다 .
vichle February

48

코딩하는 동안 메인 브랜치에서 커밋 을 수행했지만 이제 해당 커밋을 다른 브랜치로 이동하려면 다음과 같이하십시오.

  1. 커밋되지 않은 변경 사항을 모두 가져 와서 현재 기록을 새 브랜치에 복사하십시오.

    git checkout -b <new-feature-branch>
    
  2. 이제 원래 "지저분한"브랜치를 강제로 롤백하십시오 (전환하지 않고).

    git branch -f <previous-branch> <earlier-commit-id>
    

    예를 들면 다음과 같습니다.

    git branch -f master origin/master
    

    또는 4 번 커밋 한 경우 :

    git branch -f master HEAD~4
    

경고 : git branch -f master origin/master 것입니다 추적 정보 다시 그 지점에있다. 따라서master분기 이외의 다른 곳으로 푸시하도록 지점을구성한 경우origin/master해당 구성이 손실됩니다.

경고 : 분기 후 리베이스하면 여기 설명 된 위험이 있습니다 . 이를 피할 수있는 유일한 방법은 cherry-pick을 사용하여 새 기록을 만드는 것입니다. 이 링크 는 가장 안전한 방법을 설명 합니다 . 커밋되지 않은 변경 사항이 있으면git stash시작과git stash pop끝 부분에있을 수 있습니다.


6
이것은 op가 요청한 것과 약간 다른 질문에 대답합니다. 답변을 검색 할 때 Google에서 제공 한 위치이므로이 답변을 여기에 넣기로 결정했습니다. 이 상황을 다루는 실제 질문 은 여기에 있습니다 .
joeytwiddle

26

일반적인 시나리오는 다음과 같습니다. 새 기능에 대한 새 분기를 만드는 것을 잊었으며 이전 기능 분기에서 모든 작업을 수행하고있었습니다. 나는 모든 "오래된"작업을 마스터 브랜치에 맡기고 새 브랜치가 "마스터"에서 성장하기를 원합니다. 나는 새로운 일을 한 번도하지 않았습니다. 분기 구조는 다음과 같습니다. "master"-> "Old_feature"

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply

18

커밋하면 단일 커밋 ID를 체리 픽으로 선택할 수도 있습니다. 나는 마스터에서 일을 시작할 때 종종이 작업을 수행 한 다음 내 원산지 /에 도달하기 전에 로컬 지점을 만들고 싶습니다.

git cherry-pick <commitID>

여기 에 설명 된 것처럼 체리 피킹으로 할 수있는 많은 것이 있지만 이것은 유스 케이스 일 수 있습니다.


2
부분 변경 사항을 새 브랜치로 옮기는 더 좋은 솔루션 ... 지금 원하는 것을 커밋하고 다른 모든 변경 사항을 숨기고 브랜치하려는 브랜치를 확인하고 새 브랜치에 커밋하는 체리 픽을 선택하십시오. 원래 브랜치에 커밋을 강제로 재설정 한 다음 숨김 팝을 수행하고 할렐루야를 추가, 커밋 및 노래합니다.
메러디스

1
@Meredith, 하하, 나중에 그런 것. 변경 사항을 미리 계획하지 않으면 ... 누구나;)
password

1

이것은 GIT 도구를 사용하는 모든 사람에게 도움이 될 수 있습니다

명령

스위치 브랜치-변경 사항을 새 브랜치로 이동합니다. 그런 다음 변경 사항을 커밋 할 수 있습니다.

 $ git checkout -b <new-branch>

거북이 GIT

저장소를 마우스 오른쪽 버튼으로 클릭하고 TortoiseGit-> 스위치 / 체크 아웃을 사용하십시오.

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

소스 트리

"체크 아웃"버튼을 사용하여 분기를 전환하십시오. 지점을 클릭하면 상단에 "체크 아웃"버튼이 표시됩니다. 현재 지점의 변경 사항이 자동으로 적용됩니다. 그런 다음 커밋 할 수 있습니다.

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


0

@Robin 답변을 사용 하고 내가 한 모든 것을 나열했습니다.

git status                               <-- review/list uncommitted changes
git stash                                <-- stash uncommitted changes
git stash branch <new-branch> stash@{1}  <-- create a branch from stash
git add .                                <-- add local changes
git status                               <-- review the status; ready to commit
git commit -m "local changes ..."        <-- commit the changes
git branch --list                        <-- see list of branches incl the one created above
git status                               <-- nothing to commit, working tree (new-branch) is clean
git checkout <old-branch>                <-- switch back

! 저장소에 둘 이상의 숨김이있는 경우 새 분기에 적용 할 저장소를 확인하십시오.

git stash list  
  stash@{0}: WIP on ...  
  stash@{1}: WIP on ...

개별 숨김을 검사하여

git stash show stash@{1}

또는 모든 숨김을 한 번에 검사하십시오.

git stash list -p

0

실제로 GitHub Desktop으로이 작업을 수행하는 정말 쉬운 방법이 있습니다.

GitHub Desktop에서 새 브랜치로 전환하기 만하면 현재 브랜치에 변경 사항을 그대로 두거나 (지속될) 새 브랜치로 변경 사항을 가져 오라는 메시지가 표시됩니다. 두 번째 옵션을 선택하면 새 지점으로 변경 사항이 적용됩니다. 그런 다음 평소처럼 커밋 할 수 있습니다.

GitHub 데스크탑

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