programing

로컬 및 원격 Git 저장소를 1커밋만큼 롤백하는 중

linuxpc 2023. 7. 5. 20:30
반응형

로컬 및 원격 Git 저장소를 1커밋만큼 롤백하는 중

저는 이 주제에 대한 비슷한 게시물을 읽었는데, 어떻게 하면 이것을 제대로 할 수 있을지 아무리 생각해도 모르겠습니다.

저는 제가 원하지 않는 약 1000개의 파일을 체크인했고, 저는 그것들을 하나씩 겪지 않고 레포에서 모두 제거하는 것이 더 낫습니다.

  • 원격 지사가 있습니다.
  • 지역 지부가 있습니다.

그들은 둘 다 같은 개정판에 있습니다.

리모컨을 1 커밋만큼 롤백하고 싶습니다.

에서 내 .master이라A--B--C--D--E.
을 로을다롤백합다니로로 .D.
그런 다음 원격으로 푸시하여 현재 해시가 원격 및 로컬 모두 D가 되도록 합니다.

저는 이것을 하는 데 어려움을 겪고 있습니다.
나는 깃 타워를 사용하고 있지만 명령줄에 익숙합니다.도와드릴까요?

업데이트: 아래에 좋은 의견이 있습니다.특히 리포지토리를 다른 사용자와 공유하는 경우에는 재설정을 사용하는 것이 일부 권장되지 않는 것 같습니다.하드 리셋을 사용하지 않고 이전 커밋의 변경 내용을 취소하는 가장 좋은 방법은 무엇입니까?방법이 있습니까?

아직 아무도 원격 보고서를 가져오지 않은 경우, 분기 HEAD를 변경하여 해당 원격 보고서에 강제로 푸시할 수 있습니다.

git reset --hard HEAD^ 
git push -f 

(또는 원격 repo에 직접 액세스할 수 있는 경우 기본 repo인 경우에도 HEAD 참조를 변경할 수 있습니다.

참고: 아래 댓글에서 외계인 기술이 언급한 바와 같이 Windows(CMD 세션)에서는 다음이 필요합니다.^^:

git reset --hard HEAD^^
git push -f 

그리고? Jon Schneider논평에 언급된 바와 같이:

" 령어가인 " 사용하는 HEAD^으로 의결과가 됩니다.error no matches found: HEAD^"git show HEAD^가 작동하지 않는 것 같습니다. 이게 정상입니까?"

: 2011년 버전:
Git 1.8.5와 함께 2013년에 소개된 (여기서 소개)를 사용하는 것이 더 안전합니다.

설명은 Schwern답변을 참조하십시오.


만약 누군가가 이미 레포를 철회했다면요?그럼 제가 뭘 하겠어요?

그렇다면 저는 역사를 다시 쓰지 않는 것을 제안하고 싶습니다.

  • git revert 로컬에서 마지막 커밋(이전 커밋이 수행한 것을 뒤집는 새 커밋 만들기)
  • '립을'가 내는 'revert.git revert.

("Regision").HEAD^하나의 리비전 백을 의미합니다):

git reset --hard HEAD^

변경 내용을 오리진으로 푸시:

git push --force

그렇지 않으면 Git이 당신이 뒤쳐져 있다는 것을 인식할 것이기 때문에 당신은 억지로 밀어붙여야 할 것입니다.origin한 번의 약속으로 아무것도 변하지 않을 것입니다.

--force에게 덮쓸어알려니다줍을다▁overwrite▁g를 덮어쓰라고 .HEAD그곳의 진보를 존중하지 않고 멀리 떨어진 레포에서.

마지막 커밋을 되돌리려면 수신 대기:

1단계:

메시지로 로컬 커밋 확인

$ git log

2단계:

로컬 분기(또는 마스터)에서 변경 내용을 재설정하지 않고 마지막 커밋 제거

$ git reset HEAD^

또는 마지막 커밋 파일 및 업데이트 수신을 원하지 않는 경우

$ git reset HEAD^ --hard

3단계:

우리는 파일과 코드를 업데이트할 수 있으며 다시 강제로 눌러 이전 커밋을 삭제해야 합니다.새로운 커밋을 유지합니다.

$ git push origin branch -f

바로 그거야!

아래 명령을 입력하면 Git Commit 내역을 볼 수 있습니다.

로그

