web-dev-qa-db-ja.com

ブランチをチェックアウトしてローカルの変更を上書きするGitコマンド

次のことを安全かつ確実に行うGitコマンド(またはコマンドの短いシーケンス)はありますか?

  • ローカルの変更を取り除きます。
  • 必要に応じて、指定されたブランチをOriginから取得します
  • 指定されたブランチをチェックアウトしますか?

現在、私は行き詰まっています:

git fetch -p
git stash
git stash drop
git checkout $branch
git pull

しかし、パスワードを2回要求されるので(fetchpullによって)気になります。 パスワードが1回だけ必要な場合は、一般的にどのソリューションでも満足です。

いくつかのメモ:

  • これは、アプリケーション用の自作デプロイメントスクリプトの一部です(コードはGitHubでホストされます)。
  • ブランチがすでにOriginから取得されているかどうかに違いはありません(つまり、新しいブランチの最初の展開には、追加の手順は必要ありません)。
  • スクリプトは、複数のユーザーがアクセスできるリモートマシン上にあるため、資格情報は保存されず、ユーザー/パスワードを入力する必要があります(ただし、可能であれば1回のみ)。
  • ローカルの変更は気にしません。常に、指定されたブランチの元のコピーが必要です(展開スクリプトのそれ以降の部分はローカルの変更を生成します)。
  • 毎回新しいリポジトリを複製またはエクスポートすることはできません。時間がかかりすぎます。
46
szeryf

" ローカルファイルを上書きするために「git pull」を強制するにはどうすればよいですか? "のようなソリューションに従うことができます。

git fetch --all
git reset --hard Origin/abranch
git checkout $branch 

それには1回のフェッチしか含まれません。

65
VonC

いくつかのポイント:

  • git stash + git stash dropgit reset --hardに置き換えられると思います
  • ...または、さらに短く、-fcheckoutコマンドに追加します。

    git checkout -f -b $branch
    

    チェックアウトの前にgit reset --hardが使用されたかのように、ローカルの変更はすべて破棄されます。

主な質問については、最後の手順を実行する代わりに、リモートから適切なブランチをローカルブランチにマージすることができます:git merge $branch Origin/$branch、リモートにヒットしないと思います。その場合、クレデンシャルの必要がなくなるため、最大の懸念に対処できます。

28
Marcin Łoś

git resetおよびgit cleanは状況によってはやり過ぎになる可能性があります(そして時間の浪費になります)。

「次の追跡されていないファイルは上書きされます...」のようなメッセージがあり、競合する追跡されていないファイルをremote/Origin/upstreamで上書きする場合は、git checkout -f <branch>が最適なオプションです。

あなたが私のような場合、他のオプションは--hard resetその後、プロジェクトを再コンパイルします。

7
Aaron Hull