새로운 (그리고 비어있는)“루트”브랜치를 만드는 방법? 베어 브랜치를 만들 수있는 방법이 A있습니까? 1

이 자식 저장소에 새로운 “루트”브랜치를 정의하고 싶습니다. “루트”분기 란 저장소 1 의 다른 모든 분기와 완전히 독립적 인 분기를 의미합니다 .

불행히도, Arepo의 커밋 트리의 맨 아래에 있는 커밋 (이것을 호출하자)조차 많은 파일을 포함합니다 (이것은 이미 상당히 성숙한 프로젝트에서 초기화 된 저장소였습니다).

이것은 내가 A새로운 브랜치로 주었다고해도이 <start-point>새로운 브랜치는 “클린 슬레이트”에서 시작하는 것이 아니라에 커밋 된 모든 파일을 포함한다는 것을 의미합니다 A.

이 리포지토리에 가능한 한 <start-point>가깝게 완전히 베어 브랜치를 만들 수있는 방법이 A있습니까?


1 BTW, 이것은 새로운 저장소를 만드는 것과 동등 하지 않습니다 . 여러 가지 이유로 별도의 repos가 덜 편리합니다.


편집 : 좋아, 이것은 vcsjones 의 답변 에 따라 내가 한 일입니다 .

# save rev of the current earliest commit
OLDBASE=$(git rev-list --max-parents=0 HEAD)

# create a new orphan branch and switch to it
git checkout --orphan newbranch
# make sure it's empty
git rm -rf .

# create a new empty commit in the new branch, and
# save its rev in NEWBASE
git commit --allow-empty -m 'base commit (empty)'
NEWBASE=$(git rev-list HEAD)

# specify $NEWBASE as the new parent for $OLDBASE, and
# run filter-branch on the original branch
echo "$OLDBASE $NEWBASE" > .git/info/grafts
git checkout master
git filter-branch

# NOTE: this assumes that the original repo had only one
# branch; if not, a git-filter-branch -f <branch> command
# need to be run for each additional branch.

rm .git/info/grafts

이 절차는 다소 복잡하지만 최종 결과는 새로운 “클린 슬레이트 브랜치”의 역할을 할 수 있는 기본 커밋입니다 <start-point>. 그때해야 할 일은

git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)

앞으로 나는 항상 다음과 같은 새로운 저장소를 만들 것입니다.

git init
git commit --allow-empty -m 'base commit (empty)'

… 첫 번째 커밋이 비어 있고 항상 새로운 독립 브랜치를 시작할 수 있습니다. (이것은 매우 드물게 필요한 시설이지만, 쉽게 이용할 수있게 만드는 것은 쉽지 않습니다.)



답변

--orphan분기를 만들 때를 사용하십시오 .

git checkout --orphan YourBranchName

커밋이없는 새 브랜치를 만들지 만 모든 파일이 준비됩니다. 이 시점에서 제거 할 수 있습니다.
( “삭제”: A git reset --hard는 색인을 비우고 빈 작업 트리를 남겨 둡니다.)

상기 살펴보세요 man 페이지 –orphan에 대한 자세한 내용은 체크 아웃에 대한합니다.


답변

허용 된 답변에 추가하려면 깨끗한 상태로 되 돌리는 가장 좋은 방법 은 초기 빈 커밋 을 만들어 분기를 후손으로 설정하는 동안 쉽게 리베이스 할 수 있습니다. 또한 깨끗한 상태를 원하기 때문에 원하지 말아야 할 파일을 커밋했을 것이므로 인덱스에서 해당 파일을 제거해야합니다. 염두에 두어야 할 사항 :

$ git checkout --orphan dev2
Switched to a new branch 'dev2'
$ git reset # unstage all the files, you probably don't want to commit all of them
$ git commit --allow-empty -m 'Initial empty commit'
[dev2 (root-commit) a515c28] Initial empty commit


답변

git 2.23 이상을 사용하는 경우 git switchgit restore 대신에 사용할 수 있습니다 git checkout. 그렇다면 플래그는 이 답변 에서 언급 한 것과 같습니다 .

git switch --orphan YourBranchHere


답변

이 저장소에 완전히 베어 브랜치를 만들 수있는 방법이 있습니까?

사용할 실제 명령 (Git 2.28+에서)은 다음과 같습니다.

git switch --discard-changes --orphan newBranch
# or
git switch -f --orphan newBranch

git switchGit 2.23 (2019 년 8 월)에서 사용할 수 있으며 이전의 혼란스러운 git checkout명령을 대체합니다 .

그러나 Git 2.28 (Q3 2020)을 추천 git switch --discard-changes --orphan합니다. 그 버전에서 최적화 되었기 때문 입니다.

brian m의 commit 8d3e33d , commit 8186128 (2020 년 5 월 21 일)을 참조하십시오 . 칼슨 ( bk2204) .
(가 합병 – Junio C 하마노 gitsterded44af 커밋 2020 6월 9일)

builtin/checkout: 메타 데이터 초기화 단순화

서명자 : brian m. carlson
검토 자 : Derrick Stolee

우리는 호출하는 경우 init_checkout_metadatareset_tree,우리는이 필터를 통과하지 않거나이있는 경우에는 트리를 저지 할 수 있도록이 질문에 커밋의 객체 ID를 전달하려는.

우리는이 후자의 경우를 예상했는데, 이는 결제 코드의 다른 곳에서 발생할 수 있지만 여기서는 발생할 수 없습니다.

커밋 객체가없는 유일한 경우는를 호출 할 때 git switch입니다 --orphan.

또한 커밋 객체가 없으면 --force또는 로만이 코드 경로를 칠 수 있습니다 --discard-changes.

이 경우 커밋 또는 트리를 사용하여 체크 아웃 메타 데이터를 초기화 할 필요가 없습니다.

  • (a) 커밋이없고 빈 트리 만 있고
  • (b) 파일이없는 분기를 체크 아웃 할 때 파일이 번지지 않기 때문에 데이터를 사용하지 않습니다.

이 경우 유효한 포인터 인 값이 필요하기 때문에 0이 아닌 객체 ID를 전달하십시오.

테스트:

git switch master
echo foo >foo.txt
git switch --discard-changes --orphan new-orphan2
git ls-files >tracked-files
# test_must_be_empty tracked-files


답변