programing

git 기본 재배치 실행 취소

jooyons 2023. 4. 10. 21:34
반응형

git 기본 재배치 실행 취소

git 기본 설정을 쉽게 취소하려면 어떻게 해야 하나요?긴 수동 방법은 다음과 같습니다.

  1. 양쪽 브런치에 대한 커밋 부모 체크 아웃
  2. 임시 지점을 만들고 체크아웃하다
  3. 모든 커밋을 손으로 뽑다.
  4. 장애가 있는 리베이스 브랜치를 임시 브랜치를 가리키도록 리셋하다

현재 상황에서는, 양쪽의 브랜치로부터 커밋을 쉽게 발견할 수 있기 때문에, 이것은 유효합니다(하나는 제 물건, 다른 하나는 동료의 물건).그러나, 제 접근방식은 최적이라고는 할 수 없고, 에러가 발생하기 쉽다고 생각됩니다(예를 들면, 2개의 지점으로부터 재기반을 마련했다고 합시다).

설명:저는 하나의 커밋이 아닌 여러 개의 커밋이 재생된 리베이스에 대해 말하고 있습니다.

가장 쉬운 방법은 리플로그에서 기본 재설정이 시작되기 직전이었기 때문에 브랜치의 헤드 커밋을 찾는 것입니다.

git reflog

).--hard옵션)을 클릭합니다.

이 「」이라고 .HEAD@{2}조조: :

git reset --hard HEAD@{2}

Windows 에서는, 다음의 레퍼런스를 인용할 필요가 있습니다.

git reset --hard "HEAD@{2}"

' 후보자의 이력'을할 수 .git log HEAD@{2}(Windows: git log "HEAD@{2}"를 참조해 주세요.

리프로깅을 하지 않은 리프로깅, 리프로깅을 할 수 .git reflog branchname@{1}리베이스가 브랜치헤드를 분리한 후 최종 헤드에 다시 부착합니다.최근에 확인을 하지 않았기 때문에 다시 확인하겠습니다.

기본적으로는 모든 리프로그는 비베어 저장소에 대해 활성화됩니다.

[core]
    logAllRefUpdates = true

를 사용하면 이 제제로기기 your your to to to your your your your your your your your your your your actually actually actually actually actually actually actually actually actually actually actually 。ORIG_HEAD을 사용법

git reset --hard ORIG_HEAD

「」, 「」는reset,rebase ★★★★★★★★★★★★★★★★★」merge모두 원본 저장HEAD에 포인터하다ORIG_HEAD리베이스 이후에 이러한 명령어 중 하나를 실행했다면 리프로그를 사용해야 합니다.

Charles의 답변은 유효하지만, 다음과 같이 하는 것이 좋습니다.

git rebase --abort

reset.

않으면은 "이렇게 하다"라는 수 .Interactive rebase already started

브런치를 오래된 팁의 덩글링 커밋 오브젝트로 리셋하는 것이 물론 최선의 해결책입니다.이는 브런치가 노력을 들이지 않고 이전 상태로 돌아가기 때문입니다.그러나 이러한 커밋을 잃어버린 경우(예를 들어 그동안 저장소를 가비지 수집했거나 새로운 클론인 경우) 브랜치를 다시 기본화할 수 있습니다.는 '오빠'입니다.--onto환합니니다다

상상력이 해 보겠습니다.topic「」를 mastermaster이었습니다.0deadbeef저지르다.이동 중 어느 시점에topic브런치,은 " " " "를 했습니다. "자신"을 했어요.git rebase master은 예를 제시하겠습니다을 사용하다

git rebase --onto 0deadbeef master topic

모든 .topic에 없는 것master 다시 읽습니다.0deadbeef.

★★★★★★★★★★★★★★★★ --onto어떤 형태로든 당신의 역사를 재정렬할 수 있습니다.

즐거운 시간 보내세요. :-)

브런치를 리모트저장소(통상은 오리진)에 푸시하고 나서, 완전한 리베이스(마지하지 않고)를 실행한 경우(git rebase --abort는 "No rebase in progress") 명령어를 사용하여 브랜치를 쉽게 리셋할 수 있습니다.

git reset --hard origin/{branchName}

예:

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is ahead of 'origin/{branchName}' by 135 commits.
  (use "git push" to publish your local commits)

nothing to commit, working directory clean

$ ~/work/projects/{ProjectName} $ git reset --hard origin/{branchName}
HEAD is now at 6df5719 "Commit message".

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is up-to-date with 'origin/{branchName}.

