문제

소스 코드와 약간의 작업을했을 때 평소 커밋을 한 다음 원격 저장소로 밀어 넣었습니다. 그러나 나는 소스 코드에서 내 가져 오기를 구성하는 것을 잊었다는 것을 알았습니다. 그래서 나는 이전 커밋을 대체하기 위해 수정 명령을 수행합니다.

> git commit --amend

불행히도 커밋은 저장소로 다시 밀려날 수 없습니다. 다음과 같이 거부됩니다.

> git push origin
To //my.remote.repo.com/stuff.git/
 ! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to '//my.remote.repo.com/stuff.git/'

어떻게해야합니까? (원격 저장소에 액세스 할 수 있습니다.)

도움이 되었습니까?

해결책

나는 실제로 한 번 밀어 냈다 --force 그리고 .git 리포지토리와 리누스에 의해 꾸짖 었습니다 큰 시간. 일반적으로 이것은 다른 사람들에게 많은 문제를 일으킬 것입니다. 간단한 대답은 "하지 마십시오"입니다.

나는 다른 사람들이 어쨌든 그렇게하기 위해 레시피를 주었다는 것을 본다. 그래서 나는 여기서 반복하지 않을 것이다. 하지만 상황에서 회복하는 팁이 있습니다. ~ 후에 당신은 -포스 (또는 +마스터)로 수정 된 커밋을 밀어 냈습니다.

  1. 사용 git reflog 당신이 수정 한 오래된 커밋을 찾으려면 (전화하십시오. old, 그리고 우리는 수정하여 창출 한 새로운 커밋을 부를 것입니다. new).
  2. 사이에 병합을 만듭니다 old 그리고 new, 나무를 녹음합니다 new, 처럼 git checkout new && git merge -s ours old.
  3. 마스터에게 합병하십시오 git merge master
  4. 결과로 마스터를 업데이트하십시오 git push . HEAD:master
  5. 결과를 밀어냅니다.

그러면 불행한 사람들은 자신의 작업을 수정하고 강제로 강요함으로써 당신의 커밋에 근거하여 자신의 작업을 기반으로하는 사람들이 당신이 선호하는 것을 볼 것입니다. new ~ 위에 old. 그들의 병합은 사이의 갈등을 보지 못할 것입니다 old 그리고 new 그것은 당신의 수정으로 인해 발생 했으므로 고통받을 필요가 없습니다.

다른 팁

GIT 안전 기능을보고 있습니다. 지점의 헤드 커밋은 당신이 밀고있는 지점의 현재 헤드 커밋의 직접적인 후손이 아니기 때문에 Git은 지점으로 원격 지점을 업데이트하는 것을 거부합니다.

그렇지 않은 경우, 동시에 같은 리포지토리를 밀고있는 두 사람은 동시에 새로운 커밋이 있었으며 마지막으로 밀어 붙인 사람이 이전 푸셔의 작업을 잃을 것임을 알지 못할 것입니다. 그들은 이것을 깨달았습니다.

당신이 당신이 유일한 사람이라는 것을 알고 있고 당신이 수정 된 커밋을 밀거나 지점을 뒤로 젖히는 커밋을 밀고 싶다면, 당신은 -f 스위치.

git push -f origin master

조차도 원격 저장소가 구성 변수를 사용하여 원격 리포지토리가 맨 끝에서 비정규적인 푸시를 거부 할 수 있도록 작동하지 않을 수 있습니다. receive.denynonfastforwards. 이 경우 거부 이유는 다음과 같습니다 ( '원격 거부'부분에 주목) :

 ! [remote rejected] master -> master (non-fast forward)

이 문제를 해결하려면 원격 저장소 구성을 변경하거나 더러운 해킹으로서 분기를 삭제하고 재현 할 수 있습니다.

git push origin :master
git push origin master

일반적으로 마지막 매개 변수입니다 git push 형식을 사용합니다 <local_ref>:<remote_ref>, 어디 local_ref 로컬 저장소의 지점 이름이며 remote_ref 원격 저장소의 지점 이름입니다. 이 명령 쌍은 두 개의 속기를 사용합니다. :master Null Local_ref가 있는데, 이는 널 분기를 원격쪽으로 밀어 넣는 것을 의미합니다. master, 즉 원격 분기를 삭제합니다. 아니오가있는 지점 이름 : 주어진 이름의 로컬 브랜치를 동일한 이름으로 원격 브랜치로 밀어 넣습니다. master 이 상황에서는 짧습니다 master:master.

