176

アップストリームの変更がある場合でも、特定のファイルを変更せずにgitプロジェクトを安全に更新(プル)するにはどうすればよいですか?

myrepo / config / config.php

このファイルがリモートで変更されていたとしても、git pullを実行すると、他のすべてが更新されますが、このファイルは変更されません(マージされません)。

PS。私はgitベースのデプロイスクリプトしか書いていないので、私が求めていることをする必要があります。設定ファイルをテンプレートに変更できません。

そのため、ローカルで変更されたものを失わない更新スクリプトを作成する方法が必要です。私は次のような単純なものを望んでいました:

git assume-remote-unchanged file1
git assume-remote-unchanged file2

それからgit pull

4

7 に答える 7

319

Gitスタッシュに基づく簡単なソリューションがあります。変更したものをすべて隠し、新しいものをすべて引き出し、隠しを適用します。

git stash
git pull
git stash pop

スタッシュポップでは、競合が発生する可能性があります。あなたが説明する場合、実際にはの競合がありconfig.phpます。しかし、あなたが隠し場所に置いたものがあなたが望むものであることがわかっているので、対立を解決するのは簡単です。だからこれを行う:

git checkout --theirs -- config.php
于 2012-05-02T14:42:20.900 に答える
17

ほとんどのプラーによってカスタマイズされるはずのファイルがリポジトリにある場合は、ファイルの名前を次のように変更して、config.php.templateに追加config.phpします.gitignore

于 2012-05-02T13:39:56.583 に答える
8

私が使う

git pull -X ours

これは、マージ時にローカルバージョンを使用するようにgitに指示します。

于 2021-07-29T16:52:07.123 に答える
7

更新:これは文字通り尋ねられた質問に答えますが、KurzedMetalの答えは本当にあなたが望むものだと思います。

仮定して:

  1. あなたは枝にいますmaster
  2. アップストリームブランチmasterorigin
  3. コミットされていない変更はありません

....あなたができること:

# Do a pull as usual, but don't commit the result:
git pull --no-commit

# Overwrite config/config.php with the version that was there before the merge
# and also stage that version:
git checkout HEAD config/config.php

# Create the commit:
git commit -F .git/MERGE_MSG

頻繁に行う必要がある場合は、そのエイリアスを作成できます。にコミットされていない変更がある場合config/config.php、これはそれらを破棄することに注意してください。

于 2012-05-02T13:40:14.133 に答える
4

リベースでgitpullを試すこともできます

git pull --rebase origin dev
于 2017-01-06T14:49:14.563 に答える
2

質問に答えるには:チェックアウトの特定のファイルを除外する場合は、 sparse-checkoutを使用できます

  1. .git/info/sparse-checkout、保持するものを定義します。ここでは、すべて(*)が必要ですが、(感嘆符に注意してください)config.php:

    / *!/config.php

  2. スパースチェックアウトを考慮に入れたいとgitに伝えます

    git config core.sparseCheckout true

  3. このファイルをすでにローカルに持っている場合は、スパースチェックアウトでgitが行うことを実行します(「skip-worktree」フラグを設定して、このファイルを除外する必要があることを伝えます)

    git update-index --skip-worktree config.php

  4. config.phpファイルがあなたのものであるリポジトリを楽しんでください-リポジトリにどんな変更があったとしても。


構成値はソース管理に含まれてはならないことに注意してください:

  • これは潜在的なセキュリティ違反です
  • 展開時にこのような問題が発生します

つまり、それらを除外し(最初のコミットの前に.gitignoreに入れて)、アプリをチェックアウトする各インスタンスに適切なファイルを作成する必要があります(「テンプレート」ファイルをコピーして適合させることにより)

ファイルがgitによって管理されると、.gitignoreは効果がないことに注意してください。

その場合、ファイルがソース管理下にあると、2つの選択肢しかありません():

  • すべての履歴をリベースしてファイルを削除します(でgit filter-branch

  • ファイルを削除するコミットを作成します。それは敗戦と戦うようなものですが、まあ、時にはそれと一緒に暮らす必要があります。

于 2020-01-16T10:05:50.493 に答える
1

それらがローカルのコミットされていない変更である場合、プル中のマージの競合を回避します。

git stash save
git pull
git stash pop

参照-https://happygitwithr.com/pull-tricky.html

于 2020-07-13T09:54:11.770 に答える