取り消し - git push 強制 上書き




"git pull"を強制的にローカルファイルを上書きするには? (20)

重要:ローカルで変更があった場合、それらは失われます。 --hardオプションの有無に--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

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

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

  • チームメンバーが、現在作業中のウェブサイトのテンプレートを変更しています
  • 彼らはimagesディレクトリにいくつかのイメージを追加しています(ただし、ソースコントロールの下にそれらを追加することは忘れています)
  • 彼らは私に後でメールで画像を送っています
  • 私は、ソースコントロールの下に画像を追加し、GitHubに他の変更と一緒に押し込んでいます
  • Gitはファイルを上書きしたくないので、GitHubから更新を引き出すことはできません。

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

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

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


ボーナス:

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

git pull --rebase

このコマンドは、私のGitの中で最も有用なコマンドであり、多くの時間を節約できます。

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

"git pull --rebase"とは何ですか?


git pullとマージするのではなく、次のようにしてください:

git fetch --all

に続く:

git reset --hard origin/masterです。


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

ときどきclean -f助けにならないことがあります。 あなたがDIRECTORIESを追跡していない場合、-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
...

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

git checkout <your-branch> -f

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

git clean -f

拡張されていないファイルに加えて、追跡されていないディレクトリを削除する場合は、次のようにします。

git clean -fd

これらすべての解決策の問題は、それらがすべて複雑すぎるか、さらに大きな問題であるということです。ウェブサーバーからすべての未追跡ファイルを削除するということです。 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 reset --hard HEAD
git pull

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


ちょうどやる

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

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


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

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

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


インデックスとヘッドをorigin/masterにリセットしますが、作業ツリーをリセットしないでください:

git reset origin/master

代わりに:

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

私は次のことをお勧めします:

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

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


元の質問にもかかわらず、トップの回答は、同様の問題を抱えている人には問題を引き起こす可能性がありますが、ローカルファイルを失うことは望ましくありません。 たとえば、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であると仮定します


私のために働いたのは、

git reset --hard HEAD~5

これは5つのコミットを返します。

git pull

私は、Gitのマージを取り消す方法を調べることでそれを発見しました。


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

git rm [file]

それから私は上手く引っ張ることができます。


私はすべての答えを読んだが、私はこれを行うための単一のコマンドを探していた。 ここに私がしたことがあります。 .gitconfigにgitエイリアスを追加しました。

[alias]
      fp = "!f(){ git fetch ${1} ${2} && git reset --hard ${1}/${2};};f"

コマンドを次のように実行します。

git fp origin master

に相当

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

私はちょうどこれを自分で解決しました:

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"ブランチを変更したままにしておき、次のようにしてmasterにマージし直してください:

git checkout master && git merge tmp

次の時間は、stashが最初のいくつかの試行で問題を引き起こす可能性が高いにもかかわらず、 "git stash branch"を参照することで、これをよりきれいな方法で処理することができます。


私は他の答えを要約した。 エラーなしでgit pullを実行できます:

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

警告 :このスクリプトは非常に強力なので、変更を失う可能性があります。


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


私も同様の問題がありました。 私はこれをしなければならなかった:

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

私自身の同様の経験に基づいて、上記の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-fetch