이전 커밋이 아닌 특정 커밋을 원격으로 푸시하려면 어떻게해야합니까?


답변:


1087

주어진 커밋을 통해 푸시하려면 다음과 같이 쓸 수 있습니다.

git push <remotename> <commit SHA>:<remotebranchname>

제공은 <remotebranchname>이미 원격에 존재합니다. 그렇지 않은 경우 git push <remotename> <commit SHA>:refs/heads/<remotebranchname>자동 생성에 사용할 수 있습니다 .

이전 커밋 을 푸시 하지 않고 커밋을 푸시 git rebase -i하려면 먼저 커밋을 다시 정렬 하는 데 사용해야 합니다.


66
git push <remotename> <commit SHA>:<remotebranchname>공장. 비결은 git rebase -i원하는 커밋을 첫 커밋으로 옮기고 커밋을 지정하는 것입니다. commit-sha
dminer

29
또 다른 좋은 팁은 당신이 당신이 밀어하려는 커밋의 SHA 복사 있는지 확인하는 것입니다 난 그냥 :)했던 것처럼, 그 전에 REBASE -i을하고, 그리고
estan

33
원격 브랜치가 아직 존재하지 않으면 실패합니다. 로 분기를 만들 수 있습니다 git push <remotename> <commit SHA>:refs/heads/<new remote branch name>. 그런 다음 답변이 설명하는대로 누릅니다.
웨스 Oldenbeuving

32
예를 들어, 표준 커밋으로 마지막 커밋을 제외한 모든 것을 푸시합니다 git push origin HEAD~1:master.
artless noise

3
또한 나중에 SHA를 해당 원격 지점으로 푸시 한 경우이 SHA를 강제로 밀어야합니다. -f깃발을 사용하십시오 .
Ian Vaughan 2018 년

79

다른 답변은 재정렬 설명에 부족합니다.

git push <remotename> <commit SHA>:<remotebranchname>

하나의 커밋을 푸시하지만 그 커밋은 로컬 커밋되지 않은 커밋 중 가장 오래된 커밋이어야하며 내 의견으로는 모호한 설명 인 top, first 또는 tip 커밋과 혼동해서는 안됩니다. 커밋은 가장 오래된 커밋, 즉 가장 최근 커밋에서 가장 먼 커밋이 필요합니다. 가장 오래된 커밋이 아닌 경우 가장 오래된 로컬 푸시되지 않은 SHA에서 지정된 SHA 로의 모든 커밋이 푸시됩니다. 커밋을 재정렬하려면 다음을 사용하십시오.

git rebase -i HEAD~xxx

커밋을 재정렬 한 후에는 커밋을 원격 리포지토리로 안전하게 푸시 할 수 있습니다.

요약하면, 나는

git rebase -i HEAD~<number of commits to SHA>
git push origin <post-rebase SHA>:master

단일 커밋을 원격 마스터 브랜치에 푸시합니다.

참고 문헌 :

  1. http://blog.dennisrobinson.name/push-only-one-commit-with-git/
  2. http://blog.dennisrobinson.name/reorder-commits-with-git/

또한보십시오:

  1. git : 로컬 리베이스 후 풀 커밋 후 중복 커밋
  2. git : 단일 커밋 푸시, rebase로 재정렬, 중복 커밋

3
일부 출처에서는 이것을 허용하지 않을 수 있습니다. 예를 들어 GitLab을 사용하면 '이 프로젝트의 보호 된 분기에 푸시 코드를 강제로 허용하지 않습니다.'를 참조하십시오. 내가 강요하는 것을 생각하지 않고 정상적인 푸시를하고 있기 때문에 조금 이상합니다. '강제'없이 어떻게 할 수 있습니까?
Ed Avis

1
@Ed Shoudln은 강제로 밀어 넣을 필요가 없습니다. 특정 자식 설정에 문제가있는 것 같습니다. 아마도 원격 HEAD 커밋을 다시 기반으로 했습니까? 보호 된 분기가 무엇인지 모르겠습니다. 허가 문제처럼 들립니다.
사무엘

1
사무엘-말이 되겠지만 git rebase -i는 원격 HEAD보다 늦은 로컬 커밋 만 보여 주므로 어떻게 할 수 있었는지 모르겠습니다.
Ed Avis

1
사무엘-실제로 부분 푸시를 할 수 있으므로 무엇이 잘못되었는지 알지 못하지만 원격 HEAD에서 파생되지 않은 커밋을 다른 방식으로 푸시하려고 시도해야했습니다.
Ed Avis

1
@ Ed 당신은 "git rebase -i는 원격 HEAD보다 늦은 로컬 커밋만을 보여줍니다"라고 말했지만 이것이 사실이라고 생각하지 않습니다. 나는 원격 HEAD를 지나서 테스트하고 리베이스 할 수있었습니다.
사무엘

25

