prosource

파일 체크아웃 없이 Git 분기 전환

probook 2023. 9. 20. 20:24
반응형

파일 체크아웃 없이 Git 분기 전환

Git에서 모든 파일을 체크아웃하지 않고 다른 지점으로 전환하는 것이 가능합니까?

분기 전환 후 모든 파일을 삭제하고 재생성한 후 커밋하고 다시 전환해야 합니다.따라서 파일을 체크아웃하는 것은 시간 낭비일 뿐입니다(그리고 약 14,000개의 파일이 있습니다). 이는 긴 작업입니다.

모든 것을 명확히 하기 위해:

GitHub에 문서를 업로드하려면 이 모든 것이 필요합니다.

gh-pages 지점이 있는 저장소가 있습니다.로컬에서 문서를 재구성할 때 저장소 디렉토리에 문서를 복사하고 커밋한 후 GitHub로 푸시합니다.하지만 현지에서 두 부의 문서를 가지고 있었기 때문에 저는 행복하지 않았습니다.그리고 빈 브랜치를 만들고 커밋 후에는 빈 파일로 전환하고 삭제하기로 했습니다.하지만 다시 되돌리는 것은 긴 작업입니다. 그래서 저는 이 질문을 했습니다.

gh-pages branch에 그냥 두고 파일을 삭제하면 된다는 것은 알지만, 더러운 작업 트리는 싫어요.

네, 할 수 있어요.

git symbolic-ref HEAD refs/heads/otherbranch

이 분기를 커밋해야 할 경우 인덱스를 재설정해야 합니다. 그렇지 않으면 마지막으로 체크아웃한 분기를 기준으로 커밋하게 됩니다.

git reset

기본 git 명령만 사용하는 경우:

이 답변은 찰스의 답변보다 조금 길지만, 제가 이해할 수 있고 따라서 기억할 수 있는 기본적인 git 명령어로만 구성되어 있어 계속 찾아 볼 필요가 없습니다.

현재 위치 표시(필요한 경우 먼저 커밋):

git checkout -b temp

working dir을 변경하지 않고 마커를 다른 브랜치로 재설정(이동)합니다.

git reset <branch where you want to go>

temp와 다른 branch는 같은 커밋을 가리키고 당신의 작업 지시자는 손상되지 않았습니다.

git checkout <branch where you want to go>

헤드가 이미 동일한 커밋을 가리키고 있으므로 working dir은 터치되지 않습니다.

git branch -d temp

이러한 명령은 그래픽 클라이언트에서도 쉽게 사용할 수 있습니다.

에서 v2.24git switch입니다 같은 입니다.git checkout.
그래서 나는 아래의 별칭을 다음으로 바꿨습니다.git hop위해서
없이 " 홉"

판독기의 이점을 위해:

는 찰스 베일리의 해결책이 정확하다고 생각하지만, 이 해결책은 지역 지점이 아닌 무언가로 전환할 때 조정이 필요합니다.또한 이해하기 쉬운 규칙적인 명령어를 사용하는 방법이 있어야 합니다.제가 생각해낸 것은 다음과 같습니다.

git checkout --detach
git reset --soft commitish
git checkout commitish

설명:

  • git checkout --detach.git checkout HEAD^{}현재 분기를 뒤로하고 "detached 헤드 상태"로 들어갑니다. 다음 은?HEAD더 이상 어떤 가지에도 영향을 주지 않습니다.tHEAD워크트리나 인덱스에는 영향을 주지 않습니다.
  • git reset --soft commitish 다음에 이동합니다.HEADcommitish. 인덱스도 업데이트하고 싶으시면 탈퇴하시기 바랍니다.--soft하지만 그렇게 하는 것을 추천하지는 않습니다. 않습니다 (다. 그리고 (--soft인덱스가 아닙니다.
  • git checkout commitish합니다.HEAD주어진 바에 따라commitish다시 (가지) (만약)commitishSHA는 아무 일도 일어나지 않습니다.)이것 역시 인덱스나 워크트리에 영향을 주지 않습니다.

이 것을 gitrev-parse아래는 타이포가 실수로 분리된 헤드 상태로 전환되지 않도록 체인에 손상이 없는지 확인하기 위한 테스트일 뿐입니다(오류 복구는 훨씬 복잡합니다).

이로 인해 다음과 같은 결과가 발생합니다.git hop treeish칭:

git config --global alias.hop '!f() { git rev-parse --verify "$*" && git checkout "HEAD^{}" && git reset --soft "$*" && git checkout "$*"; }; f'

참고로, 가명 목록에서 찾을 수 있습니다.

배관부를 찾으시는 것 같네요이렇게 하면 인덱스가 업데이트되지만 작업 디렉토리에 있는 파일은 업데이트되지 않습니다.예를 들어, 다음과 같이 가정합니다.branch입니다.입니다.

git 읽기-나무 가지

방금 읽은 분기를 커밋하려면 다음 작업도 수행해야 합니다.

git 심볼릭-ref HEAD Ref/헤드/가지

하나의 저장소 또는 두 개의 저장소와 함께 두 개의 작업 디렉토리(두 개의 작업 영역)를 갖는 것이 더 나은 솔루션이 되지 않겠습니까?

git-new-workdir 도구가 있습니다.contrib/이것을 도와줄 섹션입니다.

HEAD 파일을 다른 분기 이름으로 덮어쓸 수 있습니다.

echo "ref: refs/heads/MyOtherBranch" > .git/head

또는 패치 파일을 사용하여 다른 지점에서 마스터로 패치 적용

git diff otherbranch master > ~/tmp/otherbranch.diff
git checkout master
git apply ~/tmp/otherbranch.diff

당신은 A지점에 있고 싶지만 B지점의 파일을 가지고 있다고 말합니다.

git 로그로 분기 A의 현재 커밋 레퍼런스를 찾습니다(예: "99ce9a2").

git checkout A
git reset --hard B
git reset 99ce9a2

이제 B에 해당하는 폴더 구조로 분기 A에 있어야 합니다. 이 구조는 단계별 변경 사항으로 표시됩니다(A 내역은 변경되지 않았습니다).

이렇게 많은 파일을 가지마다 하나씩 두 개의 저장소만 보관하는 것이 가장 좋을 수도 있습니다.필요에 따라 변경사항을 앞뒤로 당겨서 사용할 수 있습니다.이것은 깃으로 기괴한 속임수를 부리는 것보다 덜 놀랄 것입니다.

원격 분기가 가리키는 위치를 단순히 변경하려는 경우 로컬 복사본을 터치하지 않고 "git push"로 변경할 수 있습니다.

http://kernel.org/pub/software/scm/git/docs/git-push.html

<refspec> 매개 변수의 형식은 선택적 더하기 +이고 소스 ref <src> 다음에 콜론 :, 대상 ref <dst>가 차례로 표시됩니다.원격 저장소의 <dst> 참조를 업데이트할 <src> 개체를 지정하는 데 사용됩니다.

예를 들어, c5f7eba를 커밋하도록 foo를 업데이트하려면 다음을 수행합니다.

git push origin c5f7eba:foo

그것이 당신이 추구했던 것인지 아닌지 확실하지 않습니다.

당신은 사용할 수 있습니다.

      1. git checkout -f <new-branch>
      2. git cherry-pick -x <previous-branch-commit-id>

previor-branch-commit-id는 이전 데이터를 복사하려는 위치의 커밋입니다.

언급URL : https://stackoverflow.com/questions/1282639/switch-git-branch-without-files-checkout

반응형