이전 커밋으로 롤백 한 다음 해당 코드를 게시 한 다음 최신 커밋으로 돌아가고 싶습니다.
즉, 내 마스터가 이전 커밋 버전을 가리키고 있으므로 해당 버전을 게시 할 수 있습니다. 그런 다음 처음에 하나였던 최신 커밋으로 돌아가고 싶습니다.
어떻게 할 수 있습니까?
답변:
이렇게하고 마스터를 이전 커밋으로 되돌리려면 다음을 수행하십시오.
git checkout master~1 # Checkout previous commit on master
git checkout -b new_master # Create branch for new master
git branch -D master # Delete old master
git branch -mv new_master master # Make new_master master
또는 :
git reset --hard master~1 # Reset current branch to one commit ago on master
질문이 명확하지 않습니다. 나는 당신이 요구하는 것이 이것 이라고 생각 합니다.
git push -f origin $old_commit_id:master
이것은 무엇을할까요? $old_commit_id커밋을 의 브랜치 origin의 새 헤드로 푸시합니다 .originmaster
그것이 당신이 원하는 것이라면, 당신은 지역 master지점을 전혀 만질 필요가 없습니다 .
master (non-fast-forward)실패했습니다. @jtdubs 솔루션이 작동했습니다.
-f강제로 전달 하기 만하면 됩니다. 원격 저장소가이를 금지하도록 구성되어있을 수 있습니다. 답변을 업데이트했습니다.
강제 푸시를 피하려면 다음은 저장소를 이전 커밋으로 되돌리고 개입하는 모든 작업을 보존하는 방법입니다.
git checkout 307a5cd # check out the commit that you want to reset to
git checkout -b fixy # create a branch named fixy to do the work
git merge -s ours master # merge master's history without changing any files
git checkout master # switch back to master
git merge fixy # and merge in the fixed branch
git push # done, no need to force push!
끝난! 307a5cd를 repo에서 원하는 커밋으로 바꿉니다.
(처음 두 줄을 결합 할 수 있다는 것을 알고 있지만, 그것이 무슨 일이 일어나고 있는지 명확하지 않게 만든다고 생각합니다)
여기에 그래픽이 있습니다.
c1 -- c2 -- c3 -- c4 -- c2' -- c5 ...
\ /
'------------'
c3 및 c4를 효과적으로 제거하고 프로젝트를 다시 c2로 설정합니다. 그러나 c3 및 c4는 다시보고 싶은 경우 프로젝트 기록에서 계속 사용할 수 있습니다.
다음과 같이 커밋 그래프를 가정합니다.
| (A) ---------> (B) ----------> (C)
| ^
| (master)
먼저 체크 아웃 master하고 master현재 위치를 가리키는 분기를 만들고 싶습니다 .
git checkout master
git branch pointer master
이제 다음과 같이 보일 것입니다.
| (A) ---------> (B) ----------> (C)
| ^
| (HEAD, master, pointer)
이제 이미에 master있으므로 master분기에 한 커밋 뒤로 이동하도록 지시합니다.
git reset master~1
이제 master한 칸 뒤로 이동해야하지만 pointer브랜치는 여전히 가장 최근 커밋에 있습니다.
| (A) ---------> (B) ----------> (C)
| ^ ^
| (HEAD, master) (pointer)
이 시점에서 master원격 또는 어느 곳에서나 푸시 한 다음 빨리 감기로 다시 pointer분기로 병합 할 수 있습니다. 그 pointer지점에서 브랜치를 죽일 수 있습니다 :
git push origin master
git merge --ff-only pointer
git branch -D pointer
결승 :
| (A) ---------> (B) ----------> (C)
| ^ ^
| [ origin/master ] (HEAD, master)
git push origin master 실패 합니다 . -f 플래그도 전달해야합니다.
당신은 할 수 있습니다 git checkout <commit-id>, 당신이 다음 할 필요가 무엇이든 git checkout master새로운 코드로 돌아 가야.
실제로 이전 코드를 수정하여 릴리스해야하는 경우 다음을 수행해야합니다.
git checkout -b my_release <commit-id>
... prepare code for release ...
... release code ...
git checkout master
git merge my_release
또한 git flow를 충분히 추천 할 수 없습니다 . 이 모든 것을 아주 쉽게 만듭니다.
이전 버전으로 이동하려면 :
git checkout <version hash>
여기서 당신의 일을하고 그것을 커밋하십시오.
git commit --amend
마스터 로 돌아가려면 :
git checkout master
git reset --hard그의 마스터 브랜치를 이전 커밋으로 다시 가리 켰으므로 git checkout master아무것도하지 않습니다.
commit --amend단계는 유용 충분하다
--amend?