nothing to commit, working directory clean
git reset --hard origin/{branchName}

는 기본 재배치에 의해 수행된 모든 로컬 변경을 리셋하는 올바른 솔루션입니다.

실제로 간단한 작업을 수행하기 전에 지점에 백업 태그를 부착합니다(대부분의 기본 재설정은 사소한 작업이지만 복잡한 작업이 있으면 그렇게 하겠습니다).

거예요.git reset --hard BACKUP.

「」를 사용합니다.reflog나한테는 통하지 않았어

나에게 효과가 있었던 것은 여기에 기재된 것과 비슷했다..git/logs/refs에서 파일을 열고 다음과 같은 "rebase finsihed"가 포함된 행을 찾습니다.

5fce6b51 88552c8f Kris Leech <me@example.com> 1329744625 +0000  rebase finished: refs/heads/integrate onto 9e460878

회선에 기재되어 있는 두 번째 커밋을 체크합니다.

git checkout 88552c8f

이것이 나의 잃어버린 잔돈을 담고 있다는 것을 확인하자 나는 분기하여 안도의 한숨을 내쉬었다.

git log
git checkout -b lost_changes

복수의 커밋의 경우, 모든 커밋은 그 커밋에 이르는 모든 이력을 참조하는 것에 주의해 주세요.그래서 찰스의 대답에서 "구약"을 "구약 중 가장 최근의 약정"으로 읽으세요.이 커밋으로 리셋하면 커밋까지의 모든 이력이 다시 표시됩니다.이게 네가 원하는 걸 할 거야.

에 대해서 해, 「」를 할 수 .git rebase --abort일을 살리기 위해 잔재주를 부릴 수 있고 억지로 밀어붙일 필요도 없어요.가 된 를 「지점」이라고 .your-branch하고 있습니다.origin/your-branch

  • git branch -m your-branch-rebased branch # 이름
  • git checkout origin/your-branch # # # # state # that that that that that that that that that that that # # # # 。
  • git checkout -b your-branch
  • 합니다.git log your-branch-rebased와합니다.git log your-branchyour-branch
  • git cherry-pick COMMIT_HASHyour-branch-rebased
  • 변경을 추진합니다.은 2개의 지점으로 점에 하시기 바랍니다.remote/your-branch 이 때 누르기만 하면 .your-branch

하드 리셋을 하고 싶지 않으면...

reflog에서 커밋을 체크 아웃한 후 새 브랜치로 저장할 수 있습니다.

git reflog

기본 설정을 시작하기 직전에 커밋을 찾습니다.검색하려면 아래로 스크롤해야 할 수 있습니다(Enter 또는 PageDown을 누릅니다).HEAD 번호를 적어 두고 57을 교체합니다.

git checkout HEAD@{57}

브랜치/커밋을 확인하고 올바른 경우 다음 HEAD를 사용하여 새 브랜치를 만듭니다.

git checkout -b new_branch_name

@Allan과 @Zearin의 솔루션에 이어 간단하게 코멘트를 하고 싶지만 평판이 좋지 않아 다음 명령을 사용했습니다.

★★★★★★★★★★★★★★★★★★★★가 아닌git rebase -i --abort(-i를 참고) 나는 간단히 할 수 밖에 없었습니다.git rebase --abort(-i제외).

-i ★★★★★★★★★★★★★★★★★」--abort【깃】

이 솔루션의 이전 및 현재 브랜치 상태는 다음과 같습니다.

matbhz@myPc /my/project/environment (branch-123|REBASE-i)
$ git rebase --abort

matbhz@myPc /my/project/environment (branch-123)
$

하드 리셋을 실행할 필요가 없는 또 다른 방법은 원하는 시작점을 사용하여 새 분기를 만드는 것입니다.

다른 솔루션과 마찬가지로 reflog를 사용하여 올바른 시작점을 찾습니다.

git reflog

할 )git log -g★★★★★★★★★★★★★★★★★★★★★」

