2011-08-05 15 views
5

zip 스냅 샷에서 회고 프로젝트 기록을 작성 중입니다. 나는 이미 손에 넣을 스냅 샷에서 커밋의 긴 지점 시퀀스를 만들었습니다. 나는 이제 커밋 시퀀스 중간의 여러 위치에 있어야하는 '발견 된'스냅 샷을 끝에 추가했습니다.git : 커밋 순서를 재정렬하는 방법 (심각하게)

git rebase -i <startCommit>을 사용하여 git 스냅 샷을 재정렬하려고합니다. 나는 픽크리스트 순서를 바꿔 치기 만하면된다. 이는 단순히 커밋 개체를 다시 작성하지만 스냅 샷이 변경되지 않았기 때문에 기본 트리를 동일하게 유지하는 경우입니다.

리베이스 (rebase)처럼 보입니다.이 경우에는 간단한 재배치가 아니라 패치를 작성하고 많은 충돌이 발생하려고합니다. 이 특별한 경우에 대해 더 적절한 명령이 있습니까? 나에게는 합병이없고 오직 하나의 가지 만있다. 전체 레포는 여전히 매우 지역적이고 사적입니다.

+1

'git rebase'는 커밋이 실제로 트리가 아니라 변경 사항에 의해 식별되는 것으로 가정합니다. 당신이하려는 일은 아주 드문 일입니다. 그래서 git의 도자기 부분은별로 도움이되지 않을 것이고 배관을 사용해야 할 것입니다. – svick

+0

[이 사용자 지정 병합 드라이버]를 사용하는 경우 궁금하네요 (http://stackoverflow.com/questions/928646/how-do-i-tell-git-to-always-select-my-local-version-for- conflict-merges-on-a-sp/930495 # 930495) 또는 유사하게 작동합니다. –

+0

@Karl : 나는 그것이하는 일을 최소한 이해하는 방법을 통해 좋은 모습을 보일 것입니다. 빠른보기는 내 Windows를 간소화하면 Adymitruk의 방법보다 앞섰다. <-> 리눅스 혼란 ;-) –

답변

3

리베이스로 고민하지 마십시오. 새로운 지점을 만드십시오. X가 sha1이거나 사용 커밋 중 treeish 인 경우 :

git checkout X -- . 
git add -A 
git commit -C X 

원하는 순서대로 모든 커밋을 반복합니다.

우리는 지난 5 커밋의 역순 예 :이 도움이

git checkout -b temp old_branch~5 
git checkout old_branch -- . 
git add -A 
git commit -C old_branch 
git checkout old_branch~1 -- . 
git add -A 
git commit -C old_branch~1 
git checkout old_branch~2 -- . 
git add -A 
git commit -C old_branch~2 
git checkout old_branch~3 -- . 
git add -A 
git commit -C old_branch~3 
git checkout old_branch~4 -- . 
git add -A 
git commit -C old_branch~4 

git push . HEAD:old_branch -f 
git checkout old_branch 
git branch -d temp 

git log -5 # to see the new history 

희망을.

+0

필자는이 문제를 해결할 수 있다고 생각하지만 커밋 sha1s 목록을 얻기 위해 초기 리베이스를 사용하는 것을 비꼬아 설명합니다. 주로 선택 파일에 모든 내용이 포함되어 있기 때문입니다. 그런 다음 스크립트로 실행하십시오. 다른 OS에서 30 년 만에 리눅스 편집 및 스크립트 방법 중 일부를 배울 수 있습니다! –

+0

'git add -A' 명령은 모든 파일을 선택하기 위해 후행하는'.'이 있어야합니까? 아니면'-A'의 암시적인 부분입니까? (나는 항상 보았다/그것을 사용했습니다) –

+0

또한 체크 아웃 사이에 떨어 뜨린 디렉토리와 파일을 제거하기 위해 시퀀스가 ​​실패하는 문제가 있습니다. 최상위 디렉토리 이름이 각 스냅 샷 사이에서 변경됩니다.이 스냅 샷은 일반적으로 이름 바꾸기 세트로 표시되지만, 여기서는 단순히 첨가제 세트 만 얻습니다! 어떤 제안? –

0

rebase를 쉽게 할 수 없지만 "간단한 재 배열"이 아닌 이유를 설명 할 수 있습니다. 예를 들어, 개정 당 텍스트의 한 행이 추가 된 파일 하나를 가져 오십시오. 첫 번째 커밋, 그것은 같이 보인다 :에

Commit 1 

당신이 원래 순서가 넣어 이후 두 번째가 보이는, 커밋 : 당신의 이었다 세 번째에

Commit 1 
Commit 2 
Commit 3 

가 커밋 두 번째 스냅 샷, 그것은 같이 보인다 :

Commit 1 
Commit 2 
망할 놈의 자식에, 그래서 패치에 대해 다루고 있습니다

, 세리

  • 을 "1 커밋"라는 줄 뒤에
  • 는 "2 커밋"말할 줄을 추가합니다 "1 커밋"라는 한 줄에 파일을 추가하고 "3 커밋"같은 커밋의 ES 보인다

    • 는 라인 t으로 파일을 추가합니다 : 당신이 순서를 변경하면 같은

    , 그것은 보인다 "2 커밋"

  • 말한다 줄 뒤에 "3 커밋"라는 줄을 제거 hat "Commit 1"
  • "Commit 2"행 다음에 "Commit 3"이라고 표시되는 행을 제거하십시오.
  • "Commit 2"및 "Commit 3"이라고 표시된 행 뒤에 "Commit 1 "

두 번째 단계에서"Commit 2 "와 일치하는 줄이 보이지 않고 무엇을해야할지 모르기 때문에 수동 병합이 필요합니다.

수동으로 병합을 해결 한 다음 다음 단계에서 git은 병합을 수동으로 처리해야하며 2 단계를 예상합니다.ef가되어 있습니다

a->b->c->d->e->f 

당신은 여전히 ​​rebase -i을 할 수

a 사이 d 어딘가에 배치 할 수 있지만 커밋에 edit을 넣어 :

+0

그래서 나는'git rebase'가이 직업에 적합한 도구가 아니라고 생각합니다. 나는 정확히 무엇인지 모르겠다. – svick

+0

이것은 매우 지루할 것입니다. 패치를 적용하는 대신 각 커밋에있는 스냅 샷을 함께 꿰매는 것입니다. –

0

당신의 역사는 다음과 같다 경우 이전에 스냅 샷을 삽입 할 위치를 선택하십시오. git이 편집을 일시 중지하면 스냅 샷을 작업 디렉토리에두고 추가/커밋하십시오. 다음 지점, 헹구기, 반복 할 때까지 rebase를 계속하십시오.

이렇게해야 할 경우, 잘못 배치 된 스냅 샷을 처리하는 처음에 위 치된 커밋 인 ef도 제거해야합니다.

+0

그래도 많은 충돌이 발생할 수 있습니다. 그리고 변경 사항을 적용하려고하므로 결과가 이전과 완전히 동일하지 않을 수 있습니다. – svick