programing

GitHub에서 분기된 저장소를 업데이트하거나 동기화하려면 어떻게 해야 합니까?

stoneblock 2023. 4. 14. 21:05

GitHub에서 분기된 저장소를 업데이트하거나 동기화하려면 어떻게 해야 합니까?

프로젝트를 분기하고, 변경을 가하고, 풀 요청을 만들어 수락했습니다.이후 새로운 커밋이 저장소에 추가되었습니다.어떻게 포크에 커밋을 넣죠?

저장소의 할 수 . "GitHub" "리모트"는 저장소 URL의 닉네임과 같습니다."('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

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단, 가능한 한 깨끗한 풀 요청을 하려면 기본을 다시 설정하는 것이 좋습니다.


런런 your your your로 upstream/masterGitHub에 있는 자신의 분기형 저장소로 푸시하기 위해 강제로 푸시해야 할 수 있습니다.이치노

git push -f origin master

.-f재기초하고 나서 처음이야

2014년 5월부터 GitHub에서 직접 Fork 업데이트가 가능합니다.이는 2017년 9월 현재도 여전히 유효하지만 더러운 약속 이력으로 이어질 것입니다.

  1. GitHub에서 포크를 엽니다.
  2. 를 클릭합니다.
  3. 클릭하세요. 기본적으로는 GitHub은 원본과 포크를 비교합니다.변경을 하지 않았다면 비교할 것이 없습니다.
  4. 해당 링크가 보이면 클릭합니다.그 이외의 경우는 수동으로 드롭 다운을 포크, 를 업스트림으로 설정합니다.이제 GitHub은 당신의 포크를 원본과 비교하고 당신은 모든 최신 변경 사항을 볼 수 있을 것입니다.여기에 이미지 설명 입력
  5. Create pull request 풀 요청에 예측 가능한 이름을 할당합니다(예:Update from original를 참조해 주세요.
  6. 아래까지 스크롤하지만 아직 아무 것도 클릭하지 마십시오.

3가지 옵션이 있습니다만, 각각에 의해 커밋 이력이 깨끗하지 않게 됩니다.

  1. 기본적으로는 보기 흉한 병합 커밋이 생성됩니다.
  2. 드롭다운을 클릭하고 "Squash and Merge"를 선택하면 개입하는 모든 커밋이 하나로 압축됩니다.이것은 대부분의 경우 당신이 원하지 않는 것입니다.
  3. 를 클릭하면 모든 커밋이 "함께" 이루어지며 원래 PR이 PR에 링크되고 GitHub이 표시됩니다.This branch is X commits ahead, Y commits behind <original fork>.

따라서 GitHub 웹 UI를 사용하여 업스트림으로 repo를 갱신할 수 있지만, 그렇게 하면 커밋 이력이 흐트러집니다.대신 명령줄을 유지하십시오. 간단합니다.

다음은 포크 동기화 관련 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

머지

이제 업스트림저장소를 가져왔으므로 변경 내용을 로컬브런치에 Marge합니다.이것에 의해, 그 브랜치는 로컬의 변경을 잃지 않고, 업스트림과 동기합니다.

$ 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은 대신 "fast-forward"를 수행합니다.

$ git merge upstream/master
Updating 34e91da..16c56ad
Fast-forward
 README.md                 |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

힌트: GitHub의 저장소를 업데이트하려면 다음 절차를 따르십시오.

많은 답변이 상위 저장소보다 먼저 커밋됩니다. 답변은 포크가 부모와 동일한 커밋으로 이동하는 단계를 요약한 것입니다.

  1. 디렉토리를 로컬저장소로 변경합니다.

    • 합니다.git checkout master
  2. 저장소로서합니다.git remote add upstream <repo-location>

  3. ★★★git fetch upstream
  4. ★★★git rebase upstream/master

    • 것을 합니다.git status
  5. ★★★git push origin master

이러한 커맨드의 상세한 것에 대하여는, 순서 3 을 참조해 주세요.

나처럼 마스터에 직접 관여하지 않으면 다음 작업을 수행할 수 있습니다.

포크의 로컬클론에서 업스트림리모트를 만듭니다.이 작업은 한 번만 수행하면 됩니다.

git remote add upstream https://github.com/whoever/whatever.git

업스트림저장소 마스터브런치를 따라잡으려면 다음 작업을 수행해야 합니다.

git checkout master
git pull upstream master

만약 당신이 스스로 아무것도 하지 않았다고 가정한다면 당신은 이미 끝났어야 합니다.이제 로컬 마스터를 원본 원격 GitHub 포크로 푸시할 수 있습니다.최신 로컬 마스터에서 개발 브랜치를 기본 재배치할 수도 있습니다.

초기 업스트림 셋업과 마스터체크아웃을 종료하고 다음 명령어를 실행하여 업스트림과 마스터를 동기화하기만 하면 됩니다.git pull upstream master

서문:포크가 "원점"이고 포크가 있는 저장소가 "업스트림"입니다.

다음과 같은 명령으로 이미 컴퓨터에 포크를 복제했다고 가정해 보겠습니다.

git clone git@github.com:your_name/project_name.git
cd project_name

이것이 지정되어 있는 경우는, 다음의 순서로 속행할 필요가 있습니다.

  1. 복제된 저장소("origin")에 "업스트림"을 추가합니다.

    git remote add upstream git@github.com:original_author/project_name.git
    
  2. "업스트림"에서 커밋(및 분기)을 가져옵니다.

    git fetch upstream
    
  3. 포크의 "마스터" 브랜치("origin")로 전환합니다.

    git checkout master
    
  4. "마스터" 브랜치의 변경 내용을 저장합니다.

    git stash
    
  5. "업스트림"의 "마스터" 분기에서 "오리진"의 "마스터" 분기로 변경 내용을 병합합니다.

    git merge upstream/master
    
  6. 병합 충돌이 있는 경우 해결하고 병합을 커밋합니다.

    git commit -am "Merged from upstream"
    
  7. 변경 사항을 포크로 밀어넣다

    git push
    
  8. 저장된 변경 내용(있는 경우)을 되돌립니다.

    git stash pop
    
  9. 끝났어!축하합니다!

또한 GitHub은 다음 항목에 대한 지침을 제공합니다.포크 동기화

GitHub는 버튼 클릭으로 포크를 동기화하는 기능을 도입했습니다.

포크로 이동하여 을 클릭한 다음 을 클릭하여 포크를 부모 리포와 직접 동기화합니다.

여기에 이미지 설명 입력

병합하기 전에 변경 사항을 비교하기 위해 버튼을 클릭할 수도 있습니다.

참고 자료: GitHub 문서

웹 UI(옵션 1), GitHub CLI(옵션 2) 또는 명령줄(옵션 3)의 3가지 방법이 있습니다.


옵션 1 - 웹 UI

  1. GitHub에서 업스트림저장소와 동기화하는 분기형저장소의 메인페이지로 이동합니다.

  2. 업스트림 가져오기 드롭다운을 선택합니다.

여기에 이미지 설명 입력

  1. 업스트림저장소에서 커밋에 대한 자세한 내용을 검토한 다음 가져오기 및 병합을 클릭합니다.

여기에 이미지 설명 입력


옵션 2 - GitHub CLI

하려면 , 「」를 합니다.gh repo sync하위 명령어를 지정하고 포크 이름을 인수로 지정합니다.

$ gh repo sync owner/cli-fork

업스트림저장소에서 변경으로 인해 충돌이 발생할 경우 GitHub CLI는 동기화할 수 없습니다. 설정할 수 요.-force대상 분기를 덮어쓰도록 플래그를 지정합니다.


옵션 3 - 명령줄

업스트림 저장소와 포크를 동기화하기 전에 Git에서 업스트림 저장소를 가리키는 리모컨을 설정해야 한다.

1 Git Bash를 엽니다.

2 현재 작업 디렉토리를 로컬프로젝트로 변경합니다.

3 업스트림저장소에서 브랜치 및 각각의 커밋을 가져옵니다.BRANCHNAME에 대한 커밋은 로컬브런치 업스트림/BRANCHNAME에 저장됩니다.

$ git fetch upstream
> 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/ORIGINAL_OWNER/ORIGINAL_REPOSITORY
>  * [new branch]      main     -> upstream/main

4 포크의 로컬 디폴트 브랜치를 확인합니다.이 경우 main을 사용합니다.

$ git checkout main
> Switched to branch 'main'

5 업스트림 디폴트브런치(이 경우는 업스트림/메인)로부터의 변경을 로컬 디폴트브런치에 Marge 합니다.그러면 로컬 변경 사항을 손실하지 않고 포크의 기본 분기가 업스트림 저장소와 동기화됩니다.

$ git merge upstream/main
> 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/main
> Updating 34e91da..16c56ad
> Fast-forward
>  README.md                 |    5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)

