체크 아웃하지 않고 분기 커밋을 다른 커밋으로 이동


760

체크 아웃 된 분기의 분기 포인터를 이동하려면 git reset --hard명령을 사용할 수 있습니다 . 그러나 체크되지 않은 분기의 분기 포인터를 이동하여 다른 커밋을 가리 키도록하는 방법 (추적 된 원격 분기와 같은 다른 모든 항목 유지)?


11
당신이하고 싶은 것은 지금 만들어진 것과 다른 커밋의 브랜치입니다. 내 이해가 정확하다면 왜 git branch <branch-name> <SHA-1-of-the-commit>이전 분기 를 사용 하고 덤프 하여 커밋에서 새 분기를 작성하지 않습니까?
yasouser

6
@yasouser- "마스터"브랜치를 덤핑하는 것이 좋은 아이디어인지 확실하지 않습니다.
Bulwersator

답변:


578

임의의 심판을 위해 할 수 있습니다. 이것은 분기 포인터를 이동하는 방법입니다.

git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>

일반적인 형태 :

git update-ref -m "reset: Reset <branch> to <new commit>" <ref> <commit>

원하는 경우 reflog 메시지에 대한 nits를 선택할 수 있습니다. branch -f하나는 다른 것과 다르고 reset --hard정확하게 두 가지가 아닙니다.


39
이 메시지는 어디에 유익합니까? 저장 장소와 나중에 읽는 방법
Mot

4
참고 : 베어 리포지토리에서는 작동하지 않습니다. 베어 리포지토리에서 분기를 업데이트하려면 'git branch -f master <commit>'을 사용해야합니다 (아래 답변 참조).
June Rhodes

37
나처럼 실수로 refs / heads / <branch> 대신 <branch>를 사용하면 .git / <branch>의 .git 디렉토리에 새 파일이 생겨서 다음과 같은 메시지가 표시됩니다. 당신이 그것을 사용하려고 할 때 "refmaster 'master'는 모호하다". .git 디렉토리에서 파일을 삭제하여 수정할 수 있습니다.
David Minor

34
왜 이것이 더 나은지 만족시키기 위해 설명되지 않았습니다 git branch -f. (A) 열심히 사용 (B) 열심히 기억하고하는 (C) 더 위험에 : 특정 되려면,이 방법은 것으로 보인다
스티븐 루

10
"임의의 참조가 정확히 무엇을 의미 하는가"-분기는 커밋을 가리키는 유일한 종류의 참조가 아닙니다. 태그가 있으며 분기 나 태그가 아닌 임의의 참조 / whatevs / myref 스타일 참조를 직접 만들 수도 있습니다. 나는 이것이 "더 나은"것에 대한 Steven Lu의 질문에 대답한다고 믿습니다. 브랜치로 작업하는 경우 브랜치 -f가 가장 간단하다는 데 동의합니다.
Adam A

964
git branch -f <branch-name> <new-tip-commit>

24
또는 임의의 심판에 대해서는 git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>. (원하는 경우 참조 메시지에 대한 nits를 선택할 수 있습니다. branch -f하나는 다른 것과 다르고 reset --hard이것은 정확히 둘 중 하나가 아니라고 생각합니다.)
Cascabel

4
Jefromi, 투표 할 수 있도록 별도의 답변을 작성하십시오. :)
Mot

16
99 % 사례를 처리하고 실제로 문서를 준수하므로 더 나은 대답입니다. git help branch"-f, --force <branchname>이 이미있는 경우 <branchname>을 <startpoint>로 재설정합니다. -f가 없으면 git branch는 기존 분기 변경을 거부합니다."
AlexChaffee

12
내가하고 있는데 Ummmm에게 지금 무엇을 해야하는지 git branch -f master <hash>알려줍니다. fatal: Cannot force update the current branch.이 명령을 사용하기 전에 다른 임의의 분기를 확인하십시오.
Qwertie

20
이동하려는 지점이 현재 지점 인 경우에는 작동하지 않습니다 HEAD.
블라디미르 판 텔레 예프

