로컬 Git 저장소와 원격 저장소 동기화


297

로컬 저장소를 원격 저장소와 동기화하여 로컬 저장소가 원격 저장소의 100 % 사본이되도록하려고합니다. 즉, 특정 파일이이 저장소와 다른 경우 로컬 저장소를 원격 저장소로 대체합니다. 원격에 존재하지 않는 로컬 리포지토리의 파일은 로컬 파일이 제거됩니다.

원격 저장소를 새로 복제하는 것 이외의 방법으로 다른 방법을 사용할 수 있습니까?

로컬 변경 / 커밋을 버리고 한 번에 원격으로 로컬 git repo동기화하는 것과 비슷한 질문 입니다.


4
항상 여기에 오면 포크 동기화를
Martin Thoma

1
git fetch --prune
hassanzadeh.sd

답변:


342
git fetch --prune

-p, --prune
가져온 후에는 더 이상 원격에 존재하지 않는 원격 추적 분기를 제거하십시오. 자두 옵션


6
그것이 내가 찾던 것입니다! PS 다음에 나는 stackoverflow를 파기 전에 매뉴얼 페이지를 더 자세히 읽을 것이다 :-)
Sergiy Sokolenko

5
그렇습니다. git pull -p'git pull은 주어진 매개 변수로 git fetch를 실행하고 git merge를 호출하여 검색된 분기 헤드를 현재 분기에 병합합니다' -git-scm.com/docs/git-pull
jobwat

2
git fetch <remote> --prune누군가 --prune특정 리모컨 만 필요한 경우 사용하십시오 . 예. git fetch upstream --prune.
Fery Wardiyanto

git fetch origin --pruneupstream프로젝트 의 포크와 로컬
리포지토리

2
우리가하는 모든 말,하지만 우리가 알고 깊은 SO 사람 페이지 P는 것이 더 편리되었다 무엇 @SergiySokolenko
마르첼로 로마

144

이 단계는 다음을 수행합니다.

git reset --hard HEAD
git clean -f -x -d -n

그런 다음없이 -n

이것은 모든 로컬 변경을 처리합니다. 이제 커밋 ...

git status

다음과 같은 줄을 적어 둡니다.

Your branch is ahead of 'xxxx' by N commits.

숫자 'N'을 기록해 두십시오.

git reset --hard HEAD~N
git pull

그리고 마지막으로:

git status

추가 / 커밋 할 내용이 없어야합니다. 모두 깨끗합니다.

그러나 새로운 클론은 동일한 작업을 수행 할 수 있지만 훨씬 느립니다.

=== 업데이트 ===

내 자식 지식이 시간이 지남에 따라 약간 개선되면서, 나는 또 다른 간단한 방법을 생각해 냈습니다. 방법은 다음과 같습니다 (# 설명 포함). 작업 지점에있는 동안 :

git fetch # This updates 'remote' portion of local repo. 
git reset --hard origin/<your-working-branch>
# this will sync your local copy with remote content, discarding any committed
# or uncommitted changes.

이 후에 로컬 커밋 및 변경 사항이 사라지더라도 필요한 경우 커밋 된 변경 사항을 복구 할 수 있습니다.


1
너무 많은 업데이트 주셔서 감사합니다 :) github에와의 bitbucket 완벽하게 잘 작동
CommonSenseCode

이 답변은 여기에서 가장 신뢰할만한 솔루션이었습니다.
AlanH

95

Git 리포지토리는 디렉토리와 파일의 트리 일뿐만 아니라 분기 및 병합을 포함 할 수있는 트리의 기록도 저장한다는 것을 이해해야합니다.

리포지토리에서 가져 오면 분기의 전부 또는 일부를 리포지토리에 복사합니다. 그런 다음 이러한 저장소는 "원격 추적 분기"(예 : remotes/origin/master이와 유사한 이름의 분기)로 저장소에 있습니다 .

원격 저장소에서 새 커밋을 가져와도 로컬 작업 복사본에 대한 내용은 변경되지 않습니다.

작업 사본에는 일반적으로이라는 커밋이 체크 아웃되어 HEAD있습니다. 이 커밋은 일반적으로 지역 지점 중 하나의 팁입니다.

로컬 분기 (또는 모든 로컬 분기?)를 해당 원격 분기로 업데이트 한 다음 최신 분기를 확인하고 싶다고 생각합니다.

작업 복사본 (로컬 변경이있을 수 있음)과의 충돌을 피하려면 먼저 버전 화되지 않은 모든 항목을 정리하십시오 (사용 git clean) 그런 다음 업데이트하려는 원격 브랜치에 해당하는 로컬 브랜치를 체크 아웃하고 git reset이를 사용 하여 가져온 원격 브랜치로 전환합니다. ( git pull로컬 브랜치의 모든 업데이트를 로컬 브랜치에 통합하여 로컬 커밋이있는 경우 동일하게 수행하거나 병합 커밋을 생성 할 수 있습니다.)

(그러나 작업 복사본과 로컬 커밋 모두에서 로컬 변경 사항을 실제로 잃게됩니다. 실제로 원하는지 확인하십시오. 그렇지 않으면 새 브랜치를 더 잘 사용하면 로컬 커밋이 저장 git stash되고 아직 커밋되지 않은 변경 사항을 저장 하는 데 사용 됩니다 .)


편집 : 로컬 지점이 하나만 있고 하나의 원격 지점을 추적하는 경우

git pull

작업 디렉토리 내부에서.

그러면 추적 된 모든 원격 브랜치의 현재 버전을 가져오고 현재 브랜치 (및 작업 디렉토리)를 현재 추적중인 원격 브랜치 버전으로 업데이트합니다.


