체크 아웃 된 분기의 분기 포인터를 이동하려면 git reset --hard
명령을 사용할 수 있습니다 . 그러나 체크되지 않은 분기의 분기 포인터를 이동하여 다른 커밋을 가리 키도록하는 방법 (추적 된 원격 분기와 같은 다른 모든 항목 유지)?
체크 아웃 된 분기의 분기 포인터를 이동하려면 git reset --hard
명령을 사용할 수 있습니다 . 그러나 체크되지 않은 분기의 분기 포인터를 이동하여 다른 커밋을 가리 키도록하는 방법 (추적 된 원격 분기와 같은 다른 모든 항목 유지)?
답변:
임의의 심판을 위해 할 수 있습니다. 이것은 분기 포인터를 이동하는 방법입니다.
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
정확하게 두 가지가 아닙니다.
git branch -f
. (A) 열심히 사용 (B) 열심히 기억하고하는 (C) 더 위험에 : 특정 되려면,이 방법은 것으로 보인다
git branch -f <branch-name> <new-tip-commit>
git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>
. (원하는 경우 참조 메시지에 대한 nits를 선택할 수 있습니다. branch -f
하나는 다른 것과 다르고 reset --hard
이것은 정확히 둘 중 하나가 아니라고 생각합니다.)
git help branch
"-f, --force <branchname>이 이미있는 경우 <branchname>을 <startpoint>로 재설정합니다. -f가 없으면 git branch는 기존 분기 변경을 거부합니다."
git branch -f master <hash>
알려줍니다. fatal: Cannot force update the current branch.
이 명령을 사용하기 전에 다른 임의의 분기를 확인하십시오.
HEAD
.
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
git update-ref
위에서 설명한대로 수행 하는 것이 좋습니다 .
git reset --hard ...
여기서 반복 할 필요가 없습니다! :-(
에서 gitk --all
:
기존 브랜치를 수정하는 대신 다시 생성 하면 추적 브랜치 정보가 손실됩니다 . (이것은 일반적으로 하나의 리모트 만 있고 로컬 브랜치가 리모트의 해당 브랜치와 이름이 같은 단순한 유스 케이스에는 문제가되지 않습니다. 자세한 내용은 주석을 참조하십시오.이 단점을 지적한 @mbdevpl.)
gitk
대화 상자에 덮어 쓰기, 기존 수정 또는 취소의 3 가지 옵션이있는 기능이 있으면 멋질 것 입니다.
당신은 일반적으로 자신과 같은 명령 줄 마약 중독자있어,해도 git gui
와 gitk
아주 능숙하게 그들이 허용 자식 사용의 부분 집합을 위해 설계되었습니다. git gui에서 인덱스에 인덱스를 선택적으로 스테이징하고 덩어리를 선택하는 것뿐만 아니라 커밋하는데도 사용하는 것이 좋습니다. .)
gitk
업스트림을 제출하기 위해 멋진 패치 시리즈로 변경 사항을 분류하거나 여러 분기로 중간에있는 것을 추적 해야하는 다른 항목을 추적하는 동안 몇 가지 지점을 추적하는 데 좋습니다.
그래픽 파일 브라우저가 열려 있지 않지만 gitk / git gui를 좋아합니다.
git status
출력에 영향을 미칩니다. 또한, 일부의 경우 git fetch
와 것은 git push
당신이 추적 지점을 설정하지 않은 경우 명시 적으로 원격 지정하지 않고 작동하지 않습니다. 나는 모든 경우에 대해 잘 모르지만, 일반적으로 경험의 편리함과 속도를 위해서는 지점을 순서대로 추적하는 것이 좋습니다.
권장 솔루션git branch -f branch-pointer-to-move new-pointer
에 TortoiseGit :
솔직히, 나는 아무도 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
파일을 열고 .git/refs/heads/<your_branch_name>
거기에 저장된 해시를 분기 헤드를 이동하려는 해시로 변경하십시오. 텍스트 편집기로 파일을 편집하고 저장하십시오. 수정하려는 분기가 현재 활성 분기가 아닌지 확인하십시오.
면책 조항 : 아마 권장하는 방법은 아니지만 일을 마칩니다.
지정하려는 커밋이 현재 브랜치보다 앞서있는 경우 (현재 브랜치의 마지막 커밋을 실행 취소하지 않는 경우에 해당), 간단히 수행 할 수 있습니다.
git merge <commit>
git push . <commit>:<branch>
이미 제안한대로 할 수 있습니다.
git branch <branch-name> <SHA-1-of-the-commit>
이전 분기 를 사용 하고 덤프 하여 커밋에서 새 분기를 작성하지 않습니까?