Quick Rant : 여기에 간단한 답변을 게시 한 사람이 없다는 사실은 Git CLI가 전시 한 필사적 인 사용자 퇴치성을 보여줍니다.

어쨌든, 이렇게하는 "명백한"방법은 푸시를 강요하지 않았다고 가정하면 먼저 당기는 것입니다. 이것은 당신이 수정 한 (그리고 더 이상 가지고 있지 않은) 변화를 가져옵니다.

충돌을 해결 한 후에는 다시 밀 수 있습니다.

그래서:

git pull

풀로 오류가 발생하면 로컬 리포지토리 구성에 무언가 잘못되었을 수 있습니다 (.git/config branch 섹션에 잘못된 심판이있었습니다).

그리고 후

git push

어쩌면 당신은 "사소한 병합"에 대해 말하는 주제에 대한 추가 커밋을 얻을 것입니다.

짧은 답변 : 수정 된 커밋을 공개 리포지어로 추진하지 마십시오.

긴 답변 : 몇 가지 git 명령과 같은 명령 git commit --amend 그리고 git rebase, 실제로 기록 그래프를 다시 작성하십시오. 이것은 당신이 당신의 변화를 게시하지 않은 한 괜찮습니다. 그러나 일단 당신이 그렇게하면, 당신은 실제로 당신의 변화를 얻었다면, 그들이 다시 당기려고 할 때, 그것은 실패 할 수 있기 때문에 실제로 역사에 푹 빠져서는 안됩니다. . 커밋을 수정하는 대신 변경 사항에 대한 새로운 커밋을해야합니다.

그러나 실제로 수정 된 커밋을 밀고 싶다면 다음과 같이 할 수 있습니다.

$ git push origin +master:master

선두 + 부호는 "빠른 포워드"커밋을 초래하지 않더라도 푸시가 발생하도록 강요합니다. (빠르게 진행되는 커밋은 당신이 밀고있는 변화가 직계 후손 이미 공개 repo의 변경 사항.)

다음은 이미 만든 후에 변경 사항을 추진하는 매우 간단하고 깨끗한 방법입니다. commit --amend:

git reset --soft HEAD^
git stash
git push -f origin master
git stash pop
git commit -a
git push origin master

다음은 다음을 수행합니다.

  • 지점 헤드를 부모 커밋으로 재설정하십시오.
  • 이 마지막 커밋을 보관하십시오.
  • 원격으로 밀어 넣습니다. 리모컨에는 이제 마지막 커밋이 없습니다.
  • 당신의 은신처를 터뜨리십시오.
  • 깨끗하게 커밋하십시오.
  • 리모컨으로 밀어 넣으십시오.

다른 지점이나 원격에 적용하면 "원산지"및 "마스터"를 변경해야합니다.

현지 수정 커밋을 버리고 새로운 변경 사항을 추가하여 해결했습니다.

# Rewind to commit before conflicting
git reset --soft HEAD~1

# Pull the remote version
git pull

# Add the new commit on top
git add ...
git commit
git push

나는 같은 문제가 있었다.

  • 실수로 이미 밀려난 마지막 커밋을 수정했습니다
  • 현지에서 많은 변경을했고 약 5 번 저지른
  • 밀고, 오류를 얻었고, 당황하고, 원격을 합병하고, 많은 양의 화려 함을 얻지 못하고, 밀고, 실패했습니다.

git-newbie로서 나는 그것이 완전하다고 생각했다 후 바르.

솔루션 : @Bara 제안 +가 지역 백업 지점을 만들었습니다.

# Rewind to commit just before the pushed-and-amended one.
# Replace <hash> with the needed hash.
# --soft means: leave all the changes there, so nothing is lost.
git reset --soft <hash>

# Create new branch, just for a backup, still having all changes in it.
# The branch was feature/1234, new one - feature/1234-gone-bad
git checkout -b feature/1234-gone-bad

# Commit all the changes (all the mess) not to lose it & not to carry around
git commit -a -m "feature/1234 backup"

# Switch back to the original branch
git checkout feature/1234

# Pull the from remote (named 'origin'), thus 'repairing' our main problem
git pull origin/feature/1234

# Now you have a clean-and-non-diverged branch and a backup of the local changes.
# Check the needed files from the backup branch
git checkout feature/1234-gone-bad -- the/path/to/file.php

어쩌면 그것은 빠르고 깨끗한 해결책이 아니며, 나는 내 역사를 잃어 버렸다 (5 대신 커밋 1). 그러나 그것은 하루의 일을 구했다.

