programing

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

megabox 2023. 4. 9. 21:19
반응형

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

새로운 기능에 대한 작업을 시작하고 잠시 코딩한 후 이 기능은 자체 브랜치에 있어야 한다고 판단했습니다.

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

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

업데이트 2020 / Git 2.23

Git 2.23은 (브런치 전환, 파일 복원, HEAD 분리 등)의 과부하 사용으로 인한 혼란을 해소하기 위해 새로운 서브 명령어를 추가합니다.

이 버전의 Git부터는 checkout 명령어를 다음과 같이 바꿉니다.

git switch -c <new-branch>

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


업데이트 2020 이전 / Git 2.23

다음을 사용합니다.

git checkout -b <new-branch>

현재 브랜치를 그대로 두고 새 브랜치를 만들고 체크 아웃하며 모든 변경 사항을 유지합니다.그런 다음 커밋할 파일의 변경 사항을 준비할 수 있습니다.

git add <files>

새로운 브랜치에의 커밋은, 다음과 같습니다.

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

작업 디렉터리의 변경 사항 및 인덱스에서 스테이징된 변경 사항은 아직 어떤 분기에도 속하지 않습니다.이것에 의해, 이러한 수정이 종료하는 브랜치가 변경됩니다.

원래 브랜치를 리셋하지 않으면 그대로 유지됩니다.에 대한 마지막 커밋<old-branch>여전히 똑같을 거예요.그러므로 너는checkout -b그리고 나서 커밋합니다.

대체 방법:

  1. 현재 변경 내용을 임시 보관함에 저장합니다.

    $ git stash

  2. 이 스택을 기반으로 새 분기를 만들고 새 분기로 전환합니다.

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

힌트: 탭 키를 사용하여 저장 이름 입력을 줄입니다.

코드화하는 동안 메인브런치에서 커밋을 하고 있었는데, 이러한 커밋을 다른 브랜치로 이동시키고 싶은 경우는, 다음과 같이 간단하게 실시할 수 있습니다.

  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그 설정은 없어집니다.

