Git에서 처음 두 커밋을 스쿼시 하시겠습니까? [복제]
이 질문에는 이미 답변이 있습니다.
- Git 저장소의 처음 두 커밋을 결합 하시겠습니까? 답변 8 개
한 git rebase --interactive <commit>
번에 여러 커밋을 하나로 묶을 수 있습니다.
커밋을 초기 커밋으로 스쿼시하려는 경우가 아니라면 모두 좋습니다. 불가능한 것 같습니다.
그것을 달성 할 수있는 방법이 있습니까?
적당히 관련 :
관련 질문에서, 나는 첫 번째 커밋에 대한 스쿼시, 즉 두 번째 커밋에 대한 스쿼시 필요성에 대한 다른 접근법을 생각해 냈습니다.
관심이 있다면 : git : 커밋을 첫 번째로 삽입하고 다른 모든 것을 이동시키는 방법은 무엇입니까?
2012 년 7 월 업데이트 ( git 1.7.12+ )
이제 모든 커밋을 루트까지 리베이스 Y
하고 첫 번째 커밋 할 두 번째 커밋 을 선택할 수 있습니다 X
.
git rebase -i --root master
pick sha1 X
squash sha1 Y
pick sha1 Z
git rebase [-i] --root $tip
이 명령을 사용하여 "
$tip
"에서 루트 커밋 까지의 모든 히스토리를 다시 쓸 수 있습니다 .
Chris Webb ( )의 GitHub 에서 commit df5df20c1308f936ea542c86df1e9c6974168472를 참조하십시오 .arachsys
원래 답변 (2009 년 2 월)
SO 질문 " git 저장소의 처음 두 커밋을 어떻게 결합합니까? " 에서 다른 요리법을 찾을 수 있다고 생각 합니다.
Charles Bailey 는 가장 상세한 답변을 제공 하여 커밋이 전체 트리 (이전 주와의 차이점이 아님)임을 상기시킵니다.
그리고 여기에 이전 커밋 ( "초기 커밋")과 새 커밋 (스쿼시 결과)에는 공통 조상이 없습니다.
즉 commit --amend
, 초기 커밋을 새 커밋에 " "한 다음 새 초기 커밋을 이전 초기 커밋 기록 (다수의 충돌)으로 리베이스 할 수 없습니다
(이 마지막 문장은 더 이상 사실이 아닙니다 git rebase -i --root <aBranch>
)
오히려 ( A
원래의 "초기 커밋" B
으로 후속 커밋을 초기 커밋 으로 스쿼시해야 함) :
초기 커밋을 구성하려는 마지막 커밋으로 돌아갑니다 (HEAD 분리).
git checkout <sha1_for_B>
분기 커밋을 초기 커밋으로 재설정하지만 인덱스와 작업 트리는 그대로 둡니다.
git reset --soft <sha1_for_A>
'B'의 트리를 사용하여 초기 트리를 수정하십시오.
git commit --amend
이 새로운 초기 커밋에 임시로 태그를 지정하십시오 (또는 새 커밋 sha1을 수동으로 기억할 수 있습니다).
git tag tmp
원래 브랜치로 돌아가십시오 (이 예제의 마스터 가정).
git checkout master
B 이후의 모든 커밋을 새로운 초기 커밋으로 재생하십시오.
git rebase --onto tmp <sha1_for_B>
임시 태그를 제거하십시오.
git tag -d tmp
이렇게하면 " rebase --onto
"은 마지막 커밋 ( ) 이후 에 만들어진B
초기 히스토리 ( A
)를 tmp
(스쿼시 된 새로운 초기 커밋을 나타내는 )에 기록하기 때문에 병합 중에 충돌이 발생하지 않습니다 . 병합 만.
" A-B
"뿐만 아니라 " A-...-...-...-B
" 에도 적용됩니다 (커밋의 수는이 방법으로 초기 커밋으로 제한 될 수 있습니다)
VonC의 스크립트를 수정하여 모든 것을 자동으로 수행하고 아무것도 묻지 않았습니다. 두 개의 커밋 SHA1을 제공하면 두 가지 커밋 SHA1을 "스쿼시 기록"이라는 하나의 커밋으로 스쿼시합니다.
#!/bin/sh
# Go back to the last commit that we want
# to form the initial commit (detach HEAD)
git checkout $2
# reset the branch pointer to the initial commit (= $1),
# but leaving the index and working tree intact.
git reset --soft $1
# amend the initial tree using the tree from $2
git commit --amend -m "squashed history"
# remember the new commit sha1
TARGET=`git rev-list HEAD --max-count=1`
# go back to the original branch (assume master for this example)
git checkout master
# Replay all the commits after $2 onto the new initial commit
git rebase --onto $TARGET $2
가치있는 것을 위해, 나는 저장소에있는 유일한 것이 빈 .gitignore 인 "no-op"first commit을 생성함으로써이 문제를 피한다.
https://github.com/DarwinAwardWinner/git-custom-commands/blob/master/bin/git-myinit
그렇게하면 첫 번째 커밋을 망칠 이유가 없습니다.
모든 커밋을 하나의 초기 커밋으로 스쿼시하려면 리포지토리를 재설정하고 첫 번째 커밋을 수정하십시오.
git reset hash-of-first-commit
git add -A
git commit --amend
힘내 재설정은 작업 트리를 그대로 유지하므로 모든 것이 여전히 존재합니다. 따라서 git add 명령을 사용하여 파일을 추가하고 이러한 변경 사항으로 첫 번째 커밋을 수정하십시오. rebase -i와 비교하면 git 주석을 병합하는 기능이 손실됩니다.
이것은 두 번째 커밋을 첫 번째 커밋으로 스쿼시합니다.
A-B-C-... -> AB-C-...
git filter-branch --commit-filter '
if [ "$GIT_COMMIT" = <sha1ofA> ];
then
skip_commit "$@";
else
git commit-tree "$@";
fi
' HEAD
AB에 대한 커밋 메시지는 B에서 가져옵니다 (A에서 선호하지만).
Uwe Kleine-König의 답변과 동일한 효과가 있지만 초기가 아닌 A에서도 작동합니다.
첫 번째 커밋과 두 번째 커밋을 쪼개면 첫 번째 커밋이 다시 작성됩니다. 첫 번째 커밋을 기반으로하는 분기가 두 개 이상인 경우 해당 분기를 차단합니다.
다음 예제를 고려하십시오.
a---b---HEAD
\
\
'---d
a와 b를 새로운 커밋 "ab"로 스 쿼싱하면 git-merge 와 git-rebase 가 더 이상 두 브랜치에서 작동하지 않기 때문에 바람직하지 않은 두 개의 트리가 생깁니다 .
ab---HEAD
a---d
정말로 이것을 원한다면 할 수 있습니다. 히스토리 재 작성을위한 강력하고 위험한 도구에 대해서는 git-filter-branch 를 살펴보십시오 .
이를 위해 git filter-branch를 사용할 수 있습니다. 예 :
git filter-branch --parent-filter \
'if test $GIT_COMMIT != <sha1ofB>; then cat; fi'
이로 인해 AB-C는 A의 커밋 로그를 버립니다.
rebase interactive를 사용하여 마지막 두 커밋을 원격으로 푸시하기 전에 수정할 수 있습니다.
git rebase HEAD^^ -i
이를 수행하는 더 쉬운 방법이 있습니다. 당신이 master
지점 에 있다고 가정 해 봅시다
모든 커밋 히스토리를 제거하는 새로운 고아 브랜치를 작성하십시오.
$ git checkout --orphan new_branch
초기 커밋 메시지를 추가하십시오.
$ git commit -a
이전의 병합되지 않은 마스터 브랜치를 제거하십시오.
$ git branch -D master
현재 브랜치의 이름을 변경 new_branch
하는 방법에 대해 master
:
$ git branch -m master
참고 URL : https://stackoverflow.com/questions/598672/squash-the-first-two-commits-in-git
'Programing' 카테고리의 다른 글
jQuery-텍스트 설명을 통해 선택 컨트롤의 선택된 값 설정 (0) | 2020.02.11 |
---|---|
단위 테스트 명명 모범 사례 (0) | 2020.02.11 |
세그먼테이션 결함이란 무엇입니까? (0) | 2020.02.11 |
웹 사이트에 브라우저 탭 아이콘 (favicon)을 추가하는 방법은 무엇입니까? (0) | 2020.02.11 |
htmlentities () 대 htmlspecialchars () (0) | 2020.02.11 |