자식에서 관련되지 않은 분기를 저장소에 도입하는 간단한 방법이 있습니까?
오늘 자식 문제를 겪고있는 친구를 돕는 동안, 나는 지점과 완전히 분리되어야하는 지점을 소개해야했습니다 master
. 이 브랜치의 내용은 실제로 브랜치에서 개발 된 것과 다른 기원을 master
가졌지 만 master
나중에 브랜치 로 병합 될 것 입니다.
나는 John Wiegley의 Git을 맨 처음 부터 브랜치가 본질적으로 특정 규칙을 따르는 커밋에 대한 레이블과 커밋이 파일 트리 및 선택적으로 부모 커밋에 연결되는 방식을 레이블로 읽는 것을 기억했습니다 . 우리는 git의 배관을 사용하여 기존 저장소에 부모없는 커밋을 만들었습니다.
그래서 우리는 색인의 모든 파일을 제거했습니다 ...
$ git rm -rf .
... tarball에서 추출 된 디렉토리와 파일을 색인에 추가했습니다 ...
$ git add .
... 트리 객체를 생성했습니다 ...
$ git write-tree
( git-write-tree
생성 된 트리 객체의 sha1sum을 알려줍니다.)
그런 다음 부모 커밋을 지정하지 않고 트리를 커밋했습니다 ...
$ echo "Imported project foo" | git commit-tree $TREE
( git-commit-tree
만약 커밋 객체의 sha1sum을 알려주세요.)
... 그리고 새로 만든 커밋을 가리키는 새 브랜치를 만들었습니다.
$ git update-ref refs/heads/other-branch $COMMIT
마지막으로 master
지점으로 돌아와 작업을 계속했습니다.
$ git checkout -f master
이것은 계획대로 작동 한 것 같습니다. 그러나 이것은 분명히 git을 사용하기 시작한 누군가에게 가볍게 추천하기 위해 권장하는 종류의 절차가 아닙니다. 지금까지 저장소에서 발생한 모든 것과 전혀 관련이없는 새 브랜치를 작성하는 더 쉬운 방법이 있습니까?
V1.7.2부터는이 기능을 다른 답변보다 조금 더 높은 수준으로 만드는 새로운 기능이 있습니다.
git checkout
이제 --orphan
옵션을 지원합니다 . 로부터 man 페이지 :
git checkout [-q] [-f] [-m] --orphan <new_branch> [<start_point>]
<start_point>에서 시작하여 이름이 <new_branch> 인 새 고아 브랜치를 작성 하고 전환하십시오. 이 새로운 브랜치에서 첫 커밋은 부모가 없으며 다른 모든 브랜치 및 커밋과 완전히 분리 된 새로운 역사의 근원이 될 것입니다.
이것은 어 커가 원하는 것을 정확하게 하지 않습니다 . 왜냐하면 인덱스와 작업 트리를 채 웁니다 <start_point>
(결국 체크 아웃 명령이므로). 필요한 다른 조치는 작업 트리 및 색인에서 원하지 않는 항목을 제거하는 것입니다. 불행히도 git reset --hard
작동하지 않지만 git rm -rf .
대신 사용할 수 있습니다 ( rm .git/index; git clean -fdx
다른 답변 과 동일하다고 생각 합니다).
요약해서 말하자면:
git checkout --orphan newbranch
git rm -rf .
<do work>
git add your files
git commit -m 'Initial commit'
<start_point>
기본값은 HEAD이므로 지정되지 않은 채로 두었 습니다. 어쨌든 실제로 신경 쓰지 않습니다. 이 순서는 본질적 으로 무서운 배관 명령에 의지하지 않고 Artem의 답변 의 명령 순서와 본질적으로 동일 합니다.
에서 힘내 커뮤니티 도서 :
git symbolic-ref HEAD refs/heads/newbranch
rm .git/index
git clean -fdx
<do work>
git add your files
git commit -m 'Initial commit'
git symbolic-ref
인덱스를 사용 하거나 제거 하는 솔루션이 작동하더라도 개념적으로 새 리포지토리 를 만드는 것이 더 깨끗할 수 있습니다
$ cd /path/to/unrelated
$ git init
[edit and add files]
$ git add .
$ git commit -m "Initial commit of unrelated"
[master (root-commit) 2a665f6] Initial commit of unrelated
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 foo
그런 다음 가져옵니다
$ cd /path/to/repo
$ git fetch /path/to/unrelated master:unrelated-branch
warning: no common commits
remote: Counting objects: 3, done.
Unpacking objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
From /path/to/unrelated
* [new branch] master -> unrelated-branch
이제 / path / to / unrelated를 삭제할 수 있습니다
Github 에는 프로젝트 페이지 라는 기능이있어 Github 에서 제공 할 파일을 제공하기 위해 프로젝트에 특정 이름의 브랜치를 생성 할 수 있습니다. 그들의 지시는 다음과 같습니다.
$ cd /path/to/fancypants
$ git symbolic-ref HEAD refs/heads/gh-pages
$ rm .git/index
$ git clean -fdx
거기에 빈 저장소가 있으며 새 저장소를 추가 할 수 있습니다.
현재 선택된 답변이 정확합니다. 우연히 추가 할 것입니다 ...
이것은 실제로 github.com이 사용자가라는 고아 브랜치를 통해 리포지토리에 대해 Github Pages를 만드는 방법 gh-pages
입니다. 여기에 예쁜 단계가 설명되어 있습니다.
https://help.github.com/articles/creating-project-pages-manually
기본적으로이를 설정하는 git 명령은 다음과 같습니다.
git checkout --orphan gh-pages
(리포지토리에 gh-pages라는 부모없는 지점을 만드십시오)git rm -rf .
(분기 작업 트리에서 파일을 제거합니다)rm '.gitignore'
(gitignore조차도)- 이제 웹 사이트 콘텐츠를 추가하고 (index.html 등 추가) 커밋하고 푸시하십시오.
- 이익.
또한 Github이 웹 사이트를 구축하는 데 사용하는 "프로젝트 사이트"의 소스가되도록 리포지토리에 / docs 폴더 를 지정할 수도 있습니다.
도움이 되었기를 바랍니다!
때로는 프로젝트에서 빈 분기를 즉시 만들고 작업을 시작하고 싶을 때 다음 명령을 즉시 실행합니다.
git checkout --orphan unrelated.branch.name
git rm --cached -r .
echo "init unrelated branch" > README.md
git add README.md
git commit -m "init unrelated branch"
기존 컨텐츠가 이미 커밋 된 경우 " git rebase -i --root
" 의 구현 이 시퀀서 기계를 더 많이 사용하도록 업데이트되었으므로 이제 (Git 2.18 Q2 2018) 해당 컨텐츠를 자체 새 고아 분기로 추출 할 수 있습니다 .
이 시퀀서는 이제 커밋 그래프의 전체 토폴로지를 다른 곳으로 이식 할 수있는 것 입니다.
참조 8fa6eea 커밋 , 9c85a1c 커밋 , ebddf39 커밋 , 21d0764 커밋 , d87d48b 커밋 , ba97aea 커밋 에 의해 (2018 5월 3일) (요하네스 Schindelin을 dscho
) .
(가 합병 Junio C 하마노 - gitster
- 에 c5aa4bc을 투입 , 2018 (30) 5 월)
시퀀서 : 새로운 루트 커밋 도입 허용
--rebase-merges
기존 분기 토폴로지를 자유롭게 변경할 수 있도록 특별히 설계된 새 모드와 관련하여 사용자는 새로 작성된 루트 커밋으로 시작하는 완전히 새로운 분기로 커밋을 추출 할 수 있습니다 .이것은 이제 루트 커밋이되고 싶은 커밋을 수행
reset [new root]
하기 전에 명령을 삽입함으로써 가능합니다pick
. 예:
reset [new root]
pick 012345 a commit that is about to become a root commit
pick 234567 this commit will have the previous one as parent
유효한 참조 이름이 아니기
reset
때문에 다른 명령 사용과 충돌하지 않습니다.[new root]
참조 이름에서 여는 괄호와 공백은 모두 불법입니다.
http://wingolog.org/archives/2008/10/14/merging-in-unrelated-git-branches 에서이 스크립트를 찾았으며 매우 잘 작동합니다!
#!/bin/bash
set -e
if test -z "$2" -o -n "$3"; then
echo "usage: $0 REPO BRANCHNAME" >&2
exit 1
fi
repo=$1
branch=$2
git fetch "$repo" "$branch"
head=$(git rev-parse HEAD)
fetched=$(git rev-parse FETCH_HEAD)
headref=$(git rev-parse --symbolic-full-name HEAD)
git checkout $fetched .
tree=$(git write-tree)
newhead=$(echo "merged in branch '$branch' from $repo" | git commit-tree $tree -p $head -p $fetched)
git update-ref $headref $newhead $head
git reset --hard $headref
'IT' 카테고리의 다른 글
gitignore 파일은 어디에 속합니까? (0) | 2020.03.08 |
---|---|
CoffeeScript에서 전역 변수를 어떻게 정의합니까? (0) | 2020.03.08 |
PostgreSQL에서“use database_name”명령 (0) | 2020.03.08 |
C에서 "부호없는 long"을 인쇄하는 방법은 무엇입니까? (0) | 2020.03.08 |
MySQL 소개 (0) | 2017.11.15 |