--parent-filter
을 사용하여 D
의 SHA를 C
의 SHA로 바꾸려면 git filter-branch
을 사용하고 싶습니다. .git/info/grafts
또는 git replace
을 볼 수도 있는데, 이는 --parent-filter
을 작성하는 것보다 간단 할 수도 있고 filter-branch
으로 영구적으로 만들 수도 있습니다.
업데이트 : @ 토렉이 말했듯이, 당신은 확실히 git replace
을 사용해야합니다. 실제 예제를 사용하려면 readme.md
에서 README.md
까지의 이름을 중간 이름 바꾸기 README1.md
: https://github.com/dahlbyk/posh-git/compare/dahlbyk:2b9342c...dahlbyk:57394c5으로 실행했습니다. 이제 2b9342c
당신의 C
및 57394c5
을 부르 자 당신의 E
:
$ git tag E 57394c5
$ git tag C 2b9342c
$ git tag G 450d8f1
$ git log --oneline --graph --decorate C~..G
* 450d8f1 (tag: G) Merge pull request #320 ...
|\
| * 941935c Fix a few kbd/missing markdown issues/
| * f13dcf9 Upcase readme and have more prompt examples.
| * 57394c5 (tag: E) Now rename to README.md.
| * eb79ef2 Prepare to upcase README.md filename.
* | 536c57f Merge pull request #319 ...
|\ \
| |/
|/|
| * 7fafb7b Speed up Get-GitStatus
|/
* 2b9342c (tag: C) Merge pull request #313 ...
가 중간 움직임은 결코 일어나지 않았다 척, 내가 할 수있는 자사의 조부모 (E~2
= C
)와 replace
E
의 부모 (E~
) :
$ git log --stat --oneline C..E
57394c5 Now rename to README.md.
README1.md => README.md | 0
1 file changed, 0 insertions(+), 0 deletions(-)
eb79ef2 Prepare to upcase README.md filename.
readme.md => README1.md | 0
1 file changed, 0 insertions(+), 0 deletions(-)
$ git replace E~ C
$ git log --stat --oneline C..E
57394c5 Now rename to README.md.
readme.md => README.md | 0
1 file changed, 0 insertions(+), 0 deletions(-)
eb79ef2 Merge pull request ...
마지막으로 filter-branch
은 변경 사항을 영구 변경합니다.
$ git replace E~ E~2
$ git replace 3~ 3~2
$ git filter-branch -- ^A --all
업데이트 2 : 당신은 같은 것을 할 것이다 당신의 목적을 위해
$ git filter-branch -- ^C G E # For demo, only rewrite G & E afer C
$ git log --graph --oneline --decorate C~..G
* fcfd345 (tag: G) Merge pull request #320 ...
|\
| * fa76267 Fix a few kbd/missing markdown issues/
| * 4900687 Upcase readme and have more prompt examples.
| * b25aa5a (tag: E) Now rename to README.md.
* | 536c57f Merge pull request #319 ...
|\ \
| |/
|/|
| * 7fafb7b Speed up Get-GitStatus
|/
* 2b9342c (tag: C) Merge pull request #313 ...
,
의 I 얻을 커밋 메시지는 '나는 돈있는 E 떨어져있다 신경 쓰지 마. 차라리 D의 커밋 메시지 (또는 스크립트 제공 메시지)를 갖고 싶습니다.
의 tree
(git cat-file -p E
) D
(그 E
는 건너 뛰어야)을 위해, 예를 들어, '나는 이상 시작하고 E
를 지정하는 --commit-filter
을 사용하는 것이 좋습니다 것의 메타 데이터를 커밋'D
을 유지하려면
git filter-branch --commit-filter '
if [ "$GIT_COMMIT" = "SHA of D" ];
then
git commit-tree "TREE of E" -p "SHA of C";
elif [ "$GIT_COMMIT" = "SHA of E" ];
then
skip_commit "[email protected]";
else
git commit-tree "[email protected]";
fi;
' -- ^A E G
체크 아웃 4, 자식은 스쿼시 -i 1, 변경 2, 3 커밋을 리베이스, 그들은이 다음 내 나무의 나머지 부분을 리베이스해야 고아 4 ', 나에게 잎 1 – g19fanatic
에 최대 스쿼시 것 에. 필자는 7 년의 역사와 거의 100,000 개의 커밋 및 모든 지점과 병합이이 시점 이후에 있으므로 수동으로 리베이스하고이 기록을 매우 복잡하게 만듭니다. – Paco103