리모트 Git 저장소에 수정된 커밋을 푸시하려면 어떻게 해야 합니까?
소스코드를 조금 조작하면, 통상의 커밋을 실시해, 리모트 저장소에 푸시 했습니다.그런데 소스코드로 수입품을 정리하는 걸 깜빡했어요.따라서 이전 커밋을 대체하기 위해 수정 명령을 수행합니다.
> 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/'
어떻게 해야 하나요? (리모트 저장소에 액세스할 수 있습니다.)
실 with i i i with with with i 。--force
★★★★★★★★★★★★★★★★★」.git
저장소에서 Linus BIG TIME에게 혼났다.일반적으로 이것은 다른 사람들에게 많은 문제를 일으킨다.간단한 대답은 "하지 마세요"입니다.
어쨌든 다른 사람들이 그렇게 하는 비법을 알려준 것 같으니까 여기서 반복하지 않을게요.단, --force(또는 +master)를 사용하여 수정된 커밋을 푸시한 후 이 상황에서 회복하기 위한 힌트가 있습니다.
git reflog
수.old
수정해서new
를 참조해 주세요.- 지지 create between between between between between 사이에 마지를 .
old
★★★★★★★★★★★★★★★★★」new
하고 있습니다.new
,맘에 들다git checkout new && git merge -s ours old
. - 과 합치세요.
git merge master
- 하고, 「」의 과 같이 입력합니다.
git push . HEAD:master
- 결과를 밀어냅니다.
후 수정 및하게 된 .Marge는 하는 것을 알 수 .new
에 걸쳐서old
에서는, 「Marge」와「Marge」의 을 볼 수 old
★★★★★★★★★★★★★★★★★」new
당신의 수정으로 인한 것이므로 그들은 고통받을 필요가 없습니다.
Git 안전 기능이 표시됩니다.Git은 브랜치에서의 리모트브런치 갱신을 거부합니다.브런치 헤드 커밋은 현재 푸시하고 있는 브랜치 헤드 커밋의 직계가 아니기 때문입니다.
그렇지 않은 경우, 같은 저장소로 동시에 푸시하는 두 사람은 새로운 커밋이 동시에 들어오는 것을 알지 못할 것이고, 마지막에 푸시하는 사람은 어느 쪽도 이를 깨닫지 못한 채 이전 푸시어의 작업을 잃게 될 것입니다.
대상이라는 를 강제로수 .-f
환합니니다다
git push -f origin master
「Fastforward push」를 수에 이 하지 않을 수 .receive.denynonfastforwards
이 경우 거부 이유는 다음과 같습니다('리모트 거부' 부분 참조).
! [remote rejected] master -> master (non-fast forward)
이 문제를 해결하려면 원격 저장소의 구성을 변경하거나 더티 해커로서 다음과 같이 브랜치를 삭제하고 재생성해야 합니다.
git push origin :master
git push origin master
으로 마지막 는 " " " 입니다.git push
합니다.<local_ref>:<remote_ref>
서, snowledge.local_ref
이며, 이 브런치 이름은 "Local Repository" 입니다.remote_ref
는 리모트 저장소상의 브랜치 이름입니다.이 명령어 쌍은 2개의 쇼트랜드를 사용합니다. :master
에는 늘 늘 local_ref에 것을 합니다.이것은 늘 브런치를 리모트 측에 푸시하는 것을 의미합니다.master
이치노에는 '''('')이 .:
는 지정된 이름의 로컬브런치를 같은 이름의 리모트브런치에 푸시하는 것을 의미합니다. master
말하면master:master
.
빠른 외침:Git CLI에 의해 나타나는 필사적인 사용자 적대성을 보여주는 간단한 답변을 여기에 게시한 사람이 아무도 없다는 사실은 증명한다.
어쨌든, 이 "명백한" 방법은, 당신이 강요하려고 하지 않았다고 가정하고, 먼저 당기는 것입니다.이렇게 하면 수정한 변경(더 이상 적용되지 않음)이 다시 적용되도록 꺼집니다.
충돌이 해결되면 다시 푸시할 수 있습니다.
그래서:
git pull
풀에서 오류가 발생할 경우 로컬 저장소 구성에 문제가 있을 수 있습니다(.git/config 브랜치 섹션에 잘못된 참조가 있습니다).
그리고 그 후
git push
어쩌면 당신은 "자질적인 합병"에 대해 말하는 주제에 대한 추가 커밋을 받게 될 것이다.
간단한 답변:수정된 커밋을 공개 보고에 강요하지 마십시오.
답변: (예: 변 git git git Git 、 를,,,, , long,, )git commit --amend
★★★★★★★★★★★★★★★★★」git rebase
실제로 그래프를 고쳐 씁니다.변경 사항을 공개하지 않는 한 괜찮습니다만, 일단 공개하고 나면 역사를 가지고 장난쳐서는 안 됩니다.누군가 이미 당신의 변경 내용을 입수했다면 다시 꺼내려고 할 때 실패할 수도 있기 때문입니다.커밋을 수정하는 대신 변경 사항을 사용하여 새로운 커밋을 작성해야 합니다.
단, 수정된 커밋을 정말로 푸시하려면 다음과 같이 할 수 있습니다.
$ git push origin +master:master
★★+
sign을 지정하면 "fast-forward" 커밋이 되지 않더라도 푸시가 강제로 발생합니다.(퍼블릭 리포에 이미 있는 변경의 직계인 경우, 고속 전송 커밋이 발생합니다).
에서는 이미 을 한 수 매우 .commit --amend
:
git reset --soft HEAD^
git stash
git push -f origin master
git stash pop
git commit -a
git push origin master
그 결과, 다음과 같은 것이 실현됩니다.
- 브랜치 헤드를 부모 커밋으로 리셋합니다.
- 이 마지막 커밋을 저장합니다.
- 리모트로 강제 푸시합니다.리모콘에 마지막 커밋이 없습니다.
- 은닉처를 터트려라.
- 깨끗이 약속하다.
- 리모트로 누른다.
해 주세요.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 초보로서, 나는 그것이 완전한 FUVAR이라고 생각했다.
솔루션:@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?
중요사항:강제 푸시를 직접 사용하면 다른 개발자가 동일한 분기에서 작업 중인 코드 문제가 발생할 수 있습니다.따라서 이러한 충돌을 방지하려면 강제 푸시를 수행하기 전에 분기에서 코드를 풀어야 합니다.
git commit --amend -m "BRANCH-NAME : your new message"
git pull origin BRANCH-NAME
git push -f origin BRANCH-NAME
커밋 메시지가 이미 푸시된 경우 이를 변경하는 것이 가장 좋은 방법입니다.메시지를 변경할 때의 베스트프랙티스입니다
변경되는 메시지가 저장소에 대한 최신 커밋인 경우 다음 명령을 수행합니다.
git commit --amend -m "New message"
git push --force repository-name branch-name
주의: --force를 사용하는 것은 최신 커밋 후 다른 사용자가 저장소를 복제하지 않은 것이 확실하지 않으면 권장하지 않습니다.
보다 안전한 대안은 다음을 사용하는 것입니다.
git push --force-with-lease repository-name branch-name
★★★★★★★★★★★★★★★와 달리--force
--force-with-lease
는 저장소에 업스트림 변경이 있을 경우 중단됩니다.
되지 않은 커밋을 를 합니다.--force-with-lease
" " " "git push
.
TortoiseGit에서는 "밀기..." 옵션에서 동일한 작업을 수행할 수 있습니다. "Force:폐기 가능" 및 "알려진 변경 사항"을 확인합니다.
Force(이미 알려진 변경 사항을 폐기할 수 있음)를 사용하면 원격 저장소에서 더 안전한 비고속 푸시를 받아들일 수 있습니다.이로 인해 원격 저장소의 커밋이 손실될 수 있습니다. 주의하여 사용하십시오.이것에 의해, 리모트상의 다른 유저로부터 알 수 없는 변경이 없어지는 것을 막을 수 있습니다.서버 브랜치가 리모트트래킹 브랜치와 같은 커밋을 가리키고 있는지 확인합니다(기존의 변경).있을 경우 강제 푸시가 수행됩니다.그렇지 않으면 거부됩니다.git에는 원격 추적 태그가 없기 때문에 이 옵션을 사용하여 태그를 덮어쓸 수 없습니다.
Visual Studio Code를 사용하는 경우 이 확장자를 사용하여 보다 쉽게 사용할 수 있습니다.
https://marketplace.visualstudio.com/items?itemName=cimdalli.git-commit-amend-push-force
이름에서 알 수 있듯이 명령어가 연속적으로 실행됩니다.
git commit --amend
git push --force
Git 리모트에 이러한 커밋 파일이 이미 있기 때문에 이 에러가 발생하고 있습니다.이 작업을 수행하려면 분기를 강제로 밀어넣어야 합니다.
git push -f origin branch_name
또, 팀의 다른 사람이 같은 브랜치로 푸시 했을 가능성이 있기 때문에, 리모트로부터 코드를 풀 해 주세요.
git pull origin branch_name
이것은, 강제적으로 커밋을 리모트에 푸시 할 필요가 있는 경우의 하나입니다.
다음과 같은 방법으로 간단하고 안전하게 작업을 수행할 수 있습니다.
- 을 다음과 같이 수정합니다.
git commit --amend
해도 상관없습니다. git pull
로컬 레포와 리모트 레포의 동기화를 실시합니다.- 풀 후 로컬과 리모트의 경합이 발생합니다.현재의 변화를 받아들이고 다시 약속하면 됩니다.
git push
이제 로컬 및 원격 보고서가 업데이트되고 보고서 기록을 변경할 필요가 없습니다.
에서는 이미 을 한 수 매우 .git add "your files"
★★★★★★★★★★★★★★★★★」git commit --amend
:
git push origin master -f
또는 다음과 같이 입력합니다.
git push origin master --force
이 경우 --force를 사용해야 합니다.
기준:
.git push origin <branch-name> -f
또는 force
이치노주로 당신이 항상 깨끗한 GIT 이력을 원하기 때문입니다.
내가 뭘 하겠어?
- 하는 사람이 , 는 그렇게 .
git commit --amend
, , , 「 」git push -f ...
에게 알릴 것을 알린다.git pull --rebase
변경 내용을 확인할 수 있습니다. - MR 에 이와 일이 하고 PR 끝에 합니다.
squash
역사를 씻을 수 있습니다.
리모트 레포에서 꺼낼 때 발생하는 이 문제를 수정하고 발생, 커밋, 푸시하는 머지 충돌에 대처해야 했습니다.하지만 더 좋은 방법이 있을 것 같아.
나는 Git이 시키는 대로 했을 뿐이다.그래서:
- 수정된 커밋으로 인해 푸시할 수 없습니다.
- 나는 제안대로 당긴다.
- 병합이 실패하여 수동으로 수정합니다.
- 새로운 커밋('머지' 라벨)을 생성하여 푸시합니다.
- 효과가 있는 것 같아요!
주의: 수정된 커밋이 최신 커밋입니다.
커밋의 작성자 및 커밋자를 변경할 때 다음 사항이 도움이 되었습니다.
git push -f origin master
Git은 이것이 메타 정보 부분에서만 다른 동일한 델타 커밋이라는 것을 알 수 있을 만큼 똑똑했다.
로컬 헤드 및 리모트헤드 모두 문제의 커밋을 가리켰습니다.
여기에서는 이전 커밋에서의 편집 수정 방법:
지금까지의 일은 아껴두세요.
:
git stash
마지막 커밋 상태에서 작업 복사본이 깨끗해졌습니다.편집 및 수정을 실시합니다.
"수정" 모드에서 변경을 커밋합니다.
git commit --all --amend
로그 메시지(기본적으로 오래된 로그 메시지)를 요구하는 편집기가 나타납니다.저장했다가 마음에 들면 편집기를 종료합니다.
새로운 변경이 오래된 커밋에 추가됩니다. 확인하세요.
git log
★★★★★★★★★★★★★★★★★」git diff HEAD^
변경 사항을 다시 합니다.
git stash apply
강제 푸시를 피하기 위해 원격 베어 저장소에서 다음 명령을 사용하여 마지막 커밋(수정할 커밋)을 삭제합니다.
git update-ref HEAD HEAD^
그런 다음 수정된 커밋을 충돌 없이 푸시합니다.
주의: 이것은 그 사이에 잘못된 커밋을 한 사람이 없다는 것을 전제로 하고 있습니다.이 경우 마찬가지로 다시 감았다가 다시 당겨야 하며, 변경 사항을 병합할 수도 있습니다.
언급URL : https://stackoverflow.com/questions/253055/how-do-i-push-amended-commit-to-the-remote-git-repository
'source' 카테고리의 다른 글
ASP란?NET Identity의 IUser Security Stamp Store 인터페이스 (0) | 2023.04.22 |
---|---|
Observable Collection과 Binding List의 차이 (0) | 2023.04.17 |
WPF 바인딩을 강제로 새로 고치는 방법 (0) | 2023.04.17 |
sed/grep을 사용하여 두 단어 사이에 텍스트를 추출하는 방법은 무엇입니까? (0) | 2023.04.17 |
프로그램을 실행하면 "bash: ./program permission denied"라고 표시됩니다. (0) | 2023.04.17 |