git rebase -i;를 사용하는 것이 좋습니다 . 푸시하려는 커밋을 커밋 맨 위로 이동하십시오. 그런 다음 git logrebased commit의 SHA를 가져 와서 확인한 다음 밀어 넣으십시오. 리베이스는 다른 모든 커밋이 이제 푸시 한 것의 자식임을 보장하므로 향후 푸시도 잘 작동합니다.


3
당신은 아마 이동 완전한 예 esp를 줄 수 있습니까? git log단계를 다시 ?
Drux

4
메시지 "A", "B", "C"가 순서대로 커밋 된 비교적 독립적 인 커밋이 3 개 있고 "B"를 푸시한다고 가정합니다. 'git rebase -i'는 당신과 세 사람 모두를 나열하는 편집기를 가져와야한다. B를 위로 이동하고 저장 / 종료하십시오. 'git log --pretty = oneline -n3'은 B, A, C를 각 메시지 앞에 해시로 나열하고 B는 마지막으로 표시합니다. 'git checkout -b temp $ hash_of_B; git push '는 그 시점에서 B를 밀어야합니다. 그런 다음 아마도 'git checkout -b master; git branch -d temp '는 로컬 마스터 브랜치에 있다고 가정하여 이전 상태로 돌아갑니다. 해당되는 경우 교체하십시오.
Walter Mundt

1
+1 리베이스 푸시 리베이스 후 "git gods의 분노" 를 본 적이 있습니까? (실수로 우연히 일어날 수도 있을까요?)
Drux

2
내 대답을주의 깊게 읽으면 푸시 는 리베이스 이후 에만 발생 하고 리베이스 된 커밋은 아직 푸시되지 않은 다른 커밋 위로 이동한다는 것을 알 수 있습니다. 일단 커밋이 푸시되면, 일반적으로 커밋 된 것으로 간주됩니다. 나중에 rebasing에 혼자 두십시오. 이 기술은 여러 로컬 변경 사항을 올바른 순서로 정렬하여 적용 할 수 있도록하기위한 것입니다. 추적을 올바르게 설정하면 다른 인수가없는 'git rebase -i'가 기본적으로 푸시 커밋을 표시하지 않으므로 다른 방법보다 사고로부터 안전합니다.
Walter Mundt

21

Cherry-pick은 특정 커밋을 추진하면서 다른 모든 방법과 비교하여 가장 잘 작동합니다.

그렇게하는 방법은 다음과 같습니다.

새로운 지점 만들기-

git branch <new-branch>

원점으로 새 지점을 업데이트하십시오.

git fetch

git rebase

이러한 조치를 통해 원산지와 정확히 동일한 물건을 확보 할 수 있습니다.

sha id당신이하고 싶은 체리 선택 -

git cherry-pick <sha id of the commit>

당신은 sha id실행 하여 얻을 수 있습니다

git log

원점으로 푸시-

git push

실행 gitk당신이 원하는 동일한 방식으로 그 모든 것을 볼 보인다.


2
사용 git rebase -i위의 솔루션을 제안 이상적인 솔루션이 될 것입니다. 체리 피킹은 커밋을 복제하려는 경우에만 사용해야합니다.
Vinay Bhargav

13

나는 당신이 그 커밋으로 돌아가서 "git revert"를해야한다고 생각한다. 또는 cherry-pick새 브랜치를 커밋하고이를 원격 리포지토리의 브랜치로 푸시 할 수 있습니다. 다음과 같은 것 :

git branch onecommit
git checkout onecommit
git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544 # From the other branch
git push origin {branch}

9
자식 되돌리기 여기 나쁜 생각이다 - 그것은 만드는 새로운 커밋
하센

1
@ hasen : cherry-pick원하는 커밋을 할 수 있습니다.
Josh K

4
되돌리기와 체리 픽 모두 나쁜 생각입니다. git rebase -i는 당신의 친구입니다. 아래 Walter Walterdt의 답변을보십시오.
Nicolas C

3
@Nicolas, 왜 체리 픽이 나쁜 생각입니까?
Antoine

3
@Antoine, 일반적으로 지점이 출발지에서 추적하는 지점과 동기화 상태를 유지하려고합니다. 체리 픽을 선택하면 복사 / 붙여 넣기를 수행하는 것이며 언젠가는 푸시되지 않은 사본을 처리해야합니다. -i를 rebase하는 경우 "잘라 내기 및 붙여 넣기"를 수행하고 분기를 원하는 위치까지 리모컨과 동기화 된 상태로 유지하십시오.
Nicolas C

0

다른 디렉토리에서 다음을 수행 할 수도 있습니다.

  • git clone [저장소]
  • 원래 저장소의 .git 디렉토리를 지금 방금 복제 한 저장소의 .git 디렉토리로 겹쳐 쓰십시오.
  • git add 및 git commit 원본
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.