「git pull」でローカルファイルを強制的に上書きするにはどうすればよいですか?


7188

ローカルファイルを強制的に上書きするにはどうすればよいgit pullですか?

シナリオは次のとおりです。

  • チームメンバーが、作業中のWebサイトのテンプレートを変更しています
  • 彼らは画像ディレクトリにいくつかの画像を追加しています(ただし、ソース管理下でそれらを追加するのを忘れています)
  • 彼らは後で私にメールで画像を送っています
  • 画像をソース管理下に追加し、他の変更と一緒にGitHubにプッシュしています
  • Gitはファイルを上書きしたくないため、GitHubから更新をプルできません。

これは私が得ているエラーです:

エラー:追跡されていない作業ツリーファイル 'public / images / icon.gif'はマージによって上書きされます

Gitに強制的に上書きさせるにはどうすればよいですか?その人はデザイナーです-通常、私はすべての競合を手作業で解決するので、サーバーには最新のバージョンがあり、コンピューターで更新する必要があります。


17
これを読んでファイルを失う可能性があると思う人、私はこの立場にいて、Sublime Textのバッファーが私を救ったことに気づきました-何かに取り組んでいる場合、これと同様の問題を解決しようとするか、この質問に対する回答であり、ファイルがSublimeで開かれている(可能性が高い)場合、ファイルはSublimeがそこにあるか、元に戻す履歴にあります
Toni Leigh

62
git reset --hard origin/branch_to_overwrite
Andrew Atkinson

1
基本的に、最初のチェックアウト-bの後で開発からプルするだけです。あなたの仕事をし、その後に押し戻す。
ldgorman