135

git reset --hard커밋 참조를 전달할 수도 있습니다 .

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

git checkout branch-name
git reset --hard new-tip-commit

나는 이런 식으로 자주하는 것을 발견했다.

이 역사를 가정

$ git log --decorate --oneline --graph
* 3daed46 (HEAD, master) New thing I shouldn't have committed to master
* a0d9687 This is the commit that I actually want to be master

# Backup my latest commit to a wip branch
$ git branch wip_doing_stuff

# Ditch that commit on this branch
$ git reset --hard HEAD^

# Now my changes are in a new branch
$ git log --decorate --oneline --graph
* 3daed46 (wip_doing_stuff) New thing I shouldn't have committed to master
* a0d9687 (HEAD, master) This is the commit that I actually want to be master

이것은 일반적으로 HEAD 또는 HEAD ^를 사용하여 분기 팁을 다시 제자리로 이동한다는 점에서 가장 의미가 있습니다. 따라서 이것은 커밋을 미리 지정하는 것과 일치합니다.
justingordon

11
작업 트리가 깨끗하면 괜찮습니다. 많은 단계적 또는 비 단계적 변경이있는 경우 git update-ref위에서 설명한대로 수행 하는 것이 좋습니다 .
유료 괴상한

16
귀하의“답변”에 이미 질문의 일부가 아닌 것은 추가되지 않았다는 것을 알고 계셨습니까? – OP가 말했다 : 체크 아웃 된 경우 ... git reset --hard ...여기서 반복 할 필요가 없습니다! :-(
Robert Siemer

6
@Robert : 동의하지 않습니다. 질문은 그것을 사용 하는 방법 을 말하지 않았으며 이것이 그렇게합니다. 그 방법을 찾지 않아도 좋았습니다.
Wilson F

7
@ WilsonF, 아마 여기에서 이것을 찾는 것이 좋았지 만 질문에 전혀 대답하지 않았습니다. 어쩌면 다른 질문에 대한 대답 일 수도 있지만 여기서는 잘못되었습니다 .
Robert Siemer

52

토론을 풍부하게하기 위해 myBranch분기를 현재 커밋 으로 옮기려면 두 번째 인수를 생략하십시오.-f

예:

git branch -f myBranch


나는 rebase분리 된 HEAD 상태에 있을 때 일반적으로 이것을 수행합니다 :)


13

에서 gitk --all:

  • 원하는 커밋을 마우스 오른쪽 버튼으로 클릭하십시오.
  • -> 새로운 지점을 만듭니다
  • 기존 지점의 이름을 입력하십시오
  • 해당 이름의 이전 브랜치 교체확인 하는 대화 상자에서 return을 누르 십시오 .

기존 브랜치를 수정하는 대신 다시 생성 하면 추적 브랜치 정보가 손실됩니다 . (이것은 일반적으로 하나의 리모트 만 있고 로컬 브랜치가 리모트의 해당 브랜치와 이름이 같은 단순한 유스 케이스에는 문제가되지 않습니다. 자세한 내용은 주석을 참조하십시오.이 단점을 지적한 @mbdevpl.)

gitk대화 상자에 덮어 쓰기, 기존 수정 또는 취소의 3 가지 옵션이있는 기능이 있으면 멋질 것 입니다.


당신은 일반적으로 자신과 같은 명령 줄 마약 중독자있어,해도 git guigitk아주 능숙하게 그들이 허용 자식 사용의 부분 집합을 위해 설계되었습니다. git gui에서 인덱스에 인덱스를 선택적으로 스테이징하고 덩어리를 선택하는 것뿐만 아니라 커밋하는데도 사용하는 것이 좋습니다. .)

gitk 업스트림을 제출하기 위해 멋진 패치 시리즈로 변경 사항을 분류하거나 여러 분기로 중간에있는 것을 추적 해야하는 다른 항목을 추적하는 동안 몇 가지 지점을 추적하는 데 좋습니다.

그래픽 파일 브라우저가 열려 있지 않지만 gitk / git gui를 좋아합니다.


