programing

Git, 저장소에 관련 없는 분기를 도입하는 간단한 방법이 있습니까?

newstyles 2023. 5. 9. 22:09

Git, 저장소에 관련 없는 분기를 도입하는 간단한 방법이 있습니까?

, 저는 기트 문제가 있는 친구와 .master분점.이 지점의 내용은 실제로 개발된 것과 다른 기원을 가지고 있었습니다.master지점, 하지만 그들은 합병될 예정이었습니다.master나중에 분기합니다.

저는 존 위글리의 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이제 옵션을 지원합니다. 페이지에서:

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

<start_point>에서 시작한 이름이 <new_branch>인 새 독립 분기를 생성하고 전환합니다.이 새 분기에 대한 첫 번째 커밋에는 부모가 없으며 다른 모든 분기 및 커밋과 완전히 연결되지 않은 새 기록의 루트가 됩니다.

이것은 인덱스와 작업 트리를 채우기 때문에 질문자가 원하는 것을 정확히 수행하지 못합니다.<start_point>(결국 체크아웃 명령이므로).작업 트리 및 인덱스에서 원하지 않는 항목을 제거하는 작업만 수행하면 됩니다. 불하게도행,,git reset --hardgit 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 커뮤니티 북에서:

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/related를 삭제할 수 있습니다.

현재 선택한 답변이 맞습니다. 우연히도 추가할 수 있습니다.

.com 이 가 github.com 이라는 를 만들 수 한 방법입니다.gh-pages여기에는 적절한 단계가 제공되고 설명되어 있습니다.

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

기본적으로 이 설정을 위한 git 명령은 다음과 같습니다.

  1. git checkout --orphan gh-pages를 만듭니다
  2. git rm -rf . 트리에서
  3. rm '.gitignore' (심지어 gitignore) (심지어 gitignore)
  4. 이제 웹 사이트 콘텐츠(index.html 등 추가)를 추가하고 커밋한 후 푸시합니다.
  5. 이익.

또한 사용자의 /docs 폴더를 Github이 웹 사이트를 구축하는 데 사용하는 "프로젝트 사이트"의 원본으로 지정할 수 있습니다.

이것이 도움이 되길 바랍니다!

최근의 Git 버전에서는 적어도 2.27에서, 이것은 다음과 같이 깨끗하게 달성될 수 있습니다.switch명령:

git switch --orphan <new-branch>

공식 문서: https://www.git-scm.com/docs/git-switch

Github에는 프로젝트 페이지라는 기능이 있으며, 프로젝트에서 지정된 특정 분기를 생성하여 Github에서 제공할 파일을 제공할 수 있습니다.지침은 다음과 같습니다.

$ cd /path/to/fancypants
$ git symbolic-ref HEAD refs/heads/gh-pages
$ rm .git/index
$ git clean -fdx

여기에서 새 콘텐츠를 추가할 수 있는 빈 리포지토리가 있습니다.

때때로 저는 프로젝트에 빈 분기를 즉시 생성한 후 작업을 시작하고 싶습니다. 다음 명령을 수행합니다.

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.18 Q2 "을 2 Q2 2018) 자체의 고아 할 수 .git rebase -i --root시퀀서 기계를 더 많이 사용하도록 업데이트되었습니다.

시퀀서는 커밋 그래프의 전체 토폴로지를 다른 곳으로 이식할 수 있는 것입니다.

커밋 8fa6eeea, 커밋 9c85a1c, 커밋 ebddf39, 커밋 21d0764, 커밋 d87d48b, 커밋 ba97aea(2018년 5월 3일)를 요하네스 쉰들린()dscho 참조.
(주니오 C 하마노에 의해 합병 -- -- 2018년 5월 30일 commit c5aa4bc에서)

시퀀서: 새 루트 커밋 도입 허용

에의 에서.--rebase-merges기존 분기 토폴로지를 자유롭게 변경할 수 있도록 특별히 설계된 모드로, 사용자는 새로 만든 루트 커밋으로 시작하는 완전히 새로운 분기에 커밋을 추출할 수 있습니다.

" 이명령을삽이여수수있다니습행할작을업입하제▁command"를 합니다.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]올바른 ref 이름이 아닙니다. 여는 괄호와 공백이 ref 이름에서 모두 잘못되었습니다.

별도의 저장소를 만드는 것이 저에게는 잘 작동했습니다.<start_point>에 대해 걱정할 필요가 없었습니다.

  1. 비어 있는 새 레포를 다른 곳에 만듭니다.
  2. 브랜치의 master가 합니다.gh-pages
  3. 고아 일을 시작하세요.
  4. 새 리포지토리의 유일한 분기에 작업을 커밋합니다.
  5. 새 분기를 원래 마스터 분기가 포함된 동일한 원격 저장소로 푸시합니다.

이 방법은 다음에 언급되어 있습니다.

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

언급URL : https://stackoverflow.com/questions/1384325/in-git-is-there-a-simple-way-of-introducing-an-unrelated-branch-to-a-repository