로컬 저장소에서 NOTHING을 변경하면 a.) 원격의 모든 사본을 원하고 b.) 버전간에 차이점을 보여줄 수 있기를 원합니다. 따라서 커밋하지 않고 아무것도 변경하지 않습니다 = 로컬 업데이트 / 변경 없음. 위의 두 가지 기능을 달성하기 위해 정기적으로 (예 : 매주 정도) 사용해야하는 명령은 무엇입니까? KISS (Keep It Simple Stupid)에 답하십시오-나는 멍청한 놈이며 ofc는 RTFM을 할 것입니다. 그러나 시작을 위해서는 도움이 필요합니다. ;)
kobame 2016 년

당신의 간단한 경우에는 git pull충분할 것이라고 생각합니다. (내가 대답을 업데이트했습니다.)
파울로 Ebermann에게

내가 저지르고 싶지 않은 로컬 변경 사항이 있으면 어떻게됩니까? 이제 내가 풀을 할 때 커밋하거나 숨기라고 말합니다. 그래서이 경우 git에게 그것들을 무시하고 풀을 수행하도록 어떻게 말할 수 있습니까?
Harshana

89

하고 싶다

git fetch --prune origin
git reset --hard origin/master
git clean -f -d

로컬 리포지토리를 원격 리포지토리와 정확히 동일하게 만듭니다.

오리진과 마스터를 동기화하려는 원격 및 브랜치로 교체하십시오.


2
또한 .gitignore
chwagssd

내를 제거하지 않았으며 node_modules원하는대로 정확하게 작동합니다.
Vahid Amiri

경고 : 추적되지 않은 파일을 제거합니다
Amit Yadav

이 코드를 사용하여 모든 데이터를 잃어 버렸고 로컬 리포지토리를 git 리포지토리와 동기화하려고했습니다. 그러나 내 글로벌 리포지토리를 로컬 리포지토리와 동기화했습니다.
Zahid Khan

10

원격 저장소와 로컬 저장소 재설정 및 동기화

명령 : 원점과 마스터를 동기화하려는 원격 및 브랜치로 바꾸십시오.

git fetch origin && git reset --hard origin/master && git clean -f -d

또는 단계별 :

git fetch origin
git reset --hard origin/master
git clean -f -d

로컬 지점은 이제 원격 지점의 정확한 사본 (커밋 및 모두)입니다.

명령 출력 :

다음은 Forge a git 저장소의 로컬 클론에서 명령을 실행하는 예입니다.

sharkbook:forge lbaxter$ git fetch origin && git reset --hard origin/master && git clean -f -d
HEAD is now at 356cd85 FORGE-680
Removing forge-example-plugin/
Removing plugin-container-api/
Removing plugin-container/
Removing shell/.forge_settings
sharkbook:forge lbaxter$

4

(이 정보는 Git 사용자 매뉴얼에 있습니다. )

나는 또한 배우고 있으므로 이것이 질문에 대한 정확한 대답은 아니지만 누군가에게 도움이 될 수 있습니다.

  1. 원격 저장소가 처음 복제 될 때 모든 브랜치의 사본이 로컬 저장소에 저장됩니다. git branch -r )
  2. 이러한 복사본을 업데이트하고 최신 상태로 만들려면 (예 : 원격 지점과 동기화) git fetch . 기존의 사용자 정의 생성 브랜치에는 영향을 미치지 않습니다.
  3. 로컬 브랜치 체크 아웃을 무시하고 작업중 인 브랜치의 새로운 버전 (이미 실행 한 것으로 가정 git add origin /path/to/repository)을 사용하려면 git checkout origin/branch_name브랜치의 로컬 변경 사항을 재정의합니다branch_name

3

원격 저장소의 미러를 원하는 것처럼 들립니다.

git clone --mirror url://to/remote.git local.git

이 명령은 Bare 저장소를 작성합니다. 베어 리포지토리를 원하지 않으면 상황이 더 복잡해집니다.


3

분기 저장소 리포지토리에 대해 이야기하는 경우 다음 단계를 수행 할 수 있습니다.

git에서 포크 저장소를 동기화하는 방법

  1. 현재 자식 분기를 확인하십시오

    git branch

  2. 마스터가 아닌 경우 마스터 체크 아웃

    git checkout master

  3. 올바른 액세스 권한이있는 경우 업스트림 저장소를 가져옵니다.

    git fetch upstream

  4. 아래 오류가 발생하면 실행하십시오.

    git remote add upstream git@github.com:upstream_clone_repo_url/xyz.git

    fatal: 'upstream/master' does not appear to be a git repository  
    fatal: Could not read from remote repository.
    Please make sure you have the correct access rights and the repository exists.
    
  5. 이제 아래 명령을 실행하십시오.

    git fetch upstream

  6. 이제 마스터에 있다면 업스트림 / 마스터를 마스터 브랜치로 병합하십시오.

    git merge upstream/master

    그게 다야 !!

    git remote보다 구체적인 명령을 통한 교차 점검git remote -v

    또한 업스트림 리포지토리에 대한 커밋 권한이있는 경우 로컬 업스트림 지점을 만들고 업스트림으로 진행할 작업을 수행 할 수 있습니다.


세 번째 단계에서 이미 오류가 발생했을 때 5.git fetch upstream을 사용해야하는 이유는 무엇입니까?
Md Sifatul 이슬람

-2

이를 위해 자식 후크 를 사용할 수 있습니다 . 업데이트 후 변경 사항을 다른 저장소로 푸시하는 후크를 만드십시오.

물론 병합 충돌이 발생할 수 있으므로이를 해결하는 방법을 알아야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.