SHA에 합니다(예: "Da" "SHA" "SHA" "SHA" "SHA" "SHA" "SHA" "SHA" "SHA" "SHA" ("SHA")e86a52b851e를 참조해 주세요.

마지막으로 git branch 명령을 사용합니다.

git branch recover-branch e86a52b851e

참고 자료: https://git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery#_data_recovery

예를 들어 마스터를 기능 브랜치로 리베이스하면 30개의 새로운 커밋을 얻을 수 있으며, 이 커밋은 어떤 것을 망가뜨린다고 합시다.나쁜 커밋을 제거하는 것이 가장 쉽다는 것을 종종 알게 되었습니다.

git rebase -i HEAD~31

최근 31개의 커밋에 대한 인터랙티브한 기본 재배치(너무 많이 선택해도 문제 없음)

삭제하고 싶은 커밋을 "pick" 대신 "d"로 표시하기만 하면 됩니다.이것으로 커밋이 삭제되어 리베이스가 취소됩니다(리베이스시에 얻은 커밋만을 삭제했을 경우).

지점에 있는 경우 다음을 사용할 수 있습니다.

git reset --hard @{1}

HEAD(HEAD에 의해 )의 만이 있는 .git reflog에는 리프로그도 브랜치에는 (리프로그로그는 리프로그입니다.git reflog <branch>) 、 [ ]에 있는 경우mastergit reflog master는 해당 브랜치에 대한 모든 변경 내용을 나열합니다.는 '아주 좋다'에서 알 수.master@{1},master@{2} 등등.

git rebase는 보통 HEAD를 여러 번 변경하지만 현재 브랜치는 한 번만 업데이트됩니다.

@{1}현재 브랜치의 숏컷에 불과하기 때문에master@{1}master.

git reset --hard ORIG_HEAD는, 할 수 없습니다.git reset한 대화 rebase.

제가 평소에 하는 일은git reset #commit_hash

마지막 커밋까지 갔다고 생각합니다만, 베이스 변경은 효과가 없다고 생각됩니다.

git pull

이제 브랜치는 마스터와 완전히 일치해야 하며 rebased commit은 여기에 포함되지 않아야 합니다.

이제 이 나뭇가지에 있는 커밋을 골라내면 된다.

(적어도 대부분) 자동화가 가능해야 하지만, 이러한 답변 중 어느 것도 완전히 자동적이지 않다는 것이 나를 짜증나게 한다.이 문제를 해결하기 위해 일련의 에일리어스를 작성했습니다.

# Useful commands
#################

# Undo the last rebase
undo-rebase = "! f() { : git reset ; PREV_COMMIT=`git x-rev-before-rebase` && git reset --merge \"$PREV_COMMIT\" \"$@\";}; f"

# See what changed since the last rebase
rdiff = "!f() { : git diff ; git diff `git x-rev-before-rebase` "$@";}; f"

# Helpers
########
# Get the revision before the last rebase started
x-rev-before-rebase = !git reflog --skip=1 -1 \"`git x-start-of-rebase`\" --format=\"%gD\"

# Get the revision that started the rebase
x-start-of-rebase = reflog --grep-reflog '^rebase (start)' -1 --format="%gD"

임의의 수의 rebase를 쉽게 되돌릴 수 있도록 이것을 조정할 수 있어야 합니다(arg의 jugging은 가장 까다로운 부분입니다).이것은, 몇개의 rebase를 연속해 실행해, 도중에 무언가를 망쳤을 경우에 편리합니다.

주의사항

커밋 메시지가 "rebase (start)"로 시작하는 경우 혼동됩니다(이 작업은 수행하지 마십시오).regex에 대해 다음과 같은 항목을 일치시킴으로써 상황을 개선하기 위해 regex를 보다 탄력적으로 만들 수 있습니다.

--grep-reflog "^rebase (start): checkout " 

경고: 테스트되지 않음(정규적으로는 조정이 필요할 수 있음)

제가 이것을 하지 않은 이유는 제가 100%가 아니기 때문에 기본 재설정은 항상 체크아웃에서 시작됩니다.누가 확인해 줄 수 있나요?

NULL])]: 명령어는 함수의 시작 부분에서 에일리어스의 bash completion을 설정하는 방법입니다.

리셋과 재로그를 사용하여 모든 제안을 시도했지만 성공하지 못했습니다.IntelliJ의 로컬 이력을 복원하면 파일 손실 문제가 해결되었습니다.

것이 git 베베 、 음음음 if 、 음음음 if음 if if if if if if if if if if if if if if if if if ) 。git rebase --abort 않은 파일이 있는 되어 " " " " 가 손실됩니다git reflog 당신은 가 있다.이 일은 나에게 일어났고 당신은 여기서 틀에서 벗어나 생각해야 할 것이다. IntelliJ 하면 IntelliJ Webstorm을 사용할 수 .right-click->local history버전 관리 소프트웨어에서 발생한 오류에 관계없이 파일/파일의 이전 상태로 되돌릴 수 있습니다.페일 세이프를 다시 실행하는 것은 항상 좋습니다.

언급URL : https://stackoverflow.com/questions/134882/undoing-a-git-rebase

반응형