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

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

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

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



답변

다음을 사용하십시오.

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>

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


답변

또는

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

    $ git stash

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

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

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


답변

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

  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끝 부분에있을 수 있습니다.


답변

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

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


답변

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

git cherry-pick <commitID>

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


답변

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

명령

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

 $ git checkout -b <new-branch>

거북이 GIT

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

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

소스 트리

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

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


답변

@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