주의: 포크를 동기화하면 레포의 로컬 복사본만 업데이트됩니다.GitHub.com에서 자신의 포크를 업데이트하기 위해서는 변화를 추진해야 한다.


출처 : GitHub Docs - 포크 동기화

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를 사용하는 경우, 이제 한 번의 클릭으로 포크를 업데이트할 수 있습니다.

  1. UI에서 저장소를 선택합니다.
  2. 맨 위의 "사용자/브런치에서 업데이트" 버튼을 클릭합니다.

실제로 브라우저 내의 업스트림의 임의의 커밋에서 포크에 브랜치를 작성할 수 있습니다.

  • .https://github.com/<repo>/commits/<hash>여기서 repo는 포크, hash는 업스트림 웹 인터페이스에서 찾을 수 있는 커밋의 풀 해시입니다.예를 들어, https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990, 를 열 수 있습니다.이것들은linux master글쓰기로서
  • "Tree: ..." 버튼을 클릭합니다.
  • 새 브랜치 이름을 입력하고

여기에 이미지 설명을 입력하십시오.

그런 다음 해당 브랜치를 로컬 클론으로 가져올 수 있으며, 해당 커밋 위에 편집을 푸시할 때 모든 데이터를 GitHub에 다시 푸시할 필요가 없습니다.또는 웹 인터페이스를 사용하여 해당 분기의 무언가를 변경합니다.

