github.com에서 포크한 프로젝트 위에 로컬 Git 저장소의 커밋을 어떻게 재생하나요?

StackOverflow https://stackoverflow.com/questions/1457248

  •  12-09-2019
  •  | 
  •  

문제

예, 처음부터 프로젝트를 포크했어야 했다는 건 알지만, 지금 제가 처한 상황은 이렇습니다.:)

내 로컬 컴퓨터에 내 블로그가 포함된 로컬 Git 저장소가 있는데, 이 저장소에는 몇 달 간의 커밋 기록이 있습니다.처음에는 저장소에서 파일을 다운로드했습니다.http://github.com/mojombo/mojombo.github.com, 그리고 나는 내 로컬 Git 저장소를 계속 사용했는데, 첫 번째 커밋은 mojombo 저장소의 최신 파일처럼 보였습니다.

이제 프로젝트를 포크하고 내 로컬 Git 저장소 커밋이 그 위에서 재생되도록 하려고 합니다. 따라서 프로젝트를 처음부터 포크한 다음 내 GitHub에 있는 포크된 버전의 mojombo 저장소로 다시 푸시한 것처럼 보입니다. 계정:

http://github.com/program247365/mojombo.github.com

그러면 아마도 역사는 다음과 같을 것입니다.

mobjombo repository:         1---2---3----23
                                  \
my blog repository commits:       24---25---

이 작업을 수행하기 위해 정확히 어떤 Git 명령을 사용할 수 있나요?

나는 보았다 이 질문.mojombo의 저장소를 내 프로젝트에 원격으로 추가한 다음 이를 끌어오고 병합하고 충돌을 해결한 다음 GitHub의 포크된 프로젝트로 푸시해야 합니까?

도움이 되었습니까?

해결책 2

내가 시도했을 때 git pull 다음과 같은 오류가 발생했습니다.

$ git pull grid master:master
! [rejected]        master     -> master  (non fast forward)

내 특별한 경우에는 그보다 보였습니다 git rebase 여기서 단계에서 볼 수 있듯이 나를 위해가는 길은 다음과 같습니다.

#Clone my forked project from github
git clone git@github.com:program247365/mojombo.github.com.git 

#Add my repo as a remote repo, with the alias 'grid'
git remote add grid "path/to/remote/gitrep/with/all/history/unrelated/to/mojombo/" 

#Rebase my commits on top of mojombo's
git rebase master grid/master

#Switch to the local master branch 
git checkout master

#Call up my mergetool via git, to start rectifying the conflicts that emerge between my repo, and mojombo's
git mergetool

#Push my rebased/combined repo back to Github.com
git push github

다른 팁

간단히 말해서:

한 가지 해결책은 다음을 사용하는 것입니다. 이식편 기록을 연결한 다음 사용하세요. git filter-branch 해당 접목에 따라 역사를 다시 작성하려면 선택적으로 다음을 수행하십시오. 병합.

원래 저장소( 리베이스 솔루션) 또 다른 실행 가능한 솔루션입니다.


더 긴 버전:

스냅샷을 다운로드하고 로컬 개발을 시작한 저장소의 개정판을 소스 검사 및/또는 git 명령을 사용하여 기억하거나 찾을 수 있다고 가정해 보겠습니다.이 개정판을 START 또는 A라고 부르겠습니다.

로컬 연결 끊김 기록이 원본 저장소의 복제본에 있다고 가정해 보겠습니다.이는 로컬 연결이 끊긴 개발이 프로젝트의 전체 기록과 동일한 저장소에 있음을 의미합니다.로컬 분기가 '마스터' 분기에 있다고 가정해 보겠습니다(단순화를 위해 분기가 하나만 있음).

로컬 연결이 끊긴 작업으로 프로젝트를 저장소로 가져오지 않은 경우 다음을 사용하여 이 작업을 수행할 수 있습니다.

$ git remote add origin git://github.com/mojombo/mojombo.github.com.git
$ git fetch origin

이제 기록은 다음과 같습니다.

*---*---*---*---*---A---*---*---*---*      <--- origin/master (remote-tracking branch)

                                     x---y---*---*---*      <--- master (your local disconnected history)

위 다이어그램에서 A라는 커밋은 스냅샷으로 다운로드하고 로컬 개발을 시작한 START 커밋입니다.

두 가지 가능성이 있습니다:'A'의 스냅샷을 초기 커밋 'x'로 커밋했거나 첫 번째 커밋이 로컬 수정 사항이었습니다.

첫 번째 경우(원래 시작 상태를 커밋했습니다.'초기 커밋' 또는 '가져오기') 연결된 기록이 다음과 같기를 원할 것입니다.

*---*---*---*---*---A---*---*---*---*      <--- origin/master (remote-tracking branch)
                                      \
                                        \-y---*---*---*       <--- master (your local disconnected history)

즉.'A'를 부모로 갖는 첫 번째 원래 커밋 'y'입니다.

두 번째 경우(변경 사항을 커밋한 경우) 연결된 기록이 다음과 같이 표시되기를 원할 것입니다.

