ローカルファイルを上書きせずにリモートからファイルをプルするにはどうすればよいですか?


112

既存のリモートリポジトリに新しいgitリポジトリをセットアップしようとしています。

ローカルファイルでリモートリポジトリを上書きしたいのですが、gitは最初にこれらのリモートファイルをプルしてマージする必要があると言っています。

プルする方法はありますが、ローカルファイルがリモートによって上書きされないことを確認してください。

回答:


181

ええ、そうです、そして...

ローカルコピーにリモートの内容を「上書き」させたいとのことですが、誰かがリモートリポジトリのファイルを別の方法で変更した場合、その変更を無視して「強制」しようとすると、可能性のある衝突を見ることさえせずにあなた自身の変更、まあ、私はあなた(そしてあなたの同僚)のために泣きます;-)

とはいえ、「正しいこと」を行うのは本当に簡単です。

ステップ1:

git stash

ローカルリポジトリ内。これにより、ローカルの更新がstashに保存され、変更されたファイルが編集前の状態に戻ります。

ステップ2:

git pull

変更されたバージョンを取得します。今、うまくいけば、それはあなたが心配しているファイルの新しいバージョンを取得しないでしょう。そうでない場合は、次のステップがスムーズに機能します。もしそうなら、あなたはやらなければならない仕事がいくつかあり、あなたがやったことを嬉しく思うでしょう。

ステップ3:

git stash pop

これにより、手順1で保存した変更バージョンと手順2でプルしたバージョンがマージされます。すべてが順調に進んだら、準備は完了です。

一方、ステップ2でプルした内容と変更(間に誰かが編集したため)の間に実際の矛盾があった場合は、それらを見つけて解決するように指示されます。やれ。

こうすることで、物事はずっとうまくいきます-深刻な問題について警告する一方で、実際の作業なしで変更を維持することができます。


5
なぜgit commitローカルな変化だけではないのgit pullか?
Don Cheadle

10
コードをコミットしたくないが、ローカルマシンに保持したい場合もあります。これらのコマンドセットは、これに非常に役立ちます。
Vargan、2015

3
これは、複数のファイルがあり、上書きしたいファイルと上書きしたくないファイルがある場合は役に立ちません。プル時にGITにファイルを無視させる方法はありませんか?なぜ.gitignoreはプッシュのみで機能するのですか、その設計決定はまったく理解できません...
Bobak Hashemi

25

最初にローカルの変更を隠しておき、次にプルしてから隠します。

git stash
git pull origin master
git stash pop

リモートからの変更を上書きするものはすべて競合があり、手動で解決する必要があります。


4
私はすでにこれらの変更をローカルにコミットしているため、「保存するローカル変更はない」と書かれています
Joe Isaacson 2013年

これが最高の戦略だと思います。
Jimmy Obonyo Abor

13

ローカルの変更をローカルのリポジトリにコミットしました。次に、ローカルファイルを変更せずにローカルリポジトリへのリモート変更を取得するには、を使用できますgit fetch。実際にgit pullは、2つのステップ操作git fetchがありgit mergeます。非破壊的な後にが続きます。「git pull」と「git fetch」の違いは何ですか?を参照してください詳細については。

詳細な例:

リポジトリが次のようであるとします(変更を加えましたtest2

* ed0bcb2 - (HEAD, master) test2
* 4942854 - (origin/master, origin/HEAD) first

そしてoriginリポジトリはこのようなものです(誰かがコミットしましたtest1):

* 5437ca5 - (HEAD, master) test1
* 4942854 - first

この時点で、gitは文句を言い、test2リモートリポジトリにpushしようとすると最初にpullするように要求します。ローカルリポジトリを変更せずにtest1を確認するには、次のコマンドを実行します。

$ git fetch

結果のローカルリポジトリは次のようになります。

* ed0bcb2 - (HEAD, master) test2 
| * 5437ca5 - (origin/master, origin/HEAD) test1 
|/  
* 4942854 - first 

これで、別のブランチにリモートの変更があり、ローカルファイルはそのまま保持されます。

次に、次は何ですか?(以前のと組み合わせた場合)とgit merge同じ効果になるを実行するか、または私が望むようにを変更を適用するためにを実行すると、履歴がより明確になります。git pullgit fetchgit rebase origin/masterorigin/master


git pullを2ステップのgit fetch / git mergeとして説明していただきありがとう
ございます
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.