동작 방식(GitHub가 정확히 어떻게 동작하는지는 모르지만): 포크는 객체 스토리지를 공유하고 네임스페이스를 사용하여 사용자의 참조를 구분합니다.따라서 포킹 시점까지 존재하지 않는 경우에도 포크를 통해 모든 커밋에 액세스할 수 있습니다.

다음의 순서에 따릅니다.시도해 봤는데 도움이 됐어요.

지점 체크아웃

구문: git branch your Development Branch
예: git checkout master

최신 코드를 가져올 소스 저장소 분기를 꺼냅니다.

구문: git pull https://github.com/tastejs/awesome-app-ideas 마스터
예: git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME

다음 행으로 분기된 저장소를 업데이트합니다.

git pull https://github.com/forkuser/forkedrepo.git branch

다른 솔루션이 여기에 게시되어 있듯이 프로젝트에 다른 원격 끝점을 추가하지 않으려면 이 옵션을 사용하십시오.

$ git remote add upstream https://github.com/....

$ git pull upstream main

$ git push

이 답변을 보완하기 위해 업스트림브런치에서 클론된 repo(origin)의 모든 리모트브런치를 한번에 갱신하는 방법을 찾고 있었습니다.이렇게 했어요.

이것은 소스 저장소(오리진이 포크된 )를 가리키는 업스트림리모트가 이미 설정되어 있는 것을 전제로 하고 있습니다.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

이 명령어의 첫 번째 부분에서는 업스트림리모트 repo의 모든 헤드가 나열되고 SHA-1이 삭제되고 이어서refs/heads/브랜치명 프리픽스