*---*---*---*---*---A---*---*---*---*           <--- origin/master (remote-tracking branch)
                                      \
                                        \-x---y---*---*---*      <--- master (your local disconnected history)

즉.먼저 'x'를 커밋하여 'A'를 부모로 갖기를 원합니다.

두 경우 모두 커밋 'A'의 전체 SHA-1 식별자와 커밋 'x' 및 'y'의 전체 SHA-1 식별자를 찾고 싶습니다.

다음을 사용하여 커밋 'A'의 SHA-1을 찾을 수 있습니다(아직 모른다고 가정). git rev-parse:

$ git rev-parse A     # or A^{commit}
437b1b20df4b356c9342dac8d38849f24ef44f27

('^{commit}' 접미사는 찾았는지 확인하는 데 필요할 수 있습니다. 저지르다 SHA-1은 예를 들어 태그로 'A'를 알고 있는 경우 중요합니다.'v0.99';귀하의 경우에는 해당 저장소가 태그를 사용하지 않으므로 필요하지 않습니다.

다음을 사용하여 'x' 및 'y' 커밋의 SHA-1을 찾을 수 있습니다. 자식 개정 목록 (개발이 'master' 브랜치에서 수행되었다고 가정):

$ git rev-list --topo-order master | tail -2
8bc9a0c769ac1df7820f2dbf8f7b7d64835e3c68
e83c5163316f89bfbde7d9ab23ca2e25604af290

("| tail -2"는 생성된 목록에서 마지막 두 개의 커밋을 찾기 위해 여기에 있습니다.없으면 사용하지 않아도 됩니다.)

메모: 전체 SHA-1 위의 모든 예에서는 , 그대로 사용하면 안 됩니다!

'A'(또는 'START')를 부모로 지정하려는 커밋의 이름을 FIRST로 지정하겠습니다(위에서 설명한 대로 사례에 따라 'x' 또는 'y'가 됩니다).이제 우리는 이식 메커니즘 기록을 연결하려면:

$ echo "<SHA-1 of FIRST> <SHA-1 of START>" > .git/info/grafts

그런 다음 gitk, QGit 또는 GitX와 같은 그래픽 기록 브라우저를 사용하여 이제 올바르게 연결(결합) 기록이 있는지 확인해야 합니다. MacOS X를 사용 중이거나 "git log --graph", 또는 "git show-branch", 예:

$ gitk master origin/master    # or --all

(여기서 gitk는 단지 예일 뿐입니다."를 사용하는 경우git show branch"항상 사용할 수 있는 것은 아닙니다."--all' 옵션).

마지막으로 우리는 이러한 변경 사항을 영구적으로 적용하여 저장소에서 가져오는 사람도 연결된 기록을 갖게 되기를 원할 것입니다.우리는 다음을 사용하여 이를 수행할 수 있습니다. 자식 필터 지점:

$ git filter-branch master

'refs/original/master'에 원본(연결이 끊긴) 기록이 있습니다.

이제 접목 파일을 제거할 수 있습니다:

$ rm .git/info/grafts

이제 원본 저장소에 대한 새로운 개발을 병합할 수 있습니다.

$ git merge origin/master

브랜치별 구성을 설정하면 'master' 브랜치에서 "git pull"만 하면 충분하므로 원본(al) 저장소의 변경 사항을 가져오거나 병합하는 것은 독자의 연습 문제로 남겨집니다.:-)


메모: 그만큼 리베이스 솔루션 결과는 다음과 같습니다(첫 번째 커밋이 단순 가져오기인 경우가 있다고 가정).

*---*---*---*---*---A---*---*---*---*                                      <--- origin/master (remote-tracking branch)
                                                                     \
                                                                       \-y'---*'---*'---*'      <--- master (your local disconnected history)

(어디 y' 커밋한다는 뜻이다 y 수정되었습니다:거의 동일한 변경 세트여야 하지만 커밋과는 다릅니다.

다음은 당신이 할 수있는 일에 대한 생각입니다. 그것은 당신이 당신의 질문의 맨 아래에 요약 한 아이디어와 반대입니다.

  1. Github에있는 Fork Mojombo의 저장소.
  2. 포크 사본을 복제하십시오.
  3. 기존 (원본) 저장소의 변경 사항을 병합하십시오.
  4. 원래 저장소를 삭제하십시오 (원하는 경우 더 이상 필요하지 않음).

따라서 기본적으로 Github를 포킹 한 후 다음의 명령 시퀀스를 사용할 수 있습니다.

$ git clone git://github.com/$YOUR_USERNAME/$YOUR_PROJECT.git  # Clone your GitHub fork (#2 from above)
$ git pull /path/to/your/original/repo master:master           # Clone your original repo's master branch into your new repo (cloned from GitHub)
$ rm -rf /path/to/your/original/repo                           # Might as well delete the original -- you don't need it anymore, since all your history is in your new repo

요약하면,이 방법은 구형 레포에서 만든 모든 변경 사항 (따라서 개발 기록 보존)과 Mojombo의 역사를 끌어 올릴 것입니다. 그리고 적용 가능한 경우 Mojombo의 변경 사항을 따라 가거나 Repo에 쉽게 변경 사항을 기여할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top