2012-05-02 11 views
89

アップストリームの変更があっても、特定のファイルを変更しないで、gitプロジェクトを安全に更新(プル)できますか?git pullでローカル変更を維持する

myrepo /設定/ config.phpの

方法はありませんでも(このファイルは私がプルをgitの際に、他のすべてが更新され、リモートで変更されていたが、このファイルは変更されていない場合でも、で、あります合併)?

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

ですから、ローカルで変更されたものを失わない更新スクリプトを作成する必要があります。私は、ような単純なものを期待していた:あなたは最も引き手によってカスタマイズされるようになっているあなたのレポ内のファイルを持っている場合は、config.php.templateのような何かにファイル名を変更し、その後

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

git pull

+0

とgitのプルを試すことができますconfig.php' 'への変更がコミットされていますので、これを行いますか? –

+1

可能な複製[git mergeを実行するときに特定のコミットを除外することはできますか?](http://stackoverflow.com/questions/332528/is-it-possible-to-exclude-specific-commits-when-doing- a-git-merge) – Daenyth

+0

コミットされていません。 –

答えて

164

Git stashに基づいた簡単な解決策があります。あなたが変更したものすべてを隠し、新しいものをすべて引っ張って隠しを適用してください。

git stash 
git pull 
git stash pop 

衝突時に競合が発生する可能性があります。実際にはconfig.phpの競合が発生すると説明した場合しかし、あなたが隠し場に入れたものがあなたが望むものであることを知っているので、紛争を解決するのは簡単です。

git checkout --theirs -- config.php 
+3

そのgit checkout - theirsコマンドは非常に混乱しています。それは私が一度だけ望んでいたことをもう一度本当に悪いものでした。そこに良い文書がありますか? – Milimetric

+2

はい、時には「theirs」と「ours」が混乱することがあります。 'git merge'では、 'ours'は現在作業ディレクトリにあります。しかし、 'git rebase'(または' git rebase -onto')では、意味は入れ替えることができます。 – GoZoner

+0

@GoZoner私はこれも取ってくると思う。 'git stash'の後に別のブランチをチェックアウトしてから、' git fetch origin 'とするだけです。前のブランチをチェックアウトし、 'git stash pop'を実行します。私は試してみましたが、うまくいきましたが、マージ競合はありませんでした。 – AnkurTank

13

.gitignoreconfig.phpを追加してください。

+4

check [this answer](http://stackoverflow.com/a/3970442/236871)でも、 '.gitattributes'を使ってマージ中に常に変更を保持することができます。 – KurzedMetal

+0

それは私が必要としていたものにもっと似ています。テンプレートのものは洗練されたソリューションですが、私はデプロイスクリプトを書いているので、これを使うことはできません。 –

4

更新:これは文字通り質問された質問に答えますが、私はKurzedMetal's answerが本当に必要なものだと思います。

と仮定すると:master

  • origin

    1. あなたは枝master
    2. にしている上流のブランチはあなたが....何もコミットされていない変更

    を持っていませんできます:

    # 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へのコミットされていない変更がある場合、これはそれらを捨てることに注意してください。

  • 3

    我々はまた、リベース

    git pull --rebase origin dev 
    
    関連する問題