2012-02-09 4 views
1

가 여기 내 gitk이입니다 (: Merging commits from branch to master -> odd-looking tree를, 나는이 질문에서 생각 개선이 @amber 감사) :이 git 트리를 수정하고 병합하는 방법은 무엇입니까?

지점 frontend는 왼쪽에 있습니다. 오른쪽 하단에 masterremotes/origin/master의 팁이 노란색으로 표시됩니다. 추가 '의 커밋이 하나 하나 (마스터'나는 frontend을 추가 할 수 있습니다 방법

  1. :

    gitk --all git tree
    은 내가가 문제의 약 36 시간 통해 봤는데 두 가지 일을 할 필요가 지연된 ') 그래서 그들을 밀어 수 있습니까? 나는 많은 코드가 관련되어 있기 때문에 전체 브랜치를 병합하고 싶지 않고, 두 브랜치는 작동하지 않는 나무를 가지고있다.

  2. frontend 주위에 두 개의 동일한 '대량 업데이트'항목이있는 것처럼 보이지만 상단/왼쪽에는 분기가 없습니다. 맨 위로 분기가없는 bulk update 항목을 없애려면 2 개의 깨끗한 가지가 있습니까? 내가이처럼 보이는 한 싶습니다

    | # frontend 
    | # Bulk update. 
    | # ...commits... 
    | # move this frontend commit to master 
    | | #master's changes 
    | | #master, remotes/origin/master, remotes/staging/master 
    

정말이 나 자신 만 마지막 날과 투쟁의 절반을 사랑 내가 입력 한 내용에 조금 부정확 종종 결과를 보여 주었다 그것을 더 어지럽히는데.

답변

0

Q & A 형식을 따르려면 질문을 두 개의 별도 SO 질문으로 나누어야합니다. 그는 말했다되는 : <sha>master에 추가 할 frontend의 각 체크인에 대한 참조가 어디

  1. 체크 아웃 마스터와는 git cherry-pick -e <sha>를 사용합니다. 따라서 먼저 git cherry-pick -e <sha of 'adding delay'>을 사용하십시오. 체리를 원하는 순서대로 골라서 원하는 체크 인을 frontend에서 다른 순서로 정렬 할 수 있습니다. master. http://technosophos.com/content/git-cherry-picking-move-small-code-patches-across-branches을 참조하십시오.

    대안은 rebase하는 것이지만, 메커니즘에 익숙하지 않은 경우 cherry-pick을 사용하는 것보다 약간 혼란 스러울 수 있습니다. 먼저 Repo 복제본에서이 접근법을 실험 해 보시기 바랍니다. 당신은 언제나 내가 말하고있는 것을 되돌릴 수는 있습니다. 그러나 이미 시간을 보내고 있다면 그것을하는 법을 알아내는 데 시간을 낭비하고 싶지는 않습니다.

    먼저 체크 아웃 frontend을 작성한 다음 실제로 프론트 엔드를 제거하지 않으므로 새 분기 tmp을 작성하십시오.

    다음은 git rebase -i --onto master master tmp입니다. 이렇게하면 프론트 엔드 지점에 있던 원하는 순서대로 마스터 체크인 후에 제출할 수표를 제거하고 다시 정렬하는 편집기가 나타납니다.

    당신은 당신이 주인을 원하는 체크 아웃 master 있도록 git reset --hard tmp을하고 tmp 지점 git branch -d tmp을 제거 곳이 될 것 tmp 함께 할 때.

    Pro Git에는 rebase에 대한 유용한 정보가 있지만 유스 케이스에 개념을 적용했습니다. http://progit.org/book/ch3-6.html

  2. 먼저 일괄 변경 내용이 실제로 중복되어 있는지 확인하십시오.차이점을 확인하려면 git diff <sha of bulk1> <sha of bulk2>을 할 수 있습니다. 그것이 동일하거나 그렇지 않다면, 목록에서 그것을 제거하기위한 열쇠는 당신이 어느 시점에서 자식에게 주었던 은닉을 제거하는 것입니다. 복제본이 아닌 경우 숨김을 제거하기 전에 차이점에 대해 수행 할 작업을 결정해야합니다.

    지점에서 git stash pop을 수행하는 동안 stash에서 저장 한 내용을 실제로 원하지 않는 경우 git reset --hard HEAD을 수행하십시오. 그 시점에서 gitk를 재실행하면 (새로 고침하지 말 것) 왼쪽 상단의 해당 항목이 제거 된 것을 볼 수 있습니다. 귀하의 gitk 그래프는 stash가 master로부터 색인이 끊어 졌음을 보여 주므로, stash를 사용하여 작업 할 곳을 알 수 있습니다. 그러나 어느 분기에서 가장 좋은지 알 수 있습니다 (master 또는 frontend).

    git stash pop을 사용하여 저장하고있는 변경 사항을 제출하면 사라집니다. gitk에 분기 히스토리가있는 유일한 이유는 git이 숨김의 차이점을 어떻게 다시 생성 하는지를 보여주는 것입니다. 그 은닉계를 터뜨리면 은닉계의 모든 조상을 잊어 버릴 것입니다. 그것은 당신이 그것을 터뜨린 곳으로 은닉하는 것과 같습니다.

    @Jefromi 당신이 그들로부터 아무것도 필요하지 않은 경우 단지 숨김을 제거하는 청소기 접근 방식을 가지고, 이러한 그의 정확한 단어 아니지만, 그는 제안 무엇 :

    사용 git stash clear 모든 숨겨 놨다을 제거 할 수 있습니다. git stash drop [email protected]{n}을 사용하면 그 중 하나를 삭제할 수 있습니다. n이 무엇인지 확인하려면 git stash list을 사용하십시오.

+1

이것은 모두 정확합니다. 두 번째 질문에 대해 조금 벗어났습니다. 커밋은 스냅 샷 이상이며 메타 데이터도 포함됩니다. 이 두 커밋에는 동일한 트리가 있지만 다른 메시지 (및 타임 스탬프)가있을 수 있습니다. 그리고 여러분은 중요한 것을 빠뜨 렸습니다. 그 커밋의 두 번째 버전은'git commit --amend'에 의해 만들어졌습니다. 커밋을 수정하면 새로운 커밋이 만들어지고, 이전 커밋은 매달려 있어야한다는 것을 아는 것이 중요합니다. 이 경우에는 거기에 기반한 은닉으로 고정됩니다. – Cascabel

+0

숨김을 터뜨리는 것에 관해서는 : 프론트 엔드 브랜치의 컨텍스트에서 의미가있는 작업을 숨겨 놓을 가능성이 있기 때문에 숨김을 터뜨리는 것에 관해서는 아마 마스터에서하고 싶지 않을 것입니다. 그 내용이 중요하다면, 프론트 엔드를 터지기 전에 체크 아웃하고 싶을 것입니다. 던져 버리기를 원한다면'git stash clear '을 사용하여 모든 숨김을 지울 수 있습니다.'git stash drop stash @ {n}'을 사용하면 그걸 지울 수 있습니다 ('git stash list'를 사용하여'n' 해야한다). – Cascabel

+0

@ Jefromi 감사합니다. 커밋의 고유성을 바꿀만한 다른 것들이 무엇인지를 기억하지 못했습니다. 나는 나의 대답을 업데이트했다. – James

관련 문제