1
너무 쉽게! 방금 gitg에서 gitk로 변환했을 수 있습니다.
Michael Cole

그러나 이렇게하면 추적 지점 정보가 손실됩니다.
mbdevpl

@ mbdevpl : 나는 실제로 자식 전문가가 아닙니다. 나는 당신이 의미하는 바를 이해하지만 그 의미는 이해하지 못한다고 생각합니다. 나는 이것을 꽤 자주 사용했지만 여전히 그 지점을 리모컨의 같은 이름의 지점으로 푸시 할 수있었습니다. 지점과 원격 추적 지점 사이의 연결은 무엇을 도와 줍니까?
Peter Cordes


1
@PeterCordes 실제로 분기 이름이 일치하지 않으면 중요합니다. 또한 리모콘이 두 개 이상인 경우. 또한 git prompt를 사용하여 분기 상태를 표시하면 추적 분기까지의 커밋 거리가 설정되어 있습니다 (설정된 경우). 또한 git status출력에 영향을 미칩니다. 또한, 일부의 경우 git fetch와 것은 git push당신이 추적 지점을 설정하지 않은 경우 명시 적으로 원격 지정하지 않고 작동하지 않습니다. 나는 모든 경우에 대해 잘 모르지만, 일반적으로 경험의 편리함과 속도를 위해서는 지점을 순서대로 추적하는 것이 좋습니다.
mbdevpl

7

권장 솔루션git branch -f branch-pointer-to-move new-pointerTortoiseGit :

  • "깃대 표시 로그"
  • "모든 지점"확인
  • 줄에서 분기 포인터를 (새 포인터)로 이동하십시오.
    • "이 버전에서 지점 작성"을 마우스 오른쪽 단추로 클릭하십시오.
    • "지점"옆에 이동할 지점의 이름을 입력하십시오 (지점 포인터에서 이동).
    • "기준"에서 새 포인터가 올바른지 확인하십시오.
    • "강제"확인
    • 확인

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

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


4

솔직히, 나는 아무도 git push명령 에 대해 생각하지 않은 것에 놀랐습니다 .

git push -f . <destination>:<branch>

점 (.)은 로컬 저장소를 나타내며 대상이 "원격 상대방 뒤에" 있을 수 있으므로 -f 옵션이 필요할 수 있습니다 .

이 명령은 서버에서 변경 사항을 저장하는 데 사용되지만 결과는 원격 브랜치 ( <branch>)를 로컬 브랜치 ( <destination>) 와 동일한 커밋으로 이동하는 것과 동일합니다.


-f로컬에서 무언가를 방해 하지 않고이 작업을 수행 할 수도 있습니다 . 예를 들어, git fetch origin && git push . origin/develop:develop의 노 - 체크 아웃 필요한 르파 버전입니다git checkout develop && git pull --ff-only
btown

1

파일을 열고 .git/refs/heads/<your_branch_name>거기에 저장된 해시를 분기 헤드를 이동하려는 해시로 변경하십시오. 텍스트 편집기로 파일을 편집하고 저장하십시오. 수정하려는 분기가 현재 활성 분기가 아닌지 확인하십시오.

면책 조항 : 아마 권장하는 방법은 아니지만 일을 마칩니다.


1
이것이 혼란 스럽거나 사악한 방법인지 확실하지 않습니다. 🤔 😉
Keith Russell

@KeithRussell은 둘 다일 수 있습니다 : P
Guillermo Gutiérrez

0

지정하려는 커밋이 현재 브랜치보다 앞서있는 경우 (현재 브랜치의 마지막 커밋을 실행 취소하지 않는 경우에 해당), 간단히 수행 할 수 있습니다.

git merge <commit>

지점이 체크 아웃되지 않은 경우 수행 할 작업에 대한 질문입니다.
Keith Russell

죄송합니다. 그 시점을 놓쳤습니다. 이 경우 git push . <commit>:<branch>이미 제안한대로 할 수 있습니다.
진 폴
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.