답변:
가장 최근의 커밋을 삭제하고 수행 한 작업을 유지하십시오.
git reset --soft HEAD~1
가장 최근의 커밋을 삭제하여 수행 한 작업 을 삭제하십시오 .
git reset --hard HEAD~1
git reset --hard origin
git remote
은 나에게 기원을 나열 git reset --hard origin
한다고 말한다 fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
. 왜?
git reset HEAD~1
또한 모든 변경 사항을 유지하지만 모든 --soft
옵션을 유지하는 대신 빈 인덱스로 남겨 둡니다 ( 옵션).
내가 찾은 최고의 답변이 댓글에만있는 이유가 궁금합니다! (대 니트에 의해 86 위로 투표 )
git reset --hard origin
이 명령은 로컬 리포지토리를 원격 리포지토리와 동기화하여 로컬에서 수행 한 모든 변경 사항을 제거합니다. 다음을 수행하여 원점에있는 정확한 분기를 가져올 수 있습니다.
git reset --hard origin/<branch>
git reset --hard origin/<branch>
git reset --soft origin/<branch>
커밋을 제거하고 로컬 작업을 유지하려는 경우.
fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
다음과 같이 분기를 지정해야한다.git reset --hard origin/feature/my-cool-stuff
삭제하지 마십시오. 단 하나의 커밋 git cherry-pick
으로 충분합니다.
그러나 잘못된 브랜치에 여러 커밋 이 있으면 그 곳 git rebase --onto
이 빛납니다.
이것을 가지고 있다고 가정 해보십시오.
x--x--x--x <-- master
\
-y--y--m--m <- y branch, with commits which should have been on master
그런 다음 master
원하는 위치에 표시 하고 이동할 수 있습니다.
git checkout master
git branch tmp
git checkout y
git branch -f master
x--x--x--x <-- tmp
\
-y--y--m--m <- y branch, master branch
y 지점을 재설정해야합니다.
git checkout y
git reset --hard HEAD~2 # ~1 in your case,
# or ~n, n = number of commits to cancel
x--x--x--x <-- tmp
\
-y--y--m--m <- master branch
^
|
-- y branch
마지막으로 커밋을 이동하십시오 (다시 적용하여 실제로 새로운 커밋을 만듭니다).
git rebase --onto tmp y master
git branch -D tmp
x--x--x--x--m'--m' <-- master
\
-y--y <- y branch
해당 커밋을 다른 브랜치로 옮기려면 커밋의 SHA를 얻으십시오.
git rev-parse HEAD
그런 다음 현재 분기를 전환
git checkout other-branch
그리고 cherry-pick
약속other-branch
git cherry-pick <sha-of-the-commit>
git reset --hard HEAD~1
나중에 필요합니다 . 내가 사용하는 생각 reset --soft
다음 지점을 전환하고 다시 저장 한 것이다 추가 작업을 커밋. 그런 다음 다시 SourceTree를 사용하여 대부분의 기본 작업을 수행하고 오류가 발생한 후에 만 명령 줄을 지정했습니다.
참고로, git reset --hard뿐만 아니라 다음 명령을 사용하여 현재 분기에서 "하드 컷"커밋을 수행 할 수 있다고 생각합니다.
git checkout -B <branch-name> <SHA>
실제로 체크 아웃에 신경 쓰지 않으면 원하는대로 분기를 설정할 수 있습니다.
git branch -f <branch-name> <SHA>
예를 들어 리밋을 사용하여 새로운 커밋을 복사하기 위해 브랜치에서 커밋을 제거하는 프로그래밍 방식입니다.
다른 위치에서 소스를 가져 와서 분기로 덤프했기 때문에 마스터와 연결이 끊어진 분기가 있다고 가정하십시오.
이제 변경 사항을 적용한 지점이 있습니다. "토픽"이라고하겠습니다.
이제 토픽 브랜치를 복제 한 다음 브랜치 "덤프"에있는 소스 코드 덤프에 리베이스하십시오.
git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate
이제 "덤프"시작점을 기준으로 topic_duplicate 브랜치에 변경 사항이 다시 적용되지만 "마스터"이후에 발생한 커밋 만 다시 적용됩니다. 따라서 마스터 이후 변경 사항은 이제 "덤프"위에 다시 적용되지만 결과는 "topic_duplicate"로 나타납니다.
그런 다음 다음을 수행하여 "덤프"를 "topic_duplicate"로 바꿀 수 있습니다.
git branch -f dump topic_duplicate
git branch -D topic_duplicate
또는
git branch -M topic_duplicate dump
아니면 그냥 덤프를 버려서
git branch -D dump
현재 "topic_duplicate"를 지운 후에 체리 픽을 선택했을 수도 있습니다.
내가 말하려고하는 것은 현재를 업데이트 할 경우 지점은 당신이 먼저 수행하여 커밋을 "cherrypicked"이전에 삭제해야 다른 조상의 기반으로 "중복"이다 git reset --hard <last-commit-to-retain>
또는 git branch -f topic_duplicate <last-commit-to-retain>
다음 주부터 (이상 다른 커밋을 복사 토픽 브랜치)
리베이스는 이미 커밋이있는 브랜치에서만 작동하므로 원할 때마다 토픽 브랜치를 복제해야합니다.
체리 픽킹은 훨씬 쉽습니다.
git cherry-pick master..topic
따라서 전체 시퀀스는 다음과 같습니다.
git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic
주제 중복 브랜치가 체크 아웃 된 경우 그러면 현재 복제본에서 이전에 고른 커밋이 제거되고 현재 "덤프"(다른 조상) 위에 "주제"에서 발생하는 모든 변경 사항이 다시 적용됩니다. 다른 "다운 스트림"마스터를 사용하여 로컬 변경 사항이 여전히 그에 적용되는지 확인하기 위해 개발을 "실제"업스트림 마스터를 기반으로하는 합리적으로 편리한 방법 인 것 같습니다. 또는 diff를 생성 한 다음 Git 소스 트리 외부에 적용 할 수 있습니다. 그러나 이런 방식으로 배포의 버전을 기반으로하는 최신 수정 된 (패치 된) 버전을 유지하면서 실제 개발은 실제 업스트림 마스터에 반할 수 있습니다.
따라서 다음과 같이 설명하십시오.
이것이 누군가를 돕기를 바랍니다. 나는 이것을 다시 쓰려고했지만 지금은 관리 할 수 없습니다. 문안 인사.