경고:분기 후에 기본을 재설정하면 일부 커밋이 손실될 위험이 있습니다.이것에 대해서는, 여기서 설명합니다.그것을 피할 수 있는 유일한 방법은 체리픽을 이용해 새로운 역사를 만드는 것이다.이 링크는 편리하지 않지만 가장 안전한 오류 방지 방법을 설명합니다. (커밋되지 않은 변경 사항이 있는 경우,git stashgit stash pop( 막た )

일반적인 시나리오는 다음과 같습니다.새로운 기능의 새로운 브랜치를 작성하는 것을 잊어버리고, 낡은 피처 브랜치에서 모든 작업을 하고 있었습니다.저는 "오래된" 작업을 모두 마스터 브랜치에 맡겼으며, 새로운 브랜치를 마스터에서 성장시키고 싶습니다.나는 새 일에 대해 단 한 번도 약속하지 않았다.브랜치 구조는 다음과 같습니다.「 master 」 > 「 Old _ feature 」

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

커밋할 경우 단일 커밋 ID를 선택할 수도 있습니다.마스터에서 작업을 시작할 때 이 작업을 자주 수행하며, 그 후 로컬 지사를 만든 후 내 오리진/으로 푸시하고 싶습니다.

git cherry-pick <commitID>

체리픽으로 할 수 있는 것은 여기에 기재되어 있는 바와 같이 많이 있습니다만, 이것은 당신에게 있어서 사용 예라고 할 수 있습니다.

옵션 1(기존 브런치 포함)

git stash (from main/any-branch)
git checkout your-existing-branch
git stash apply 

옵션 2(새 브랜치 생성)

git switch -c your-new-branch

Visual Studio Community 2022(및 이전 버전)를 사용하는 사용자의 경우 변경 사항을 커밋하지 않고 새 분기를 만들면 다음과 같은 대화 상자가 표시됩니다.

여기에 이미지 설명 입력

번째 옵션 '변경사항 가져오기 [new-branch-name]'를 선택하고 체크아웃 계속을 클릭합니다.새 분기가 생성되고 거기서 변경을 커밋할 수 있습니다.

GitHub Desktop을 사용하여 이 작업을 수행할 수 있는 매우 쉬운 방법이 있습니다. 이전에는 기능이 없었던 것 같습니다.

GitHub Desktop의 새로운 브랜치로 전환하기만 하면 변경 내용을 현재 브랜치에 남겨두거나(스태시되는 브랜치), 변경 내용을 새로운 브랜치로 가져오라는 프롬프트가 표시됩니다.두 번째 옵션을 선택하면 새 브랜치에 변경 내용을 가져올 수 있습니다.그런 다음 평상시와 같이 커밋할 수 있습니다.

GitHub 데스크톱

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

명령어

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

 $ git checkout -b <new-branch>

터틀GIT부문

저장소를 오른쪽 클릭하여 TortoiseGit-> 전환/체크아웃을 사용합니다.

여기에 이미지 설명 입력 여기에 이미지 설명 입력

소스 트리

"체크아웃" 버튼을 사용하여 분기를 전환합니다.분기를 클릭하면 상단에 체크아웃 버튼이 표시됩니다.현재 분기의 변경 내용이 자동으로 적용됩니다.그럼 넌 그들을 커밋할 수 있어.

여기에 이미지 설명 입력

@Robin answer & listing을 사용하여 모든 작업을 수행했습니다.

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

! repo에 여러 개의 stash가 있는 경우 new-branch에 적용할 것을 확인합니다.

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

개별 보관소를 검사하고

git stash show stash@{1}

또는 모든 스타시를 한 번에 검사합니다.

git stash list -p

변경을 커밋하기 위한 3단계

GitHub에 feature-branch라는 이름으로 새로운 브런치를 작성했다고 가정합니다.

여기에 이미지 설명 입력

가지고 오다

    git pull --all         Pull all remote branches
    git branch -a          List all branches now

체크 아웃 해, feature-branch 디렉토리로 전환합니다.위의 -a 명령어 출력에서 브랜치 이름을 복사하기만 하면 됩니다.

git checkout -b feature-branch

입증하다

다음으로 git branch 명령을 사용하여 현재 분기를 확인합니다.앞에 *가 있는 feature-branch가 표시됩니다.

git branch         

저지르다

git add .   add all files
git commit -m "Rafactore code or use your message"

원본 서버에서 업데이트 및 푸시 변경 사항 수행

 git pull origin feature-branch
 git push origin feature-branch

만 사용하라고 .git stash -k★★★★★★★★★★★★★★★★★★▼

이나 같이 git add -p

그런 다음 실제 커밋을 수행하기 전에 인덱스에 추가한 내용을 테스트하기로 결정했습니다.이 경우 플레인(plain)git stash!

대신 다음 작업을 수행합니다.

git stash -k

그러면 인덱스가 유지되고 작업 디렉토리에 남아 있고 아직 인덱스에 추가되지 않은 나머지 항목이 제거됩니다.정확히 네가 원하는 거야.

이제 컴파일/테스트 및 커밋을 시도할 수 있습니다.예.

make
git commit -m 'Yay!'

다음으로 커밋되지 않은 변경 내용을

git stash pop

않는 하고 커밋을 하면, 「Commiting」이 혼란스러울 수 .git stash pop을 사용하다그냥 것이 , 「」, 「」, 「」입니다.을 사용하다

make
git commit -m 'Grrrr'

그런 다음 새 분기를 만듭니다.

git switch -c tmpbranch

거기서 작업(코드 변경, 테스트 등)

/* blood sweat and tears */

모든 것이 성공하면 새로운 브랜치에 커밋합니다.

commit -a -m 'Finally!'

git stash pop저장소로 밀어넣었을 때와 동일한 작업 디렉토리로 이동합니다.

git checkout youknowwhatbranchyouwereonright
git stash pop

그것도 커밋하세요.그렇지 않으면 tmpbranch를 Marge할 수 없습니다.그런 다음 생성한 임시 분기를 병합하십시오.

git commit -a -m 'Still working on this.'
git merge tmpbranch
/* fix collisions and commit */

이제 기본 재배치 작업을 수행하여 'Still working this'를 맨 위에 배치하고 나머지는 단일 코멘트로 압축/수정할 수 있습니다.예를들면

git rebase -i

다음과 같은 이점을 얻을 수 있습니다.

pick 540623a Grrr
pick a8589d3 Still working on this.
pick d3b602c Finally

다음으로 변경합니다.

reword 540623a Grrr
fixup d3b602c Finally
pick a8589d3 Still working on this.

마지막으로 마지막 커밋을 실행 취소한다('계속 작업 중').

git reset HEAD~1

또한 이 모든 작업을 수행하기 위해 bash 에일리어스를 작성할 수도 있습니다.

그러면 새 명령이 생성됩니다...

  • gitco <branch>브랜치를 . - 정 、 with 、 - 、 - 、 - - - - - - 。
  • gitconew <new branch name>마스터에서 을(마스터에서 분리). 현재 . 현재 변경 내용을 가져옵니다.

다음은 별칭을 설정하는 단계입니다.

  1. 음음에 다음 합니다.~/.bash_profile
gitco ()
{
  git stash && git checkout $1 && git stash apply
}

gitconew ()
{
  git stash && git checkout master && git checkout -b $1 && git stash apply
}
  1. 실행합니다.source ~/.bash_profile을 고치다

으로, 「」를 할 수 되었습니다.gitco ★★★★★★★★★★★★★★★★★」gitconew에일리어스 명령어

다음은 bash 에일리어스에 대한 자세한 정보입니다.-> https://linuxize.com/post/how-to-create-bash-aliases/

언급URL : https://stackoverflow.com/questions/1394797/move-existing-uncommitted-work-to-a-new-branch-in-git

반응형