커밋 순서 변경
현재 분기에서 작업 중이며 일부 커밋이 다른 분기로 병합되기를 원합니다.
    a-b-c-d-e-f-g (branchA)
   /
--o-x-x-x-x-x-x-x-x-x-x (master)
   \
    x-x-x-x-x (branchB)
커밋을 , (문자는 커밋을 의미합니다.)x관련 없는 커밋입니다.)
그러나 몇 가지 커밋을 풀링하는 것이 좋은 방법이라는 것을 알게 되었습니다.는 연하을 "결밋"커다고싶 "습니"를 ".a,d,e그리고.g로▁it로 커밋합니다.master »b그리고.f하기로 약속한 대로 해야 합니다.branchB그것을 달성하기 위한 좋은 '기트'적인 방법이 있습니까?
는 당이찾명는입니다.git rebase구체적으로 말하면-i/--interactive선택.
저는 당신이 A 브랜치에서 커밋을 남기길 원한다고 가정하고, 병합은 간단하기 때문에 병합하는 것이 아니라 다른 커밋을 다른 브랜치로 이동하는 것을 정말로 의미한다고 생각합니다.A 지점을 조작하는 것부터 시작하겠습니다.
git rebase -i <SHA1 of commit a>^ branchA
 그^는 이전의 커밋을 의미하므로 이 명령은 "a" 앞의 커밋을 기준으로 사용하여 분기 A의 기본값을 다시 지정합니다.Git는 이 범위의 커밋 목록을 제공합니다.다시 주문하고 해당 제품을 으깨라고 합니다.
pick c ...
pick a ...
squash d ...
squash e ...
squash g ...
pick b
squash f
이제 역사는 다음과 같습니다.
    c - [a+d+e+g] - [b+f] (branchA)
   /
--o-x-x-x-x-x-x-x-x-x-x (master)
이제 B 지점에 대해 새로 스퀴드된 커밋 b+f를 살펴보도록 하겠습니다.
git checkout branchB
git cherry-pick branchA  # cherry-pick one commit, the tip of branchA
마스터의 경우 a+d+e+g도 마찬가지입니다.
git checkout master
git cherry-pick branchA^
마지막으로 지점 A를 업데이트하여 c:
git branch -f branchA branchA^^
우리는 이제 다음과 같이 했어야 합니다.
    c (branch A) - [a+d+e+g] - [b+f] (dangling commits)
   /
--o-x-x-x-x-x-x-x-x-x-x-[a+d+e+g] (master)
   \
    x-x-x-x-x-[b+f] (branchB)
분기 간에 이동하려는 커밋이 여러 개 있는 경우 기본 재배치를 다시 사용할 수 있습니다(비대화형).
# create a temporary branch
git branch fromAtoB branchA
# move branchA back two commits
git branch -f branchA branchA~2
# rebase those two commits onto branchB
git rebase --onto branchB branchA fromAtoB
# merge (fast-forward) these into branchB
git checkout branchB
git merge fromAtoB
# clean up
git branch -d fromAtoB
은 더  적용되지  정렬할 수 일부 커밋이 더 이상 깨끗하게 적용되지 않는 방식으로 커밋을 다시 정렬할 수 있습니다.순서를수된 기능을  앞에 함). 이 수 . 이 경우 기본 재배치를 중단하고 싶을 것입니다(git rebase --abort 수정 을 추가한  를 실행합니다.git rebase --continue다음으로 넘어가겠습니다.이러한 지침은 충돌이 발생할 때 인쇄되는 오류 메시지에서도 제공됩니다.
git rebase -i HEAD~3
에▁where디3재주문(소스)이 필요한 커밋 수입니다. 
이렇게 하면 vi가 열리고 가장 오래된(위) 커밋부터 최신(아래) 커밋까지 나열됩니다.
이제 줄을 다시 정렬하고 저장한 다음 편집기를 종료합니다.
ddp현재 라인을 아래로 이동합니다.
 ddkP현재 라인업(소스)을 위로 이동합니다.
git rebase --interactive원하는 명령입니다.
예:
현재 상태는 다음과 같습니다.
bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git status
On branch master
nothing to commit, working tree clean
bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git log --oneline
a6e3c6a (HEAD -> master) Fourth commit
9a24b81 Third commit
7bdfb68 Second commit
186d1e0 First commit
커밋을 다시 정렬합니다.9a24b81(세 번째 커밋) 및7bdfb68(두 번째 커밋).이를 위해 먼저 변경하려는 첫 번째 커밋 전에 커밋을 찾습니다.커밋입니다.186d1e0(첫 번째 커밋).
실행할 명령은 다음과 같습니다.git rebase --interactive COMMIT-BEFORE-FIRST-COMMIT-WE-WANT-TO-CHANGE이 경우:
bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git rebase --interactive 186d1e0
그러면 기본 편집기에서 다음 내용의 파일이 열립니다.
pick 7bdfb68 Second commit
pick 9a24b81 Third commit
pick a6e3c6a Fourth commit
# Rebase 186d1e0..a6e3c6a onto 186d1e0 (3 commands)
#
# 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
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
파일의 커밋 순서는 git log에 사용되는 커밋 순서와 반대입니다.Git 로그에서 가장 최근의 커밋이 맨 위에 있습니다.이 파일에서 가장 최근의 커밋은 맨 아래에 있습니다.
파일 하단의 주석에서 설명한 것처럼 커밋 스퀴즈, 삭제 및 재정렬과 같은 다양한 작업을 수행할 수 있습니다.커밋을 다시 주문하려면 다음과 같이 파일을 편집합니다(아래 주석은 표시되지 않음).
pick 9a24b81 Third commit
pick 7bdfb68 Second commit
pick a6e3c6a Fourth commit
그pick각 행의 시작 부분에 있는 명령어는 "이 커밋을 사용(즉, 포함)"하는 것을 의미하며, rebase 명령어가 포함된 파일을 저장하고 편집기를 종료하면 git가 명령어를 실행하고 저장소 및 작업 디렉터리를 업데이트합니다.
$ git rebase --interactive 186d1e0
Successfully rebased and updated refs/heads/master.
bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git log --oneline
ba48fc9 (HEAD -> master) Fourth commit
119639c Second commit
9716581 Third commit
186d1e0 First commit
다시 작성된 커밋 기록을 기록합니다.
링크:
마지막 두 커밋만 다시 주문하려면 다음과 같이 하십시오.git reorder별칭: https://stackoverflow.com/a/33388211/338581
깃베이스가 당신이 원하는 것입니다.--interactive 옵션을 확인합니다.
언급URL : https://stackoverflow.com/questions/2740537/reordering-of-commits
'itsource' 카테고리의 다른 글
| 원격 분기가 "git branch -r"에 표시되지 않습니다. (0) | 2023.06.26 | 
|---|---|
| Gitrebase에 대한 병합 전략을 선택하려면 어떻게 해야 합니까? (0) | 2023.06.26 | 
| 스프링 부트 속성 파일을 사용하여 Flyway 'baselineOnMigrate' 및 'baselineVersion' 설정 (0) | 2023.06.26 | 
| Python cx_Oracle용 도커 컨테이너에 Oracle Instant 클라이언트 설치 (0) | 2023.06.26 | 
| FastAPI + SQLAlchemy - datetime 필드가 있는 테이블에 항목을 게시할 때 잘못된 RequestError가 발생함 (0) | 2023.06.26 |