1
短い答え:ブランチを削除して再作成します。1.ブランチを削除する:git branch <branch> -D2.競合する前にコミットにリセットする:git reset <commit> --hard3.ブランチを再作成する:git branch <branch>4.サーバーにトラッキングを設定する:git --set-upstream-to=origin/<branch> <branch> 5. Pull: git pull`
Nino Filiu

1
すべてのCRLFエンディングをLFエンディングに変更するには、(クリーン開始)git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .
Chloe

回答:


10040

重要:ローカルの変更がある場合、それらは失われます。--hardオプションの有無にかかわらず、プッシュされていないローカルコミットは失われます。[*]

Gitによって追跡されないファイル(アップロードされたユーザーコンテンツなど)がある場合、これらのファイルは影響を受けません。


私はこれが正しい方法だと思います:

git fetch --all

次に、2つのオプションがあります。

git reset --hard origin/master

または他のブランチにいる場合:

git reset --hard origin/<branch_name>

説明:

git fetch 何もマージまたはリベースしようとせずに、リモートから最新をダウンロードします。

次に、git resetはマスターブランチを、フェッチしたものにリセットします。この--hardオプションは、作業ツリー内のすべてのファイルを変更して、origin/master


現在のローカルコミットを維持する

[*]masterリセットする前からブランチを作成することにより、現在のローカルコミットを維持できることは注目に値します。

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master

この後、古いコミットはすべて保持されます new-branch-to-save-current-commitsます。

コミットされていない変更

ただし、コミットされていない変更は(ステージングされていても)失われます。必要なものはすべて隠しておいてコミットしてください。そのためには、以下を実行できます。

git stash

そして、これらのコミットされていない変更を再適用するには:

git stash pop

14
気を付けて!ローカルのプッシュされていないコミットがある場合、これはブランチからそれらを削除します!このソリューションは、追跡されていないファイルをリポジトリにそのまま保持しますが、他のすべてを上書きします。
Matthijs P

479
よくある質問ですので、ここのトップコメントを明確にしたいと思います。この回答で説明されているようにコマンドを実行しただけで、ローカルファイルはすべて削除されていません。リモートで追跡されたファイルのみが上書きされ、ここにあるすべてのローカルファイルは変更されません。
赤、

14
ケースには、あなたは、「マスター」とは異なる、リモートブランチ名を持っているレポから使用引っ張っているgit reset --hard origin/branch-name
Nerrve

97
この質問と回答に対する賛成票の量を考えると、gitは次のようなコマンドを組み込む必要があると思いますgit pull -f
Sophivorus

7
ハードリセットの前にプッシュされなかったgit reflogコミットは、すべてのコミットを一覧表示するを使用して回復できます。を使用してローカルコピーをクリーンアップするまでgit gc、すべてが失われます
Koen。

934

これを試して:

git reset --hard HEAD
git pull

それはあなたが望むことをするはずです。


16
私はこれを実行し、リポジトリに存在しなくなったいくつかのローカルファイルがディスクに残されました。
Piotr Owsiak

26
これは正しいとは思いません。上記は、質問で要求された上書きではなく、マージを実行します:「gitに強制的に上書きさせる方法」答えがありません。現在探しています。「git checkout BranchWithCodeToKeep」を保持したいコードを使用してブランチに切り替えた瞬間に、「git branch -D BranchToOverwrite」を実行し、最後に「git checkout -b BranchToOverwrite」。これで、ブランチを実行せずに、ブランチBranchToOverwriteにBranchWithCodeToKeepからの正確なコードを取得できます。
Felbus '13

252
'git pull'を使用してマージする代わりに、git fetch --allに続いて 'git reset --hard origin / master'を試してください
Lloyd Moore

5
うん、@ lloydmooreソリューションは私のために働いた。単なるコメントではなく、回答である可能性があります。
マックスウィリアムズ

2
これにより、現在の変更が最後にプルされたブランチコミットにリセットされます。次に、git pullは最新のブランチからの変更をマージします。これはまさに私がそれをしたかったことをした。ありがとう!
Codeversed

459

警告:git cleanすべての追跡されていないファイル/ディレクトリを削除し、元に戻すことはできません。


時にはclean -f役に立たないこともあります。追跡されていないディレクトリがある場合は、-dオプションも必要です。

# WARNING: this can't be undone!

git reset --hard HEAD
git clean -f -d
git pull

警告:git cleanすべての追跡されていないファイル/ディレクトリを削除し、元に戻すことはできません。

最初に-n--dry-run)フラグを使用することを検討してください。これにより、実際には何も削除せずに何が削除されるかが示されます。

git clean -n -f -d

出力例:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...

33
すごい...私のdotfilesリポジトリに対してこれを実行しました...私のホームディレクトリで。本当に重要なことは何もなかったのは良かった…
ラウリ

7
シナリオの説明では、彼がコンテンツを本当に捨てたくないことは明らかだと思います。むしろ彼が望んでいるのは、ファイルを上書きするときにgitのばらけを止めることです。@Lauri、これはあなたには起こらないはずだった。残念ながら、人々はシナリオの説明の本質を誤解しているようです-私の提案を参照してください。
ハリネズミ

19
最後に。git clean -f -dは、make cleanがすべてのクリーニングに失敗した場合に便利です。
earthmeLon

7
@crizCraig(追加されていない限り).gitignore
出血指

5
@earthmeLon、あなたが望むかもしれないのでgit clean -dfx-x無視は.gitignore。通常、ビルド製品は.gitignoreにあります。
Paul Draper

384

ハリネズミのように私は答えがひどいと思います。しかし、ハリネズミの答えはより良いかもしれませんが、私はそれがそうであるかもしれないほどエレガントではないと思います。これを行うことがわかった方法は、定義された戦略で「フェッチ」と「マージ」を使用することです。強制的に上書きしようとしているファイルの1つでない限り、ローカルの変更が保持されるようにするためです。

まず変更をコミットします

 git add *
 git commit -a -m "local file server commit message"

次に、変更をフェッチし、競合がある場合は上書きします

 git fetch origin master
 git merge -s recursive -X theirs origin/master

「-X」はオプション名、「theirs」はそのオプションの値です。競合がある場合、「自分」の変更ではなく「自分」の変更を使用することを選択します。


56
これは私が今まで見た中で最良の答えです。私は試していませんが、他の回答とは異なり、これは追跡されていないすべてのファイルを核にしようとはしません。これは明らかな理由で非常に危険です。
Huyz

5
Ditto-これは、非常に大規模なマージ(GitHubプルリクエスト)を実行するときに機能しました。いい答えです!私の場合、最後の2つのコマンドは次のとおりget fetch other-repoです。2)git merge -s recursive -X theirs other-repo/master
quux00

2
これにより、ローカルファイルではなくリポジトリファイルとの競合が上書きされます。よろしいですか?
Nathan F. 14

2
ベストアンサー。受け入れられた最高の答えは、私の場合、頭をはずしたままにしました。私は地元のマスターブランチに切り替えて走りましたgit merge -X theirs origin/master
petergus 2016年

2
この(優れた)回答の問題は、すべてのローカルファイルが追加されることです。省略された特定のファイルを追加したいだけかもしれません。しかし、それについての最も良いことは、彼がすべきであったことを彼にさせます-それらをローカルに追加します それらは同じイメージなので、おそらく-X theirs戦略は必要ありません。実際、私は最初にそれを残しておくことをお勧めします。異常があるかどうかを確認し、異常がある場合は追加します。「それら」が常に正しい選択であることを確認した後、追加します。しかし、その後、私は偏執的です。
ボブ・カーンズ

279

代わりに:

git fetch --all
git reset --hard origin/master

次のことを行うことをお勧めします。

git fetch origin master
git reset --hard origin/master

オリジン/マスターブランチにリセットする場合、すべてのリモートとブランチをフェッチする必要はありませんか?


3
あなたの答えは、あなたが担当者に必要なものです。私は尋ねなければなりません、これはすべての追跡されていないファイルも削除しますか?
Nicolas De Jay

5
ええ、私の担当者のほとんどはここから来ています:)これにより、追跡されていないファイルもすべて削除されます。私が忘れていて、たった2日前に痛々しく思い出した何か...
ヨハネケ2014年

1
この他の回答のコメントを参照してください:stackoverflow.com/a/8888015/2151700
Johanneke

これは私の追跡されていないファイルを削除しませんでした。これは実際に私が期待することです。他の人ではなく、一部の人にとっては理由があるのでしょうか?
arichards

追跡されていないファイルはgit resetの影響を受けません。それらも削除する場合は、git add .最初に、以前に実行してくださいgit reset --hard
Johanneke

131

それは最初に行うことが最善の方法のようです:

git clean

追跡されていないファイルをすべて削除して、通常の手順を続行するにはgit pull...


4
「git clean」を使用して同じ問題を解決しようとしましたが、解決されませんでした。gitステータスは「ブランチと 'origin / master'は分岐しており、それぞれ#と2と9の異なるコミットを持っています。」そしてgit pullはあなたが上記のものに似ていることを言っています。
slacy 2009

43
git cleanはかなり率直な道具であり、あなたが保持したいかもしれない多くのものを捨ててしまう可能性があります。プルが成功するまで、gitが不平を言っているファイルを削除するか名前を変更することをお勧めします。
Neil Mayhew 2010

2
これは一般的には機能しないと思います。強制的なgit pullを介して基本的にgit cloneリモートを実行する方法はありませんか?
mathtick、2010年

10
@mathick:git fetch origin && git reset --hard origin/master
Arrowmaster

3
あるgit clean最高の答えはここに?ファイルを削除することは、必ずしもOPが望んでいることではないようです。彼らは削除ではなく「ローカルファイルの上書き」を求めました。
JohnAllen 14年

111

警告:これを行うと、gitignoreファイルにdirectory / *エントリがある場合、ファイルが完全に削除されます。

いくつかの答えはひどいようです。@Lauriに何が起こったかという意味で、David Avsajanishviliの提案に従ってひどい。

むしろ(git> v1.7.6):

git stash --include-untracked
git pull

後で、隠し場所の履歴を消去できます。

手動で、1つずつ:

$ git stash list
stash@{0}: WIP on <branch>: ...
stash@{1}: WIP on <branch>: ...

$ git stash drop stash@{0}
$ git stash drop stash@{1}

残酷に、一度に:

$ git stash clear

もちろん、隠しておいたものに戻りたい場合:

$ git stash list
...
$ git stash apply stash@{5}

2
いいえ、そうは思いません。stashingは、コミットされていないファイルを邪魔にならないように移動するだけです。上記はgitが追跡しないファイルも移動(隠蔽)します。これにより、リモートに追加され、まだマシンにプルダウンされていないが、作成した(!)ファイルはプルダウンされません。コミットされていない作業を破壊することなくすべて。それが理にかなっていると思いますか?
ハリネズミ

3
1.7.6がない場合は、リポジトリ全体を--include-untracked一時的に- git addすぐに隠して、真似ることができます。
nategood

3
ハリネズミに同意します。ここで人気のある回答を行うと、実際に失いたくない多くのアイテムを誤って削除してしまう可能性が高くなります。
Guardius 2013年

1
私は他の追跡されていないファイルを持っていました-マージ/プルが上書きしたかったファイル以外に、このソリューションが最もうまくいきました。git stash applyマージによって既に作成されたものを除いて、私のトラックされていないファイルをすべて戻しました。「すでに存在し、チェックアウトはありません。」完璧に働きました。
BigBlueHat

2
これは最も明確な答えであり、受け入れられるべきものです。入力を節約するには、次の短い形式を使用できますgit stash -u
ccpizza

93

このコマンドは、ローカルの変更を破棄するのに役立ちます。

git checkout <your-branch> -f

そして、クリーンアップを行います(作業ツリーから追跡されていないファイルを削除します):

git clean -f

追跡されていないファイルに加えて追跡されていないディレクトリを削除する場合:

git clean -fd

シナリオの説明では、彼がコンテンツを本当に捨てたくないことは明らかだと思います。むしろ彼が望んでいるのは、ファイルの上書き時にgitのばらつくのをやめることです。私の提案を参照してください。
ハリネズミ

3
その答えは説明と正確に一致しないかもしれませんが、それでもキャリッジリターン(autocrlf falseのイベント)をgitいじるの苛立ちから私を救いました。git reset --hard HEADで変更されたファイルが「いいえ」のままにならない場合、これらの「-f」フラグは非常に役立ちます。本当にありがとう。
Kellindil 2013年

88

とマージする代わりにgit pull、これを試してください:

git fetch --all

に続く:

git reset --hard origin/master


61

私のために働いた唯一のものは:

git reset --hard HEAD~5

これは5つのコミットを取り戻し、次に

git pull

Gitのマージを元に戻す方法を調べたところ、そのことがわかりました。


これは...原点レポに自分のブランチをプッシュして、私のリモートレポにそれを引っ張るしようとすると、マージの競合を取得保管私が力を持っていたとして、最終的には私のために働いた
jwfrench

こんにちは、これは実際にはトリックですがwork around、本当に効果的です。いくつかの競合はいくつかのコミットでのみ発生する可能性があるため、5つのコミットを元に戻すと、リモートコードとの競合が確実になくなります。
Hoang Le

54

これらすべてのソリューションの問題は、それらがすべて非常に複雑であるか、さらに大きな問題であるすべての追跡されていないファイルがWebサーバーから削除されることです。 Gitリポジトリではなくサーバー。

以下は、私たちが使用している最もクリーンなソリューションです。

# Fetch the newest code
git fetch

# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    rm -f -- "$file"
done

# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
    git checkout -- "$file"
done

# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
  • 最初のコマンドは最新のデータをフェッチします。

  • 2番目のコマンドは、リポジトリに追加されているファイルがあるかどうかを確認し、競合を引き起こす追跡されていないファイルをローカルリポジトリから削除します。

  • 3番目のコマンドは、ローカルで変更されたすべてのファイルをチェックアウトします。

  • 最後に、プルを実行して最新バージョンに更新しますが、今回は競合が発生しません。リポジトリにある追跡されていないファイルはもう存在せず、ローカルで変更されたすべてのファイルはすでにリポジトリ内にあるためです。


「git pull」の代わりに「git pull origin」の代わりに「git merge origin / master」を最後の行として使用すると、すでにgitリポジトリから変更をプルダウンしているので、高速になります。
Josh

1
もちろん、git merge origin/masterより速く、おそらくさらに安全になります。このスクリプトのファイルの削除中に誰かが新しい変更をプッシュした場合(これは起こりそうにありませんが、可能です)、全体のプルが失敗する可能性があるためです。私pullがそこに入れた唯一の理由は、誰かがマスターブランチで作業していない可能性があるためですが、他のブランチがあり、スクリプトを普遍的にしたかったのです。
Strahinja Kustudic 2013

オプションファイルなどのローカルで作成したファイルがある場合は、それらをに配置します.gitignore
Sebi 2017年

52

まず、標準的な方法を試してください:

git reset HEAD --hard # To remove all not committed changes!
git clean -fd         # To remove all untracked (non-git) files and folders!

警告:上記のコマンドは、コミットされていない場合にのみ、データ/ファイルが失われる可能性があります!不明な場合は、最初にリポジトリフォルダ全体のバックアップを作成してください。

次にもう一度引っ張ります。

上記の方法が役に立たず、追跡されていないファイル/ディレクトリを気にしない場合(念のために最初にバックアップを作成してください)、次の簡単な手順を試してください。

cd your_git_repo  # where 'your_git_repo' is your git repository folder
rm -rfv *         # WARNING: only run inside your git repository!
git pull          # pull the sources again

これにより、すべてのgitファイル(.git/すべてのコミットがある場合は除外ディレクトリ)が削除され、再度プルされます。


なぜgit reset HEAD --hard失敗するのですか?

  1. のカスタムルール .gitattributes file

    持っている eol=lf .gitattributes内のルールは、Gitは、いくつかのテキストファイルにLFにCRLFの行末を変換することによって、いくつかのファイルの変更を変更する可能性があります。

    その場合は、これらのCRLF / LFの変更を(で確認してgit status)コミットするかgit config core.autcrlf false、一時的に無視してみてください。

  2. ファイルシステムの非互換性

    権限属性をサポートしていないファイルシステムを使用している場合。たとえば、Linux / Mac(ext3/ hfs+)とFAT32 / NTFSベースのファイルシステムに2つのリポジトリがあるとします。

    あなたが気付いたよう基本的にUNIXのパーミッションをサポートしていない1は、権限のようなものをシステム上のリセットファイルのパーミッションをサポートしていないことができないので、ので、どんなにファイルシステムの二つの異なる種類があり--hard、あなたがしようと、gitの常にいくつかの「変更」を検出します。


47

私も同じ問題を抱えていました。誰も私にこの解決策を与えなかったが、それは私のために働いた。

私はそれを解決しました:

  1. すべてのファイルを削除します。.gitディレクトリだけを残します。
  2. git reset --hard HEAD
  3. git pull
  4. git push

今では動作します。


1
こっちも一緒。非常に難しいソリューションのみが機能する場合がありますが、リセットとクリーンアップだけでは十分でない場合があります...
jdehaan

41

ボーナス:

前の回答のプル/フェッチ/マージについて、興味深い、生産的なトリックを共有したいと思います。

git pull --rebase

この上記のコマンドは、多くの時間を節約した私のGitライフで最も便利なコマンドです。

新たにコミットをサーバーにプッシュする前に、このコマンドを実行すると、最新のサーバー変更が(フェッチ+マージで)自動的に同期され、コミットがGitログの一番上に配置されます。手動のプル/マージについて心配する必要はありません。

詳細は「git pull --rebase」は何をするのですか?


3
要するに:git pull -r
kenorb

29

同様の問題がありました。私はこれをしなければなりませんでした:

git reset --hard HEAD
git clean -f
git pull

6
git clean注意して使用
nategood

29

その他の回答をまとめました。git pullエラーなしで実行できます:

git fetch --all
git reset --hard origin/master
git reset --hard HEAD
git clean -f -d
git pull

警告:このスクリプトは非常に強力であるため、変更が失われる可能性があります。


2
これにより、変更されたファイル(以前にチェックインされたファイル)が上書きされ、追跡されていないファイル(チェックインされたことがないファイル)が削除されます。まさに私が探していたもの、ありがとう!
スタイル2016

3
3行目git reset --hard HEADは冗長かもしれません。私のローカルマニュアルページ(2.6.3)resetの2行目では、git reset --hard origin/master 「デフォルトではすべての形式でHEADになっている」と述べています。
arichards

2
@arichards私はあなたの容疑者が正しいと思いますが、2行目が(なんらかの理由で)機能しない場合、3行目はリセットしてもうまく機能します。このソリューションを最適化する必要はありません。私は他の答えを要約しました。それで全部です。コメントありがとうございます。:)
ロバート・ムーン

28

私自身の同様の経験に基づいて、上記のStrahinja Kustudicが提供するソリューションは、群を抜いて最高です。他の人が指摘したように、ハードリセットを実行するだけですべてが削除されます、構成ファイルなど、削除したくない多くのものが含まれている可能性があるの追跡されていないファイルされます。安全なのは、追加されるファイルのみを削除することです。さらに言えば、更新されるローカルで変更されたファイルをチェックアウトすることもできます。

それを念頭に置いて、私はKustudicのスクリプトを更新して、まさにそれを実行しました。タイプミスも修正しました(元の 'がありません)。

#/bin/sh

# Fetch the newest code
git fetch

# Delete all files which are being added,
# so there are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    echo "Deleting untracked file $file..."
    rm -vf "$file"
done

# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
    echo "Checking out modified file $file..."
    git checkout $file
done

# Finally merge all the changes (you could use merge here as well)
git pull

「git pull」の代わりに「git pull origin」の代わりに「git merge origin / master」を最後の行として使用すると、すでにgitリポジトリから変更をプルダウンしているので、より高速になります。
Josh

変更されたファイルのチェックアウトが必要なため、これは100%動作します。ずっと前にスクリプトを更新しましたが、ここでも更新するのを忘れていました。私もあなたとは少し違う使い方をしています。私はMだけでなく、あらゆる種類の変更が加えられたファイルをチェックアウトするので、いつでも機能します。
Strahinja Kustudic 2013

24

競合には2つの考えられる原因があり、個別に解決する必要があります。また、上記の回答のいずれも両方に対応していないことがわかる限り:

  • 追跡されていないローカルファイルは、手動で(より安全に)、または他の回答で提案されているように、削除する必要があります。 git clean -f -d

  • リモートブランチにないローカルコミットも削除する必要があります。IMOこれを実現する最も簡単な方法は次のとおりですgit reset --hard origin/master( 'master'を作業中のブランチに置き換え、git fetch origin最初に実行します)。


22

より簡単な方法は次のとおりです。

git checkout --theirs /path/to/file.extension
git pull origin master

これはローカルファイルをgit上のファイルで上書きします


21

ここでのほとんどの答えはに焦点を当てているようです masterブランチにです。ただし、2つの異なる場所で同じ機能ブランチに取り組んでおり、一方のリベースが他方に反映されるようにして、多くのフープを飛び越えないようにする場合があります。

同様の質問に対するRNAの回答torekの回答組み合わせに基づいて、私はこれがうまく機能することを思いつきました:

git fetch
git reset --hard @{u}

これをブランチから実行すると、ローカルブランチのみがアップストリームバージョンにリセットされます。

これは、gitエイリアス(git forcepull)にもうまく挿入できます。

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

または、.gitconfigファイルで:

[alias]
  forcepull = "!git fetch ; git reset --hard @{u}"

楽しい!


この答えは、どのブランチにいても機能するので、すばらしいです。
リーフミール2018

19

私は同じ問題を抱えており、何らかの理由で、それをgit clean -f -d行うことはできませんでした。理由は次のとおりです:何らかの理由で、ファイルが(.gitignoreエントリを介して)Gitによって無視された場合でも、後でこれをプルすることでこれを上書きすることは問題になりますが、を追加しない限り、クリーンアップによって削除されません-x


19

私ははるかに簡単で痛みの少ない方法を知っています:

$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp

それでおしまい!


18

私はこれを自分で解決しました:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

最後のコマンドは、ローカルの変更内容のリストを示します。それが受け入れられるまで「tmp」ブランチを変更し続け、次にマスターにマージして戻します:

git checkout master && git merge tmp

stashは最初の数回の試行で問題を引き起こす可能性が高いので、次回は「git stashブランチ」を検索することでこれをよりクリーンな方法で処理できるので、重要でないプロジェクトで最初に実験を行ってください...


17

どちらgit cleangit reset動作しない、または奇妙な状況です。git index追跡されていないすべてのファイルで次のスクリプトを使用して、競合するファイルを削除する必要があります。

git rm [file]

その後、私はうまく引っ張ることができます。



14

元の質問にもかかわらず、上位の回答は、同様の問題を抱えているがローカルファイルを失いたくない人に問題を引き起こす可能性があります。たとえば、Al-PunkおよびcrizCraigのコメントを参照してください。

次のバージョンは、ローカルの変更を一時的なブランチ(tmp)にコミットし、元のブランチ(と仮定しています)をチェックアウトしてmaster、更新をマージします。あなたはこれを使ってこれを行うことができますstashが、私は通常ブランチ/マージアプローチを使用するほうが簡単であることがわかりました。

git checkout -b tmp
git add *; git commit -am "my temporary files"
git checkout master

git fetch origin master
git merge -s recursive -X theirs origin master

ここで、他のリポジトリはと想定していますorigin master


13

これらの4つのコマンドは私にとってはうまくいきます。

git reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master

これらのコマンドの実行後にチェック/プルするには

git pull origin master

私はたくさん試しましたが、最終的にこれらのコマンドで成功しました。


2
「git branch -D master」はブランチを削除します。だから注意してください。新しい名前で新しいブランチを作成する「git checkout origin / master -b <新しいブランチ名>」を使用したいのですが、3,4行必要です。「git clean -f」も使用することをお勧めします。
チャンドプリヤンカラ2014

13

するだけ

git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname

したがって、保持したいファイルやディレクトリを削除するなど、不要な副作用をすべて回避できます。


12

インデックスとヘッドをorigin/masterにリセットしますが、作業ツリーはリセットしません。

git reset origin/master

私は個人的にこれが最も便利だと思いました。その後、作業ツリーが保持されるため、再度チェックインできます。私の問題では、追加されたのと同じファイルが削除されたため、スタックしました。奇妙なことです。
Jason Sebring

12

要件:

  1. ローカルの変更を追跡して、ここで誰もそれらを失うことがないようにします。
  2. ローカルリポジトリをリモートオリジンリポジトリと一致させます。

解決:

  1. ローカルの変更を隠しておきます。
  2. フェッチクリーンファイルディレクトリを無視し.gitignoreハードリセット起源を

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