한 Git 저장소에서 다른 저장소로 커밋을 복사하는 방법은 무엇입니까?


101

지난주에 Github 리포지토리를 만들고 리포지토리에 대한 라이선스를 선택하는 것을 잊었습니다. 이제 이미 3 개의 큰 커밋이 있습니다.

나는 3 기고자에게 괜찮은지 물었고, 저장소를 삭제 한 다음 같은 이름으로 다시 만들 었는지, 이번에는 저장소를 만들 때 라이센스를 선택했는지 물어 보았습니다.

질문

커밋을 새 저장소로 가져오고 (이번에는 첫 번째 커밋이 LICENSE 파일 임) 커밋 메타 정보를 유지하는 방법이 있습니까?


1
원래 리포지토리에 라이센스를 계속 추가 할 수 있습니다. 자세한 내용은 help.github.com/articles/open-source-licensing/… 을 참조하십시오.
edwinksl


답변:


172

커밋을 새 저장소로 가져오고 (이번에는 첫 번째 커밋이 LICENSE 파일 임) 커밋 메타 정보를 유지하는 방법이 있습니까?

예, 원격을 추가하고 첫 번째 커밋 위에 커밋을 선택합니다.

# add the old repo as a remote repository 
git remote add oldrepo https://github.com/path/to/oldrepo

# get the old repo commits
git remote update

# examine the whole tree
git log --all --oneline --graph --decorate

# copy (cherry-pick) the commits from the old repo into your new local one
git cherry-pick sha-of-commit-one
git cherry-pick sha-of-commit-two
git cherry-pick sha-of-commit-three

# check your local repo is correct
git log

# send your new tree (repo state) to github
git push origin master

# remove the now-unneeded reference to oldrepo
git remote remove oldrepo

이 답변의 나머지 부분은 이전 리포지토리에 라이센스를 계속 추가하려는 경우입니다.

예. 리베이스를 통해 LICENSE 커밋을 첫 번째 커밋으로 배치 할 수 있습니다.

리베이스는 모든 커밋 작성자와 커밋 날짜를 그대로 유지하면서 커밋 순서를 재정렬하는 방법입니다.

공유 저장소에서 작업 할 때 전체 팀이 git에 능통하지 않는 한 일반적으로 권장하지 않습니다. 그렇지 않은 경우 저장소의 새 복사본을 복제 할 수 있습니다.

다음은 첫 번째 커밋으로 LICENSE 커밋을 얻는 방법입니다.

1. 로컬 사본 업데이트 및 리베이스

프로젝트를 확인하고 현재 3 커밋 스택의 맨 위에 커밋에 LICENSE 파일을 배치합니다.

#create LICENSE file, edit, add content, save
git add LICENSE
git commit -m 'Initial commit'

그런 다음 마스터 브랜치에서 대화식 리베이스를 수행 하여 커밋 을 다시 지정 하십시오.

git rebase -i --root

편집기가 열립니다. 맨 아래 줄 ( "초기 커밋"커밋, 가장 최근 커밋)을 파일 맨 위로 이동합니다. 그런 다음 편집기를 저장하고 종료하십시오.

편집기를 종료하자마자 git은 방금 지정한 순서대로 커밋을 작성합니다.

이제 저장소의 로컬 사본이 업데이트되었습니다. 하다:

git log

확인합니다.

2. 새 저장소 상태를 github로 강제 푸시

이제 복사본이 업데이트되었으므로 github에 강제로 푸시해야합니다.

git push -f origin master

이것은 github에 마스터 브랜치를 새 위치로 이동하도록 지시합니다. 이와 같이 작업하는 모든 사람이 보류중인 변경 사항을 알고있는 드문 경우에만 강제로 푸시해야합니다. 그렇지 않으면 공동 작업자를 혼란스럽게 할 수 있습니다.

3. 공동 작업자를 github에 동기화

마지막으로 모든 공동 작업자는이 저장소에 동기화해야합니다.

먼저 다음 명령은 저장되지 않은 변경 사항이있는 경우 파괴적 일 수 있으므로 깨끗한 저장소가 있어야합니다 .

# make sure there are no unsaved changes
git status 

# pull the latest version from github
git fetch  

# move their master branch pointer to the one you published to github.
git reset --hard origin/master

그게 다야. 모두가 지금 동기화되어야합니다.


1
좋은 대답! 감사!
Kyrol

많은 시간을 절약했습니다. 감사!
an0nh4x0r

9

내 github에 저장소를 포크하는 것을 잊고 실수를 깨닫기 전에 여러 커밋을 추가하는 비슷한 문제가 발생했습니다.

아주 간단한 해결책을 찾았습니다.

먼저 원격을 원래 저장소로 제거하십시오.

git remote remove origin

두 번째로 내 github의 새 포크에 리모컨을 추가합니다.

git remote add origin <my repo URL>

그런 다음 origin master로 푸시했고 모든 커밋이 내 github에 표시되었습니다.


1
이것에 추가하기 위해 내가 눌렀을 때 나는해야만 git push --set-upstream origin master했지만 Git은 이것을 당신에게 알립니다.
MRichards

위대하고 쉬운 솔루션!
mecograph

3
  • 대상 Git = UrlD (기존 콘텐츠는 중요하지 않음)
  • SourceGit = UrlS

    git clone UrlS
    
    git remote add origin2 UrlD
    
    git push -f origin2 master
    

이제 Destination은 Source와 동일한 데이터를 갖게됩니다 (origin2 대신 origin을 사용할 수도 있습니다).


0

다음 접근 방식을 사용했습니다.

  • 소스 리포지토리를 / c / SrcRepo와 같은 폴더에 복제합니다.

  • 대상 저장소를 / c / DstRepo와 같은 폴더에 복제하고 대상 분기로 전환합니다.

  • 대상 저장소의 루트 폴더에서 다음 명령을 실행하십시오.

    git pull / c / SrcRepo srcBranch-관련없는 기록 허용

추가 원격 참조를 만들 필요가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.