코드를 원격 브랜치 (Github/Bitbucket)로 푸시하지 않은 경우 아래와 같이 명령 줄에서 커밋 메시지를 변경할 수 있습니다.

 git commit --amend -m "Your new message"

특정 지점에서 작업하는 경우 다음을 수행하십시오.

git commit --amend -m "BRANCH-NAME: new message"

이미 잘못된 메시지로 코드를 푸시 한 경우 메시지를 변경할 때 조심해야합니다. 즉, 커밋 메시지를 변경 한 후에 다시 밀어 내려고 시도하면 문제가 발생합니다. 매끄럽게하려면 다음 단계를 따르십시오.

하기 전에 전체 답변을 읽으십시오

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

중요 사항: Force Push를 직접 사용하면 다른 개발자가 동일한 지점에서 작업하는 코드 문제가 발생할 수 있습니다. 따라서 이러한 충돌을 피하기 위해 강제 푸시:

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

커밋 메시지가 이미 추진 된 경우 커밋 메시지를 변경할 때 모범 사례입니다.

아무도 당신의 수정되지 않은 커밋을 당기지 않았다는 것을 알고 있다면 --force-with-lease 옵션 git push.

Tortoisegit에서는 "Push ..."옵션 "힘 : 폐기 할 수있는"및 "알려진 변경"에서 동일한 작업을 수행 할 수 있습니다.

힘 (알려진 변화를 폐기 할 수 있음) 원격 저장소가 더 안전하지 않은 비 포드 푸시를 허용 할 수 있습니다. 이로 인해 원격 저장소가 커밋을 잃을 수 있습니다. 조심스럽게 사용하십시오. 이렇게하면 리모컨의 다른 사람들로부터 알려지지 않은 변화를 잃지 않을 수 있습니다. 서버 브랜치가 원격 트래킹 브랜치 (알려진 변경)와 동일한 커밋을 가리 키는지 확인합니다. 그렇다면 힘 푸시가 수행됩니다. 그렇지 않으면 거부됩니다. GIT에는 원격 트래킹 태그가 없으므로이 옵션을 사용하여 태그를 덮어 쓸 수 없습니다.

다음은 이미 만든 후에 변경 사항을 추진하는 매우 간단하고 깨끗한 방법입니다. git add "your files" 그리고 git commit --amend:

git push origin master -f

또는:

git push origin master --force

GIT 리모컨에는 이미 이러한 커밋 파일이 있기 때문에이 오류가 발생합니다. 이 작업을 위해 지점을 강제로 밀어야합니다.

git push -f origin branch_name

또한 팀의 다른 사람이 동일한 지점으로 밀어 넣었을 때 코드를 리모컨에서 가져 오십시오.

git pull origin branch_name

이것은 우리가 커밋을 원격으로 밀어야하는 경우 중 하나입니다.

나는 원격 리포지토리에서 당겨서이 문제를 해결하고 발생하고 커밋 한 다음 밀어 넣은 병합 충돌을 처리해야했습니다. 그러나 나는 더 나은 방법이 있다고 생각합니다.

나는 단지 Git이 나에게 한 말을 계속했다. 그래서:

  • 수정 된 커밋으로 인해 밀 수 없습니다.
  • 나는 제안 된대로 당기기를한다.
  • 병합 실패. 그래서 수동으로 수정합니다.
  • 새 커밋 ( "병합"이라는 레이블)을 만들고 푸시하십시오.
  • 작동하는 것 같습니다!

참고 : 수정 된 커밋은 최신 커밋이었습니다.

여기에서 이전 커밋에서 편집을 수정 한 방법 :

  1. 지금까지 작업을 저장하십시오.
  2. 만약 당신의 변화를 지금 버리십시오. git stash 이제 귀하의 작업 사본은 마지막 커밋 상태에서 깨끗합니다.
  3. 편집과 수정을 만듭니다.
  4. 변경 사항을 저 지르십시오 "개정하다" 방법: git commit --all --amend
  5. 편집자가 로그 메시지를 요청합니다 (기본적으로 이전 로그 메시지). 만족할 때 편집자를 저장하고 종료하십시오.

    새로운 변경 사항은 이전 커밋에 추가됩니다. 직접 참조하십시오 git log 그리고 git diff HEAD^

  6. 만들어진 경우 보관 된 변경 사항을 다시 적용하십시오. git stash apply

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top