[git] GitHub 분기 저장소를 어떻게 업데이트합니까?

나는 최근에 프로젝트를 포크하고 몇 가지 수정 사항을 적용했습니다. 그런 다음 풀 요청을 작성하여 수락했습니다.

며칠 후 다른 기고자가 다른 변경을가했습니다. 그래서 내 포크에는 그 변화가 없습니다.

포크로 바꾸려면 어떻게해야합니까? 기여할 추가 변경 사항이있을 때 포크를 삭제하고 다시 작성해야합니까? 아니면 업데이트 버튼이 있습니까?



답변

분기 저장소의 로컬 클론에서 원래 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/masterGitHub의 자체 포크 저장소로 푸시하기 위해 푸시를 강제해야 할 수도 있습니다. 당신은 그것을 할 것입니다 :

git push -f origin master

-f리베이스 한 후 처음으로 만 사용해야합니다 .


답변

2014 년 5 월부터 GitHub에서 직접 포크를 업데이트 할 수 있습니다. 이것은 여전히 ​​2017 년 9 월부터 작동 하지만 커밋 기록이 더러워집니다.

  1. GitHub에서 포크를 엽니 다.
  2. 를 클릭하십시오 Pull Requests.
  3. 를 클릭하십시오 New Pull Request. 기본적으로 GitHub는 원본을 포크와 비교하므로 변경하지 않은 경우 비교할 내용이 없습니다.
  4. switching the base해당 링크가 표시되면 클릭 하십시오. 그렇지 않으면 base fork드롭 다운을 수동으로 포크와 head fork업스트림 으로 설정하십시오 . 이제 GitHub는 포크와 원본을 비교할 것이며 모든 최신 변경 사항을 볼 수 있습니다.
    여기에 이미지 설명을 입력하십시오
  5. Create pull request풀 요청에 예측 가능한 이름을 지정하십시오 (예 🙂 Update from original.
  6. 로 스크롤 Merge pull request하지만 아직 아무것도 클릭하지 마십시오.

이제 세 가지 옵션이 있지만 각 옵션은 명확하지 않은 커밋 기록으로 이어집니다.

  1. 기본적으로 못생긴 병합 커밋이 만들어집니다.
  2. 드롭 다운을 클릭하고 “스쿼시 및 병합”을 선택하면 모든 중재 커밋이 하나로 스쿼시됩니다. 이것은 대부분 원하지 않는 것입니다.
  3. 를 클릭 Rebase and merge하면 모든 커밋이 “함께”이루어지고 원래 PR이 PR에 연결되고 GitHub가 표시됩니다 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에서 리포지토리를 업데이트하려면 여기 지침을 따르십시오


답변

많은 답변 이 부모 저장소 보다 한 번 커밋을 포크로 이동시킵니다 . 이 답변은 발견 단계 요약 여기같은 당신의 포크를 이동 부모 커밋을 .

  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 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는이 주제에 대한 지침도 제공합니다 . 포크 동기화


답변

나와 같이 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구현할 기능에 대한 지원을 추가하기 위해 연락 하는 것이 좋습니다 . 위의 비공식 기능 요청은이 구현에 대한 관심의 증거로 사용될 수 있습니다.