그런 다음 각 브랜치에 대해 업스트림리모트 트래킹브런치의 로컬복사를 푸시합니다(refs/remotes/upstream/<branch>리모트 브랜치에 직접 접속합니다(로컬측).refs/heads/<branch>★★★★★★★★★★★★★★★★★★」

이러한 branch sync 명령어는 업스트림브런치가 다시 작성되었거나 해당 브랜치의 커밋을 포크로 푸시한 경우 중 하나의 이유로 실패할 수 있습니다.포크의 브랜치에 아무것도 커밋하지 않은 첫 번째 경우, 강하게 누르는 것이 안전합니다(-f 스위치 추가, 즉, git push -f를 참조해 주세요).다른 경우에서는 포크브런치가 분산되어 있기 때문에 커밋이 업스트림으로 Marge될 때까지 sync 명령어가 동작할 수 없습니다.

"Pull" 앱은 자동 셋업&포기 솔루션입니다.포크의 디폴트브런치가 업스트림저장소와 동기화합니다.

URL을 방문하여 녹색 "설치" 단추를 클릭하고 자동 동기화를 활성화할 저장소를 선택합니다.

브랜치는 GitHub에서 1시간에 1회 직접 갱신됩니다.로컬 머신에서는 로컬 복사가 동기화되도록 마스터 브랜치를 풀해야 합니다.

이치노git remote -v이것으로 충분합니다.

git fetch upstream
git checkout master
git merge --no-edit upstream/master
git push

분기된 저장소를 복제한 후 클론이 상주하는 디렉토리 경로와 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"를 수행할 때만 원격 서버에 푸시된 변경 사항을 동료에게 알립니다.

자세한 내용은 여기를 참조하십시오.

포크가 https://github.com/me/foobar이고 원래 저장소가 https://github.com/someone/foobar이라고 가정합니다.

  1. https://github.com/me/foobar/compare/master를 방문합니다...master: 마스터

  2. 텍스트가 Able to merge그런 다음 Create pull request를 누릅니다.

  3. 다음 페이지에서 페이지 맨 아래로 스크롤하여 Merge pull request 및 Confirm merge를 클릭합니다.

다음 코드 스니펫을 사용하여 분기된 저장소를 동기화하는 링크를 생성합니다.

new Vue ({
    el: "#app",
    data: {
      yourFork: 'https://github.com/me/foobar',
      originalRepo: 'https://github.com/someone/foobar'
    },
    computed: {
      syncLink: function () {
        const yourFork = new URL(this.yourFork).pathname.split('/')
        const originalRepo = new URL(this.originalRepo).pathname.split('/')
        if (yourFork[1] && yourFork[2] && originalRepo[1]) {
          return `https://github.com/${yourFork[1]}/${yourFork[2]}/compare/master...${originalRepo[1]}:master`
        }
        return 'Not enough data'
      }
    }
  })
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  Your fork URL: <input size=50 v-model="yourFork" /> <br />
  Original repository URL: <input v-model="originalRepo" size=50 /> <br />
  Link to sync your fork: <a :href="syncLink">{{syncLink}}</a>
</div>

Android Studio는 이제 GitHub 포크 저장소 사용법을 배웠습니다(콘솔 명령으로 "업스트림" 원격 저장소를 추가할 필요도 없습니다).

VCSGit 메뉴 열기

그리고 마지막 두 가지 팝업 메뉴 항목에 주의하십시오.

  • GitHub 포크 기본 변경

  • 풀 요청 생성

먹어봐.첫 번째 파일을 사용하여 로컬 저장소를 동기화합니다.어쨌든 "Rebase my GitHub fork"를 클릭하면 상위 리모트 저장소(업스트림)의 브랜치에 Android Studio에서 액세스할 수 있게 되어 쉽게 조작할 수 있게 됩니다.

('Git Integration'과 'Git Hub' 플러그인과 함께 Android Studio 3.0을 사용하고 있습니다.)

여기에 이미지 설명을 입력하십시오.

@krlmlr의 답변 추가하고 싶습니다.

처음에 분기된 저장소에는 다음과 같은 이름의 브랜치가 1개 있습니다.master 있는 는, feature변경을 가할 수 있습니다.

파일을 설정할 수 .pull.yml(기능 브랜치에 있는) Pull 앱의 경우 다음과 같습니다.

version: "1"
rules:
  - base: feature
    upstream: master
    mergeMethod: merge
  - base: master
    upstream: parent_repo:master
    mergeMethod: hardreset

하면 「」가 됩니다.master리포★★★★★★★★★를 유지합니다.feature Repo를 master회답하다 경우는 '아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.feature입니다.

에서는 2개의 ★★★★★★★★★★★★★★★★★★★★★★.mergemethods열중하고 hardreset 동기화 수 .master은 "repo"입니다.merge는 사용자가 할 때 feature 및 은 강제 .masterMarge 경합이 발생할 경우 Pull App을 통해 풀 요청 시 다음 작업 방향을 선택할 수 있습니다.

, 다양한 설정들을 수 .mergemethods 여기 있습니다.

저는 현재 이 설정을 여기에서 요청한 기능 향상을 최신 상태로 유지하기 위해 분기된 보고서로 사용하고 있습니다.

로컬 머신의 Forked Repo를 업데이트하려면 어떻게 해야 합니까?

먼저 리모트/마스터 체크

git remote -v

오리진 및 업스트림이어야 합니다.예를 들어 다음과 같습니다.

origin  https://github.com/your___name/kredis.git (fetch)
origin  https://github.com/your___name/kredis.git (push)
upstream    https://github.com/rails/kredis.git (fetch)
upstream    https://github.com/rails/kredis.git (push)

그런 다음 메인 화면으로 이동합니다.

git checkout main

업스트림에서 메인으로의 Marge:

git merge upstream/main

저장소의 크기와 포킹 방법에 따라 달라집니다.

꽤 큰 저장소라면 특별한 방식으로 관리해야 할 수도 있습니다(드롭 이력 등).기본적으로 현재 버전과 업스트림 버전의 차이를 가져와 커밋한 후 마스터로 되돌릴 수 있습니다.

이거 한번 읽어보세요.빅 Git 저장소를 처리하는 방법과 최신 변경으로 업스트림하는 방법에 대해 설명합니다.

각각의 업스트림에서 GitHub 포크를 최신 상태로 유지하고 싶다면 GitHub 전용 probot 프로그램인 https://probot.github.io/apps/pull/도 있습니다.계정에 설치를 허용해야 포크를 최신 상태로 유지할 수 있습니다.

업스트림 마스터에서 분기된 보고서를 동기화하려면 "업스트림 가져오기"를 클릭하십시오.여기에 이미지 설명 입력

분기된 저장소를 항상 영구적으로 업데이트하려면 두 가지 주요 사항이 있습니다.

1. Fork Master에서 브런치만들고 거기에서 변경을 합니다.

따라서 Pull Request가 승인되면 업스트림에서 업데이트하면 기여 코드가 분기된 저장소의 마스터에 저장되므로 분기를 안전하게 삭제할 수 있습니다.이렇게 하면 마스터는 항상 깨끗한 상태로 새 브랜치를 생성하여 다른 변경을 수행할 수 있습니다.

2. Fork Master가 자동으로 업데이트하도록 예약된 작업을 만듭니다.

이것은 cron을 사용하여 실행할 수 있습니다.다음은 Linux에서 실행하는 경우의 코드 예시입니다.

$ crontab -e

를 이이에 붙이다crontab file1번으로 하다

0 * * * * sh ~/cron.sh

" "를 .cron.sh스크립트 파일 및 ssh-agent와의 git 상호 작용 및/또는 다음과 같이 예상합니다.

#!/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`

분기된 리포지토리를 확인합니다.항상 다음 알림이 표시됩니다.

이 브랜치는 :master와 짝수입니다.

여기에 이미지 설명 입력

다음 명령어를 사용합니다(행운의 경우).

git remote -v
git pull
git fetch upstream
git checkout master
git merge upstream/master --no-ff
git add .
git commit -m"Sync with upstream repository."
git push -v

GitHub Desktop을 사용하면 6단계(실제로는 5단계)로 쉽게 할 수 있습니다.

Github Desktop을 열고 저장소를 선택하면

  1. 이력 탭으로 이동
  2. 검색줄을 클릭합니다.사용 가능한 모든 브런치(부모 저장소의 업스트림브런치 포함)가 표시됩니다.
  3. 각각의 업스트림브런치를 선택합니다(마스터브런치를 동기화하려면 업스트림/마스터가 됩니다).
  4. (임의) 업스트림브런치 내의 모든 커밋이 표시됩니다.원하는 커밋을 클릭하여 변경 내용을 볼 수 있습니다.
  5. [ Merge in ]의 [을합니다.masterbranch-name(어느 쪽인가 하면)
  6. GitHub Desktop이 마법을 부릴 때까지 기다립니다.

다음 GIF를 예로 들어 보겠습니다.

상위 저장소에서 분기된 저장소의 업스트림 분기 동기화

github 페이지에서 원격 개발 삭제

그런 다음 다음 명령을 적용합니다.

1) git branch -D dev
2) git fetch upstream
3) git checkout master
4) git fetch upstream && git fetch upstream --prune && git rebase upstream/master && git push -f origin master
5) git checkout -b dev
6) git push origin dev
7) git fetch upstream && git fetch upstream --prune && git rebase upstream/dev && 8) git push -f origin dev

설정을 표시하려면 다음 명령을 사용합니다.

git remote -v

언급URL : https://stackoverflow.com/questions/7244321/how-do-i-update-or-sync-a-forked-repository-on-github