특정 분기에 대한 기록이 commit_A, commit_B, commit_C, commit_D와 같다고 가정해 보겠습니다.여기서 commit_D는 마지막 커밋이며 HEAD는 여기에 남아 있습니다.로컬 및 원격에서 마지막 커밋을 제거하려면 다음 작업을 수행해야 합니다.

1단계: 로컬에서 마지막 커밋 제거 방법:

git reset --hard HEAD~

커밋 HEAD가 커밋_으로 변경됩니다.c

2단계: 새로운 HEAD 커밋에 대한 변경 사항을 원격으로 푸시

git push origin +HEAD

이 명령은 원격에서 마지막 커밋을 삭제합니다.

추신: 이 명령어는 Mac OS X에서 테스트되었으며 다른 운영 체제에서도 작동해야 합니다(다른 OS에 대해서는 주장하지 않음).

여기 더 안전한 절차의 업데이트된 버전이 있습니다.

git reset --hard HEAD^ 
git push --force-with-lease

git push -f원격 리포지토리를 사용자 자신의 변경 사항으로 무분별하게 교체합니다.다른 사용자가 변경사항을 푸시한 경우 변경사항이 손실됩니다. git push --force-with-lease리포지토리가 예상대로인 경우에만 기본 재배치를 수행합니다.다른 사용자가 이미 푸시한 경우 푸시가 실패합니다.

참고: 유해하다고 간주되는 강제력. git의 이해 - 임대 계약에 따른 강제력.

다음으로 별칭을 지정하는 것이 좋습니다.repush = push --force-with-lease.

만약 누군가가 이미 레포를 철회했다면요?그럼 제가 뭘 하겠어요?

에게 하고합니다라다니합▁them▁tell.git pull --rebase=merges에 에.git fetch origin그리고.git merge origin/master그것은 그럴거다.git fetch origin그리고.git rebase -r origin/master이 이게하로변내다작시성다니됩용이경렇컬면다▁any로 다시 됩니다.master 리베이스된 새운기위에반로 origin/master.-r그들이 했을 수도 있는 합병을 보존할 것입니다.

풀링의 기본 동작으로 설정하는 것이 좋습니다.안전하고 다른 사용자의 기본 재배치를 처리하며 불필요한 병합이 줄어듭니다.

[pull]
        rebase = merges

**복귀 및 재설정에 대해 매우 짧게 답변 **

당신이 이것을 할 수 있는 많은 방법들이 있습니다.요구 사항에 따라 아래에서 원하는 것을 선택합니다.

커밋을 되돌림으로써:

마지막 커밋에서 변경한 내용을 모두 되돌리려면 되돌린 후 제거될 내용을 파일에 추가해야 합니다.파일에서 무언가를 제거하면 되돌리기 프로세스가 해당 파일을 추가합니다.

마지막 커밋을 되돌릴 수 있습니다.예:

1.git revert HEAD^
2.git push origin <Branch-Name>

또는 해당 커밋의 해시를 사용하여 이전 커밋으로 되돌릴 수 있습니다.예:

1. git revert <HASH>
2.git push origin  <Branch-Name>

또는 커밋이 병합 커밋인 경우 다음을 시도할 수 있습니다.

1.git revert -m 1 <HASH> (-m 1 refers to the first parent of two merged branches)
2.git push origin  <Branch-Name>

이전 헤드 재설정

이전 커밋을 가리키려면 재설정을 사용합니다. 이 재설정은 로컬 환경이 이전 커밋을 다시 가리킵니다.머리를 이전 커밋으로 재설정하거나 머리를 이전 커밋으로 재설정할 수 있습니다.

마지막 커밋으로 재설정합니다.

1.git reset HEAD^
2.git push -f origin <Branch-name>

이전 커밋으로 재설정:

1.git reset <HASH>
2.git push -f origin <Branch-name>

