ローカルGitリポジトリとリモートGitリポジトリの同期


297

ローカルリポジトリをリモートリポジトリと同期して、ローカルリポジトリがリモートリポジトリの100%コピーになるようにしたいのです。つまり、これらのリポジトリで特定のファイルが異なる場合、ローカルのファイルをリモートのファイルで上書きします。リモートに存在しないローカルリポジトリ内のファイル、ローカルファイルは削除されます。

リモートリポジトリの新しいクローンを作成する以外にそれを達成する方法はありますか?

ローカルの変更/コミットを破棄して、ローカルのgitリポジトリをリモートでワンショットで同期するのと同じような質問です。


4
いつもここに来るとき、私はSyncing a forkを
Martin Thoma

1
git fetch --prune
hassanzadeh.sd

回答:


342
git fetch --prune

-p, --prune
フェッチした後、リモートに存在しないリモート追跡ブランチをすべて削除します。剪定オプション


6
それが私が探していたものです!PS次回は
スタックオーバーフローを

5
はい、git pull -p同じことを行います-'git pull
jobwat

2
git fetch <remote> --prune誰かが--prune特定のリモートのみを必要とする場合に使用します。例えば。git fetch upstream --prune
Fery Wardiyanto 2016年

git fetch origin --pruneローカルリポジトリとupstreamプロジェクトのフォークを同期するには
スチュアートカードール

2
@SergiySokolenkoそれは私たち全員が言うことですが、深いところにあるので、SOがより便利になったことをmanページで示しています:-P
マルチェロロマーニ

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の知識が少し向上したため、同じことを行うためのさらに簡単な方法を考え出しました。これがその方法です(#は説明付き)。作業ブランチにいる間:

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

この答えは、私にとってここで最も信頼できる解決策の1つです。
AlanH

95

Gitリポジトリは、ディレクトリとファイルのツリーだけでなく、それらのツリーの履歴も格納することを理解する必要があります。これには、ブランチとマージが含まれる場合があります。

リポジトリからフェッチするときは、すべてまたは一部のブランチをリポジトリにコピーします。これらは、「リモートトラッキングブランチ」としてリポジトリにありますremotes/origin/master

リモートリポジトリから新しいコミットを取得しても、ローカルの作業コピーについては何も変更されません。

作業コピーには通常、と呼ばれるコミットがチェックアウトされていHEADます。このコミットは通常、ローカルブランチの先端です。

ローカルブランチ(またはおそらくすべてのローカルブランチ?)を対応するリモートブランチに更新して、最新のブランチをチェックアウトしたいと思います。

作業コピー(ローカルで変更されている可能性があります)との競合を回避するには、まず、バージョン管理されていないものすべてを(を使用してgit clean)クリーンアップします。次に、更新先のリモートブランチに対応するローカルブランチをチェックアウトし、git resetそれを使用してフェッチしたリモートブランチに切り替えます。(git pullローカルブランチにリモートブランチのすべての更新が組み込まれます。これは同じことを行う場合があります。または、ローカルコミットがある場合はマージコミットを作成します。)

(ただし、作業コピーとローカルコミットの両方で、ローカルの変更はすべて失われます。本当にこれが必要であることを確認してください。そうでない場合は、新しいブランチを使用すると、ローカルコミットが保存されます。git stashさらに、まだコミットされていない変更を保存するために使用します。。)


編集: ローカルブランチが1つしかなく、1つのリモートブランチを追跡している場合、必要なのは

git pull

作業ディレクトリ内から。

これにより、追跡されているすべてのリモートブランチの現在のバージョンがフェッチされ、現在のブランチ(および作業ディレクトリ)が、追跡しているリモートブランチの現在のバージョンに更新されます。


ローカルリポジトリでNOTHINGを変更する場合、a。)リモートからすべてのコピーを取得したい場合、およびb。)バージョン間の差分を表示する可能性が必要な場合のみです。だから私はコミットせず、何も変更しない=ローカルの更新/変更はありません。上記の2つの機能を実現するために定期的に(たとえば、毎週など)どのコマンドを使用する必要がありますか?KISS(Keep It Simple Stupid)に答えてください-私もgit noobで、ofcはRTFMになります-しかし、最初は助けが必要です。;)
こばめ2011年

あなたの単純なケースでgit pullは十分だと思います。(私は答えを更新しました。)
PaŭloEbermann

コミットしたくないローカルの変更がある場合はどうなりますか?今、私がプルをすると、それをコミットするか、隠しておくように言われます。したがって、この場合、どのようにgitにそれらをオーバーライドしてプルを実行するように指示できますか?
Harshana

89

あなたがしたい

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

これにより、ローカルリポジトリがリモートリポジトリとまったく同じになります。

originとmasterを、同期したいリモートとブランチに置き換えることを忘れないでください。


2
また、.gitignoreにあるすべての依存関係を再インストールする場合を除き、npm installおよびbower installからすべてのディレクトリを削除します
chwagssd

それは私のを削除しませんでしたnode_modules、それは私が望むように正確に動作します。
Vahid Amiri 2017

警告:追跡されていないファイルを削除します
Amit Yadav

このコードを使用してすべてのデータを失い、ローカルリポジトリとgitリポジトリを同期させようとしました。しかし、それは私のグローバルリポジトリを私のローカルリポジトリと同期させました。
Zahid Khan

10

ローカルリポジトリをリセットしてリモートブランチと同期する

コマンド:originとmasterを、同期したいリモートとブランチに置き換えることを忘れないでください。

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

このコマンドは、ベアリポジトリを作成します。ベアリポジトリが必要ない場合、状況はさらに複雑になります。


3

フォークしたリポジトリの同期について話している場合は、次の手順を実行できます。

gitからforkリポジトリを同期する方法

  1. 現在のgitブランチを確認する

    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

    上流レポへのコミット権も持っている場合は、ローカルの上流ブランチを作成し、そこで上流に向かう作業を行うことができます。


3番目のステップですでにエラーが発生しているのに、なぜ5.git fetchアップストリームを実行する必要があるのですか?
Md Sifatul Islam 2017

-2

そのためにgitフックを使用できます。更新後に他のリポジトリに変更をプッシュするフックを作成するだけです。

もちろん、マージの競合が発生する可能性があるため、それらに対処する方法を理解する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.