programing

어떻게 당신의 지역 깃 커밋 중 일부만 푸시합니까?

projobs 2023. 6. 23. 23:43
반응형

어떻게 당신의 지역 깃 커밋 중 일부만 푸시합니까?

5개의 로컬 커밋이 있다고 가정합니다.그 중 2개만 중앙 집중식 repo(SVN 스타일 워크플로우 사용)에 푸시하고 싶습니다.이거 어떻게 하는 거지?

이것은 작동하지 않았습니다.

git checkout HEAD~3  #set head to three commits ago
git push #attempt push from that head

그러면 5개의 로컬 커밋이 모두 푸시됩니다.

실제로 커밋을 실행 취소하기 위해 리셋을 할 수 있다고 생각합니다. 그 다음에는 git stash를 실행하고 git push를 실행할 수 있습니다. 하지만 이미 커밋 메시지가 작성되어 있고 파일이 정리되어 있어서 다시 실행하고 싶지 않습니다.

푸시 또는 리셋으로 전달된 플래그가 작동할 것 같습니다.

도움이 된다면, 여기 제 Git 구성입니다.

[ramanujan:~/myrepo/.git]$cat config 
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = ssh://server/git/myrepo.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master

커밋이 마스터 분기에 있고 원격 마스터 분기에 커밋을 푸시하려는 경우:

$ git push origin master~3:master

git-svn을 사용하는 경우:

$ git svn dcommit master~3

git-svn의 경우 커밋이 예상되므로 HEAD~3도 사용할 수 있습니다.스트레이트 깃의 경우 HEAD가 refspec에서 제대로 평가되지 않기 때문에 분기 이름을 사용해야 합니다.

또한 다음과 같은 접근 방식을 더 길게 적용할 수도 있습니다.

$ git checkout -b tocommit HEAD~3
$ git push origin tocommit:master

이러한 유형의 작업 흐름을 습관화하는 경우 별도의 지점에서 작업을 수행하는 것을 고려해야 합니다.그런 다음 다음과 같은 작업을 수행할 수 있습니다.

$ git checkout master
$ git merge working~3
$ git push origin master:master

"origin master:master" 부분은 설치 시 선택 사항일 수 있습니다.

단답:

git push <latest commit SHA1 until you want commits to be pushed>

예:

git push origin fc47b2:master

git push origin HEAD~2:main

긴 답변:

커밋은 상위/하위 메커니즘과 체인으로 연결됩니다.따라서 커밋을 푸시하면 원격에서 알 수 없는 경우 실제로 모든 상위 커밋이 이 커밋으로 푸시됩니다.이 작업은 암시적으로 다음과 같은 경우에 수행됩니다.git push현재 커밋: 이 명령이 다음과 동일하기 때문에 이전 커밋도 모두 푸시됩니다.git push HEAD.

따라서 질문은 특정 커밋을 푸시하는 방법으로 다시 작성될 수 있으며 이 특정 커밋은 HEAD~2일 수 있습니다.

푸시할 커밋이 연속되지 않은 경우 다음과 같이 다시 정렬합니다.git rebase -i구체적인 추진 전에.

제가 하는 일은 "일"이라는 지역 지부에서 일하는 것입니다.이 분기에는 업스트림 리포지토리에 푸시하지 않을 임시 커밋(예: 해결 방법, 개인 빌드 옵션 등)이 모두 포함되어 있습니다.저는 해당 분기에서 계속 작업한 다음 마스터 분기로 전환하고, 커밋할 적절한 커밋을 선택한 다음 마스터를 푸시합니다.

브랜치로 후, I 트림에서마브스랜변로가을져온후항사경치,git checkout work그리고.git rebase master그것은 역사의 끝에 있는 나의 모든 지역적 변화를 다시 씁니다.

실제로 사용하고 있습니다.git svn워크플로우를 하여 저의 에는 "작업", "작업"이 포함됩니다.git svn dcommit저는 또한 마스터할 적절한 커밋을 선택하기 위해 좋은 텍스트 모드 GUI 저장소 뷰어를 사용합니다.

기본적으로 git-push는 모든 분기를 푸시합니다.이 작업을 수행할 때:

 git checkout HEAD~3  #set head to three commits ago
 git push #attempt push from that head

분리된 HEAD(지점에 없음)로 이동한 다음 로컬 마스터(아직 있던 위치)를 포함하여 모든 분기를 원격 마스터로 푸시합니다.

수동 솔루션은 다음과 같습니다.

 git push origin HEAD:master

모든 분기를 푸시하는 기본 동작이 혼란스럽거나 위험할 경우 ~/.gitconfig에 다음을 추가합니다.

 [remote.origin]
    push = HEAD

그러면 당신이 있는 나뭇가지만 밀립니다.예제(헤드 분리)에서는 잘못된 커밋을 실수로 푸시하지 않고 다음과 같은 오류 메시지가 표시됩니다.

 error: unable to push to unqualified destination: HEAD

원하는 경우 "gitrebase"를 사용하여 커밋을 다시 정렬합니다.

git rebase -i

이 명령은 편집기에 이와 같은 내용을 표시합니다(나는 vim을 사용합니다).

pick 4791291 commitA
pick a2bdfbd commitB
pick c3d4961 commitC
pick aa1cefc commitD
pick 9781434 commitE

# Rebase ..............
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out




^G Get Help         ^O WriteOut         ^R Read File        ^Y Prev Page                ^K Cut Text         ^C Cur Pos
^X Exit             ^J Justify          ^W Where Is         ^V Next Page            ^U UnCut Text       ^T To Spell

단순 잘라내기 붙여넣기를 사용하여 원하는 대로 커밋 순서를 변경합니다.새 주문이 다음과 같다고 가정합니다.

9781434 커밋을 선택합니다.e

c3d4961 커밋 선택c

4791291 커밋을 선택합니다.a

aa1cefc 커밋을 선택합니다.d

2bdfbd 커밋B를 선택합니다.

편집기에서 이러한 내용을 변경하고 ctrl+O(writeOut)를 누릅니다.

또는 사용할 수 있습니다.

git rebase -i HEAD~<commitNumber>

다음을 통해 새 시퀀스를 확인할 수 있습니다.

git log

지금 사용

git push <remoteName> <commit SHA>:<remoteBranchName>

원격(원본) 및 로컬(마스터)에 분기가 하나만 있는 경우에는

git push <commit SHA>
git push aa1cefc

이렇게 하면 commitB와 commitD가 푸시됩니다.

언급URL : https://stackoverflow.com/questions/604399/how-do-you-push-only-some-of-your-local-git-commits

반응형