지난주에 Github 리포지토리를 만들고 리포지토리에 대한 라이선스를 선택하는 것을 잊었습니다. 이제 이미 3 개의 큰 커밋이 있습니다.
나는 3 기고자에게 괜찮은지 물었고, 저장소를 삭제 한 다음 같은 이름으로 다시 만들 었는지, 이번에는 저장소를 만들 때 라이센스를 선택했는지 물어 보았습니다.
질문
커밋을 새 저장소로 가져오고 (이번에는 첫 번째 커밋이 LICENSE 파일 임) 커밋 메타 정보를 유지하는 방법이 있습니까?
답변
커밋을 새 저장소로 가져오고 (이번에는 첫 번째 커밋이 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
그게 다야. 모두가 지금 동기화되어야합니다.
답변
내 github에 저장소를 포크하는 것을 잊고 실수를 깨닫기 전에 여러 커밋을 추가하는 비슷한 문제가 발생했습니다.
아주 간단한 해결책을 찾았습니다.
먼저 원격을 원래 저장소로 제거하십시오.
git remote remove origin
두 번째로 내 github의 새 포크에 리모컨을 추가합니다.
git remote add origin <my repo URL>
그런 다음 origin master로 푸시했고 모든 커밋이 내 github에 표시되었습니다.
답변
- 대상 Git = UrlD (기존 콘텐츠는 중요하지 않음)
-
SourceGit = UrlS
git clone UrlS git remote add origin2 UrlD git push -f origin2 master
이제 Destination은 Source와 동일한 데이터를 갖게됩니다 (origin2 대신 origin을 사용할 수도 있습니다).
답변
다음 접근 방식을 사용했습니다.
-
소스 리포지토리를 / c / SrcRepo와 같은 폴더에 복제합니다.
-
대상 저장소를 / c / DstRepo와 같은 폴더에 복제하고 대상 분기로 전환합니다.
-
대상 저장소의 루트 폴더에서 다음 명령을 실행하십시오.
git pull / c / SrcRepo srcBranch-관련없는 기록 허용
추가 원격 참조를 만들 필요가 없습니다.