나는 최근에 프로젝트를 포크하고 몇 가지 수정 사항을 적용했습니다. 그런 다음 풀 요청을 작성하여 수락했습니다.
며칠 후 다른 기고자가 다른 변경을가했습니다. 그래서 내 포크에는 그 변화가 없습니다.
포크로 바꾸려면 어떻게해야합니까? 기여할 추가 변경 사항이있을 때 포크를 삭제하고 다시 작성해야합니까? 아니면 업데이트 버튼이 있습니까?
나는 최근에 프로젝트를 포크하고 몇 가지 수정 사항을 적용했습니다. 그런 다음 풀 요청을 작성하여 수락했습니다.
며칠 후 다른 기고자가 다른 변경을가했습니다. 그래서 내 포크에는 그 변화가 없습니다.
포크로 바꾸려면 어떻게해야합니까? 기여할 추가 변경 사항이있을 때 포크를 삭제하고 다시 작성해야합니까? 아니면 업데이트 버튼이 있습니까?
답변:
분기 저장소의 로컬 클론에서 원래 GitHub 저장소를 "원격"으로 추가 할 수 있습니다. ( "Remotes"는 리포지토리의 URL에 대한 별명과 같습니다 origin
. 예를 들어 하나입니다.) 그런 다음 해당 업스트림 리포지토리에서 모든 분기를 가져오고 업스트림 버전 작업을 계속하기 위해 작업을 리베이스 할 수 있습니다. 다음과 같은 명령 측면에서 :
# Add the remote, call it "upstream":
git remote add upstream https://github.com/whoever/whatever.git
# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:
git fetch upstream
# Make sure that you're on your master branch:
git checkout master
# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:
git rebase upstream/master
마스터 브랜치의 히스토리를 다시 작성하지 않으려면 (예 : 다른 사람들이이를 복제했을 수 있음) 마지막 명령을로 바꾸어야합니다 git merge upstream/master
. 그러나 최대한 깔끔한 추가 풀 요청을 만들려면 리베이스하는 것이 좋습니다.
지점을 기반으로 한 경우 upstream/master
GitHub의 자체 포크 저장소로 푸시하기 위해 푸시를 강제해야 할 수도 있습니다. 당신은 그것을 할 것입니다 :
git push -f origin master
-f
리베이스 한 후 처음으로 만 사용해야합니다 .
-f
버전을 복제했을 수있는 모든 사람을 망쳐 놓은 기록을 다시 작성하지 않아도됩니다 .
git merge --no-ff upstream/master
이렇게하면 커밋이 더 이상 최상위에 있지 않습니다.
2014 년 5 월부터 GitHub에서 직접 포크를 업데이트 할 수 있습니다. 이것은 여전히 2017 년 9 월부터 작동 하지만 커밋 기록이 더러워집니다.
Update from original
.이제 세 가지 옵션이 있지만 각 옵션은 명확하지 않은 커밋 기록으로 이어집니다.
This branch is X commits ahead, Y commits behind <original fork>
.따라서 GitHub 웹 UI를 사용하여 리포를 업스트림으로 업데이트 할 수 있지만 그렇게하면 커밋 기록이 완전히 바뀌게됩니다. 스틱 명령 행 대신 - 그것은 간단합니다.
포크 동기화에 대한 GitHub 공식 문서는 다음과 같습니다 .
포크 동기화
설정
동기화하기 전에 업스트림 저장소를 가리키는 리모트를 추가해야합니다. 원래 분기했을 때이 작업을 수행했을 수 있습니다.
팁 : 포크를 동기화하면 리포지토리의 로컬 복사본 만 업데이트됩니다. GitHub에서 리포지토리를 업데이트하지 않습니다.
$ git remote -v # List the current remotes origin https://github.com/user/repo.git (fetch) origin https://github.com/user/repo.git (push) $ git remote add upstream https://github.com/otheruser/repo.git # Set a new remote $ git remote -v # Verify new remote origin https://github.com/user/repo.git (fetch) origin https://github.com/user/repo.git (push) upstream https://github.com/otheruser/repo.git (fetch) upstream https://github.com/otheruser/repo.git (push)
동기화
리포지토리를 업스트림과 동기화하는 데 필요한 두 단계가 있습니다. 먼저 원격에서 가져와야하고 원하는 분기를 로컬 분기로 병합해야합니다.
가져 오는 중
원격 저장소에서 가져 오면 브랜치와 해당 커밋이 발생합니다. 이들은 특수 저장소 아래의 로컬 저장소에 저장됩니다.
$ git fetch upstream # Grab the upstream remote's branches remote: Counting objects: 75, done. remote: Compressing objects: 100% (53/53), done. remote: Total 62 (delta 27), reused 44 (delta 9) Unpacking objects: 100% (62/62), done. From https://github.com/otheruser/repo * [new branch] master -> upstream/master
이제 업스트림의 마스터 브랜치가 업스트림 / 마스터의 로컬 브랜치에 저장되었습니다.
$ git branch -va # List all local and remote-tracking branches * master a422352 My local commit remotes/origin/HEAD -> origin/master remotes/origin/master a422352 My local commit remotes/upstream/master 5fdff0f Some upstream commit
합병
업스트림 리포지토리를 가져 왔으므로 변경 사항을 로컬 지점에 병합하려고합니다. 이렇게하면 로컬 변경 사항을 잃지 않고 해당 지점이 업스트림과 동기화됩니다.
$ git checkout master # Check out our local master branch Switched to branch 'master' $ git merge upstream/master # Merge upstream's master into our own Updating a422352..5fdff0f Fast-forward README | 9 ------- README.md | 7 ++++++ 2 files changed, 7 insertions(+), 9 deletions(-) delete mode 100644 README create mode 100644 README.md
로컬 브랜치에 고유 한 커밋이 없으면 git은 대신 "빨리 감기"를 수행합니다.
$ git merge upstream/master Updating 34e91da..16c56ad Fast-forward README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
팁 : GitHub에서 리포지토리를 업데이트하려면 여기 지침을 따르십시오
git push origin master
--follow-tags
: stackoverflow.com/a/26438076/667847
git merge upstream/master
한 다음 지점을 개발하고 수행해야 할 사항을 확인하십시오git merge upstream/develop
Permission denied (publickey). fatal: Could not read from remote repository.
Facebook의 Github 계정 업스트림에서 가져 오려고 할 때 유용했기 때문에 도움이되었습니다 .
많은 답변 이 부모 저장소 보다 한 번 커밋을 포크로 이동시킵니다 . 이 답변은 발견 단계 요약 여기 것 같은 당신의 포크를 이동 부모 커밋을 .
디렉토리를 로컬 저장소로 변경하십시오.
git checkout master
부모를 원격 저장소로 추가하십시오. git remote add upstream <repo-location>
git fetch upstream
발행물 git rebase upstream/master
git status
발행물 git push origin master
이 명령에 대한 자세한 정보는 3 단계를 참조하십시오 .
서문 : 포크는 "원본"이고 포크 한 저장소는 "업스트림"입니다.
다음과 같은 명령으로 이미 포크를 컴퓨터에 복제했다고 가정 해 봅시다.
git clone git@github.com:your_name/project_name.git
cd project_name
그것이 주어진 경우 다음 순서로 계속 진행해야합니다.
"업스트림"을 복제 된 저장소 ( "origin")에 추가하십시오.
git remote add upstream git@github.com:original_author/project_name.git
"업스트림"에서 커밋 (및 분기)을 가져옵니다.
git fetch upstream
포크의 "마스터"분기 ( "origin")로 전환하십시오.
git checkout master
"마스터"지점의 변경 사항을 보관하십시오 :
git stash
"업스트림"의 "마스터"브랜치에서 "원본"의 "마스터"브랜치로 변경 사항을 병합하십시오.
git merge upstream/master
병합 충돌이있는 경우 해결하고 병합을 커밋
git commit -am "Merged from upstream"
포크로 변경 사항을 밀어
git push
숨겨둔 변경 사항을 다시 가져옵니다 (있는 경우).
git stash pop
끝났습니다! 축하합니다!
GitHub는이 주제에 대한 지침도 제공합니다 . 포크 동기화
git remote add upstream git@github.com:original_author/project_name.git
에 대한 별칭 git remote add upstream https://github.com/original_author/project_name.git
입니까?
git stash
그리고 git stash pop
일부 매우 도움이
나와 같이 master에 직접 아무것도 커밋하지 않으면 실제로 다음을 수행 할 수 있습니다.
포크의 로컬 클론에서 업스트림 리모컨을 만듭니다. 한 번만 수행하면됩니다.
git remote add upstream https://github.com/whoever/whatever.git
그런 다음 업스트림 리포지토리 마스터 브랜치를 따라 잡을 때마다 다음을 수행해야합니다.
git checkout master
git pull upstream master
마스터 자신에게 아무것도 약속하지 않았다고 가정하면 이미 완료해야합니다. 이제 로컬 마스터를 오리진 원격 GitHub 포크로 푸시 할 수 있습니다. 또한 최신 로컬 마스터에 개발 브랜치를 리베이스 할 수도 있습니다.
초기 업스트림 설정 및 마스터 체크 아웃을 지나면 다음 명령을 실행하여 마스터를 업스트림과 동기화하기 만하면됩니다. git pull upstream master .
2013 년 11 월부터 GitHub에서 비공식 기능 요청을 통해 로컬 포크를 업스트림과 동기화 할 수있는 매우 간단하고 직관적 인 방법을 추가하도록 요청했습니다.
https://github.com/isaacs/github/issues/121
참고 : 기능 요청은 비공식적이므로 support@github.com
구현할 기능에 대한 지원을 추가하기 위해 연락 하는 것이 좋습니다 . 위의 비공식 기능 요청은이 구현에 대한 관심의 증거로 사용될 수 있습니다.
이 답변 날짜 현재 GitHub는 웹 인터페이스에서이 기능을 사용 하지 않습니다 ( 또는 더 이상 말하지 않겠습니까? ). 그러나 이에 support@github.com
대한 투표를 추가 하도록 요청할 수 있습니다.
한편, GitHub 사용자 bardiharborow는 https://upriver.github.io/ 를 수행하기위한 도구를 만들었습니다.
출처는 다음과 같습니다 : https://github.com/upriver/upriver.github.io
Windows 또는 Mac 용 GitHub를 사용하는 경우 이제 포크를 업데이트하는 원 클릭 기능이 있습니다.
실제로, 브라우저에서 업스트림 커밋을 통해 분기에 분기를 만들 수 있습니다.
https://github.com/<repo>/commits/<hash>
, REPO는 포크, 그리고 해시 당신이 업스트림 웹 인터페이스에서 찾을 수있는 커밋의 전체 해시입니다. 예를 들어, 내가 열 수 있습니다 https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990를 하는 점, linux
master
쓰기의 시간이있다.그런 다음 해당 분기를 로컬 클론으로 가져올 수 있으며 해당 커밋 위에 편집 내용을 푸시 할 때 해당 데이터를 모두 GitHub로 다시 푸시하지 않아도됩니다. 또는 웹 인터페이스를 사용하여 해당 분기에서 무언가를 변경하십시오.
작동 방식 (추측, GitHub가 정확히 어떻게하는지 모르겠습니다) : 포크는 객체 스토리지를 공유하고 네임 스페이스 를 사용 하여 사용자 참조를 분리합니다. 따라서 포크 시점에 존재하지 않더라도 포크를 통해 모든 커밋에 액세스 할 수 있습니다.
아래 단계를 따르십시오. 나는 그들을 시험해 보았고 그것은 나를 도왔다.
지점으로 결제
구문 : git branch yourDevelopmentBranch
예 : git checkout master
최신 코드를 얻기위한 풀 소스 리포지토리 분기
구문 : git pull https://github.com/tastejs/awesome-app-ideas master
예 : git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME
git push HttpsForYourForkOfTheRepo BRANCH_NAME
이 한 줄로 포크 리포지를 업데이트합니다.
git pull https://github.com/forkuser/forkedrepo.git branch
다른 솔루션이 여기에 게시 된 것처럼 프로젝트에 다른 원격 엔드 포인트를 추가하지 않으려면이 옵션을 사용하십시오.
이 답변을 보완하기 위해 업스트림 브랜치에서 복제 된 리포지토리 ( 원점 ) 의 모든 원격 브랜치를 한 번에 업데이트하는 방법을 찾고있었습니다 . 이것이 내가 한 방법입니다.
이는 소스 리포지토리 ( 원점 이 포크 된)를 가리키는 업스트림 원격 을 이미 구성하고 와 동기화했다고 가정합니다 .git fetch upstream
그런 다음 다음을 실행하십시오.
for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git push origin refs/remotes/upstream/$branch:refs/heads/$branch; done
이 명령의 첫 번째 부분은 업스트림 원격 저장소 의 모든 헤드를 나열 하고 SHA-1과 refs/heads/
분기 이름 접 두부를 제거합니다 .
그런 다음 각 지점에 대해 업스트림 원격 추적 지점 ( refs/remotes/upstream/<branch>
로컬 측) 의 로컬 사본 을 원점 ( refs/heads/<branch>
원격 측) 의 원격 지점으로 직접 푸시합니다 .
이러한 분기 동기화 명령은 다음 두 가지 이유 중 하나로 실패 할 수 있습니다. 업스트림 분기가 다시 작성되었거나 해당 분기의 커밋을 분기로 푸시했습니다. 포크의 브랜치에 아무것도 커밋하지 않은 첫 번째 경우 강제로 푸시하는 것이 안전합니다 ( 위의 명령에서 -f 스위치를 추가하십시오 git push -f
). 다른 경우에는 분기가 분기되어 커밋이 다시 업스트림 으로 병합 될 때까지 sync 명령이 작동 할 것으로 예상 할 때 이는 정상 입니다.
"풀"응용 프로그램은 자동 솔루션을 셋업이 앤 잊지이다. 포크의 기본 브랜치를 업스트림 저장소와 동기화합니다.
URL을 방문하여 녹색 "설치"버튼을 클릭 한 후 자동 동기화를 사용하려는 저장소를 선택하십시오.
지점은 GitHub에서 시간당 한 번 직접 업데이트되며 로컬 시스템에서는 로컬 사본이 동기화되도록 마스터 지점을 가져와야합니다.
mergemethod
. 이에 대한 자세한 여기
Android Studio는 이제 GitHub 포크 리포지토리를 사용하는 방법을 배웠습니다 (콘솔 명령으로 "업스트림"원격 리포지토리를 추가 할 필요조차 없음).
메뉴 열기 VCS → Git
마지막 두 팝업 메뉴 항목에주의하십시오.
내 GitHub 포크 리베이스
풀 요청 생성
사용해보십시오. 첫 번째 것을 사용하여 로컬 저장소를 동기화합니다. 어쨌든 "GitHub 포크 리베이스"를 클릭하면 Android Studio에서 상위 원격 저장소 ( "업스트림")의 브랜치에 액세스 할 수 있으며이를 사용하여 쉽게 조작 할 수 있습니다.
( "Git 통합"및 "GitHub"플러그인과 함께 Android Studio 3.0을 사용합니다.)
분기 저장소를 복제했으면 복제본이있는 디렉토리 경로와 Git Bash 터미널의 몇 줄로 이동하십시오.
$ cd project-name
$ git remote add upstream https://github.com/user-name/project-name.git
# Adding the upstream -> the main repo with which you wanna sync
$ git remote -v # you will see the upstream here
$ git checkout master # see if you are already on master branch
$ git fetch upstream
그리고 당신은 갈 수 있습니다. 기본 저장소에서 업데이트 된 모든 변경 사항이 포크 저장소로 푸시됩니다.
"fetch"명령은 프로젝트에서 최신 상태를 유지하는 데 반드시 필요합니다. "git fetch"를 수행 할 때만 동료가 원격 서버에 푸시 한 변경 사항에 대한 정보가 제공됩니다.
@ krlmlr 's answer 에 추가하고 싶습니다 .
처음에는 분기 저장소에 이름이 하나 인 분기가 master
있습니다. 새 기능 또는 수정 사항을 작업중인 경우 일반적으로 새 분기 feature
를 작성하고 변경합니다.
당신이 갈래 저장소 부모 저장소와 동기화하고 싶다면, 당신은 설정 파일 (설정할 수 pull.yml
에 대한) 풀 응용 프로그램 ( 기능 분기를 다음과 같이) :
version: "1"
rules:
- base: feature
upstream: master
mergeMethod: merge
- base: master
upstream: parent_repo:master
mergeMethod: hardreset
이렇게하면 master
분기 리포지토리 의 분기가 부모 리포지토리와 함께 최신 상태로 유지 됩니다. 그것은 유지 feature
를 통해 업데이트 갈래의 repo의 지점 master
과 동일한를 병합하여 갈래 REPO의 지점을. 이것은 feature
브랜치가 구성 파일을 포함하는 기본 브랜치 라고 가정 합니다.
여기서 두 가지 mergemethods
가 사용됩니다. 하나는 분기 된 저장소의 분기에서 상위 저장소와 hardreset
강제로 동기화 변경을 돕는 데 master
사용되고 다른 방법은 merge
입니다. 이 방법은 feature
지점 에서 수행 한 변경 사항 과 지점에서 강제 동기화로 인해 수행 된 변경 사항을 병합하는 데 사용됩니다 master
. 병합 충돌의 경우 풀 앱을 사용하여 풀 요청 중 다음 작업 과정을 선택할 수 있습니다.
기본 및 고급 구성에 대한 정보는 mergemethods
여기를 참조하십시오 .
나는 현재 내 갈래의 repo에서이 구성을 사용하고 여기에 있는지 향상 요청하기 위해 여기에 숙박이 업데이트되었습니다.
분기 저장소를 항상 업데이트하기 위해 유지해야 할 두 가지 주요 사항이 있습니다.
1. 포크 마스터에서 분기 를 작성하고 변경하십시오 .
따라서 풀 요청 이 수락되면 업스트림으로 업데이트 할 때 기여 코드가 분기 저장소의 마스터에 라이브되므로 분기를 안전하게 삭제할 수 있습니다. 이를 통해 마스터는 항상 새로운 상태를 유지하여 다른 변경을 수행 할 수 있습니다.
2. 포크 마스터가 자동으로 갱신 되도록 스케줄 된 작업 을 작성하십시오 .
이것은 cron 으로 수행 할 수 있습니다 . 다음은 리눅스에서 코드를 작성하는 예제 코드입니다.
$ crontab -e
이 코드를 위에 두어 crontab file
시간 단위로 작업을 실행하십시오.
0 * * * * sh ~/cron.sh
다음 작성 cron.sh
스크립트 파일과 자식의 상호 작용 과 SSH-에이전트 및 / 또는 기대 아래로
#!/bin/sh
WORKDIR=/path/to/your/dir
REPOSITORY=<name of your repo>
MASTER="git@github.com:<username>/$REPOSITORY.git"
UPSTREAM=git@github.com:<upstream>/<name of the repo>.git
cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent` && expect ~/.ssh/agent && ssh-add -l
git clone $MASTER && cd $REPOSITORY && git checkout master
git remote add upstream $UPSTREAM && git fetch --prune upstream
if [ `git rev-list HEAD...upstream/master --count` -eq 0 ]
then
echo "all the same, do nothing"
else
echo "update exist, do rebase!"
git reset --hard upstream/master
git push origin master --force
fi
cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent -k`
갈래 저장소를 확인하십시오. 때때로 항상이 알림이 표시됩니다.
이 브랜치는
<upstream>
: master 와도 같습니다 .