REBERT와 RESET 사이의 거래:

  1. 재설정 작업보다 되돌리기를 선택한 이유는 무엇입니까?커밋 체인을 이미 원격 저장소에 푸시한 경우(다른 사용자가 코드를 풀어서 작업을 시작했을 수 있음) 되돌리기가 변경 사항을 취소하는 더 좋은 방법입니다.이는 Git 워크플로우가 분기 끝에서 추가 커밋을 선택하는 데 잘 작동하지만 누군가 분기 포인터를 다시 재설정할 때 체인에 커밋 집합이 더 이상 표시되지 않으면 어려울 수 있기 때문입니다.

  2. 또한 분기를 재설정하면 지금까지 수행한 작업이 파괴될 수 있습니다.커밋을 재설정하면 GIT는 이 커밋 이후에 수행된 커밋을 모두 삭제하기 때문입니다.한 번의 어리석은 실수는 여러분의 모든 힘든 일을 파괴할 수 있고 여러분이 리셋하는 것에 대한 어떤 기록도 남기지 않습니다.반면에 이 시나리오에서는 커밋을 되돌리는 것이 더 나은 옵션입니다.커밋을 되돌리면 GIT는 되돌리려는 커밋과 완전히 반대되는 변경 사항으로 새 커밋을 만듭니다.그리고 그것은 그 가지의 끝을 가리킵니다.그래서 우리의 어리석은 실수에 어떤 것도 망치지 않을 것입니다.

윈도우즈 시스템의 경우 다음을 사용합니다.

git reset HEAD~1  #Remove Commit Locally

다음과 같은 작업도 수행할 수 있습니다.

git reset --hard <commit-hash>
git push -f origin master

최근에 잘못된 커밋을 받은 다른 모든 사용자를 재설정합니다.

git reset --hard origin/master

나는 다음 명령을 통해 당신과 같은 문제를 해결했습니다.

git reset --hard HEAD^
git push -f <remote> <local branch>:<remote branch> 

원격 저장소에 직접 액세스할 수 있는 경우 항상 다음을 사용할 수 있습니다.

git reset --soft HEAD^

존재하지 않는 작업 디렉토리를 수정하려는 시도가 없으므로 이 작업이 작동합니다.자세한 내용은 원본 답변을 참조하십시오.

깃베어 저장소에서 마지막 커밋을 해제하려면 어떻게 해야 합니까?

원격의 명확한 커밋 기록에서도 마지막 커밋을 제거하고 싶었습니다.다음은 매력적으로 작동했습니다.

git reset --hard HEAD^ 
git push -f 

헤드를 재설정하고 이전 커밋으로 되돌리는 방법은 다음과 같습니다.

$ git reset HEAD^ --hard
$ git push <branchname> -f

그러나 원격 분기에서 허용되지 않을 수도 있습니다.

To ssh:<git repo>
 ! [rejected]        develop -> develop (non-fast-forward)
error: failed to push some refs to 'ssh:<git repo>'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

그렇다면 다른 방법은.

git revert HEAD
git push <remote branch>

이것은 잘 작동합니다.

참고: 다음의 경우를 기억하십시오.git push -f <force>실패한 다음 되돌리려고 합니다.도아git pull이전에는 원격 및 로컬이 동기화되도록 한 다음 시도하십시오.git revert.
체크 인git log원격 및 로컬이 동일한 SHA1과 동일한 커밋 지점에 있는지 확인합니다.

git revert 
A --> B --> C -->D
A--> B --> C --> D --> ^D(taking out the changes and committing reverted diffs)

그 고장의 주인에게.

git reflog
-- this will list all last commit
  e.g Head@{0} -- wrong push
      Head@{1} -- correct push  
git checkout Head@{1} .
  -- this will reset your last modified files

git status 
git commit -m "reverted to last best"
git push origin/master

다른 사람이 당겼는지 아닌지 걱정할 필요가 없습니다.

알았어!

로컬 리포지토리를 손상시키지 않고 원격 리포지토리에서 마지막 커밋만 제거하려면 다음과 같은 방법이 있습니다.

git push origin +origin/master~:master

이 구문은 다음과 같습니다.

git push <remote> <refspec>

여기서,<remote>이라origin,그리고.<refspec>에는 다음과 같은 구조가 있습니다.

+origin/master~:master

자세한 내용은 에서 확인할 수 있습니다.git-push(1)앞의+"force push this ref"를 의미하며, 다른 부분은 "from"을 의미합니다.origin/master~로.master(원격의)origin)." 그것을 아는 것은 어렵지 않습니다.origin/master~이전의 마지막 커밋입니다.origin/master,그렇죠?

다음 두 가지 명령을 수행합니다.

git checkout commit_id
git push origin +name_of_branch

언급URL : https://stackoverflow.com/questions/4647301/rolling-back-local-and-remote-git-repository-by-1-commit

반응형