2009-09-05 2 views
270

친구에게 오늘 힘 문제를 돕는 동안 master 지점에서 완전히 분리해야하는 지점을 소개해야했습니다. 이 지점의 내용은 실제로 master 지점에서 이 개발 된 것과 다른 근원 이었지만 나중에 분기로 병합 된 이 될 것입니다. git에서는 관련이없는 분기를 저장소에 도입하는 간단한 방법이 있습니까?

는 내가 부모가 저지른 선택적으로 에, 즉 특정 규칙을 다음과 커밋하는 방법과 커밋이 파일의 나무에 묶여과에 존 Wiegley의 Git from the bottom up 방법 가지가 기본적으로 레이블입니다 읽고 기억. ... 그래서 우리는 색인에있는 모든 파일을 제거있어

타르볼에서

$ git rm -rf . 

... 추출 된 디렉토리와 파일을 : 우리는 부모를이 자식의 배관을 사용하여 저장소를 기존 저지 만들어 갔다 ... ...

$ git add . 

을 인덱스에 사람들을 추가 ... 그리고 트리 객체를 생성

$ git write-tree 

(git-write-tree은 우리에게 생성 된 트리 객체의 sha1sum 말했다.)

그런 다음, 우리는 부모가 저지른 지정하지 않고, 나무를 최선을 다하고 ...

$ echo "Imported project foo" | git commit-tree $TREE 

이 ( git-commit-tree이 우리에게 창조의 sha1sum 말했다 commit 객체)

... 새로 작성한 커밋을 가리키는 새 분기를 만들었습니다.

$ git update-ref refs/heads/other-branch $COMMIT 

마지막으로 우리는 master 브랜치로 돌아와 작업을 계속했습니다.

$ git checkout -f master 

이것은 계획대로 진행된 것으로 보입니다. 하지만 이것은 분명히 종류의 절차를 시작하는 사람에게 권하고 싶습니다 git를 사용하여, 온화하게 넣어. 지금까지 리포지토리에있는 모든 항목과 완전히 관련이없는 새 분기를 만드는 쉬운 방법이 있습니까? Git Community Book에서

답변

420

이 작업을 다른 답변보다 높은 수준으로 만드는 새로운 기능이 있습니다 (V1.7.2부터).

git checkout은 이제 --orphan 옵션을 지원합니다. man page에서 :

git checkout [-q] [-f] [-m] --orphan <new_branch> [<start_point>]

, new_branch > <라는 새 고아 지점을 만들기 <start_point>에서 시작과로 전환합니다. 새 분기 에서 처음 작성한 커밋은 부모가 없으며 의 분기와 커밋이 완전히 분리 된 새로운 기록의 루트가됩니다. 그것은 (이이기 때문에, 결국, 체크 아웃 명령) 인덱스 및 <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' 

나는 HEAD에 <start_point> 지정이 때문에 기본값을 떠났고, 우리가 정말 어쨌든 상관 없어. 이 시퀀스는 기본적으로 무서운 배관 명령을 사용하지 않고 Artem's answer의 명령 시퀀스와 동일한 작업을 수행합니다.

+19

참고 :이 기능은 git 1.7.2에 추가되었습니다. – Matthew

+0

다른 "트리"의 분기를 체크 아웃 할 때 보이는 고아 분기를 만들 수 있는지 알고 있습니까? – JJD

+1

@JJD : 당신이 원하는 것은 git 병합이라고 생각합니다. '(git checkout master && git merge --no-commit "orphan-branch")'비슷한 트릭은 git-reset을 사용하거나 인덱스를 가지고 놀면 작동 할 것입니다. 그러나 원하는 워크 플로우에 따라 다릅니다. – phord

30

:

git symbolic-ref HEAD refs/heads/newbranch 
rm .git/index 
git clean -fdx 
<do work> 
git add your files 
git commit -m 'Initial commit' 
+3

이 좋은 답변입니다 : – gahooa

+1

다음은 git의 최신 버전에 대한 대답입니다. – kikito

+10

@kikito : Re : "다음 대답은 더 좋다"... 여기에있는 주문은 안정적이지 않습니다. 더 나은 대답이라고 생각하는 것을 가리키는 링크를 추가 할 수 있습니까? –

12

Github는 Github에서에 의해 제공됩니다 파일을 제공하기 위해 프로젝트에 특정 이름 분기를 만들 수 있습니다 Project Pages라는 기능이 있습니다. 그들의 지시 사항은 다음과 같습니다 :

여기에서 새 저장소를 추가 할 수있는 빈 저장소가 있습니다.

21

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 

이제 삭제할 수 있습니다에서 다음 가져 오기/경로/관련 없음/관련 없음

+0

내 생각에, 깔끔한 개념은'git branch' 또는'git checkout' 옵션을 포함 할 것입니다. 나는 이런 장치를 가능하게 만들었 기 때문에 기뻐하지만, 왜 그렇게 쉬워서는 안 되는가? – hillu

+3

이기 때문에 희소 한 것이 틀림 없습니다. 관계가없는 브랜치 (branch)가있는 경우, 통상은 관련이없는 저장소에 속합니다 (예외가 있기는하지만). –

+1

+1. 동료들에게는 'git branch'를 통해 브랜치를 나열하고 'git checkout BRANCH_NAME'을 통해 브랜치를 전환 할 수있다. – akavel

0

발견됨 스크립트는 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 
+1

나는'git fetch $ REMOTE $ REMOTE_BRANCH : $ LOCAL_BRANCH'를 사용하여 동일한 효과를 얻을 수 있다고 믿습니다. 내가 놓친 게 있니? – hillu

6

현재 선택한 답이 정확한지, 난 그냥

이 github.com은 고아 분기 gh-pages 전화를 통해 사용자가 자신의 repos에 대한 Github에서 페이지를 만들 수 있습니다 정확히 어떻게 실제로 ... 우연히 것을 추가합니다. 예쁜 단계는 주어진 여기에 설명되어 있습니다

https://help.github.com/articles/creating-project-pages-manually

희망이 도움이!

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" 
2

때때로 난 그냥, 그냥 다음 명령을 excute에 것 즉시 다음 일을 시작 프로젝트의 빈 지점을 만들려고합니다.
관련 문제