web-dev-qa-db-ja.com

git pullとgit reset --hard Origin / <branch>の違いは何ですか?

後者は前者よりも速いことがわかったので、通常はgit fetchローカルブランチをリモートと同期する必要があるときはいつでも。違いがあるとすれば何ですか?

20
technophyle

以下のコマンド:

git fetch
git reset --hard Origin/<branch>

ローカルの変更をすべて破棄します。

どこに:

git pull

これは次とまったく同じです。

git fetch
git merge Origin/<branch>

ローカルの変更を保存しようとします。

32
Penguin Brian
$ git pull                        
# takes the latest changes of Origin/branch (exists both local & remote changes)

$ git reset --hard Origin/branch  
# replace your local with Origin's branch history (discard local changes)

例:たとえば、ローカルABに2つのコミットがあり、リモートに2つのコミットACがあります。ここでプルすると、ローカルにはABCが含まれますresetとは異なり、ローカルにはACBではありません。

3
Sajib Khan

ソースアップデートを取得する方法は、パフォーマンスの問題よりも重要です。特定のケースではそれらを利用する必要があります。 2つの例を挙げましょう。

  • git reset --hard ...は、デバッグのためにプロダクションコードを変更することが多い場合に、プロダクションでコードを更新するために使用できます。これは通常、プロジェクト展開の初期段階で怠惰な考えで起こります。
  • git pullは、新しいコミットを取得する最も受け入れられている方法であり、通常、ローカルで大きな変更を加えないことは理にかなっています。同じブランチに多くの人がいるためにコミット期間が長くなると、最終的にはやる気が出るかもしれませんgit pull --rebaseまたは最初にフェッチしてから比較します。

Gitは、開発スタイルの非常に具体的なニーズに対して明示的である場合があり、それらを外出先で発見できます。作業が安全であることを確認したら、パフォーマンスはまったく問題になりません。

0
yasc

これらの2つのコマンドは、主にさまざまな状況で使用されます。

git pullリモートからローカルに変更をプル(フェッチおよびマージ)します。特に、他のプッシュコミットをリモートにコミットし、これらのコミットをローカルブランチに適用します。

git reset --hard Origin/branchは、Origin/branchが指しているコミットをローカルブランチが指すようにするための強制です。通常は、ローカルで行った変更を破棄し、ローカルブランチをリモートステータスのままにしておきたい状況です。

0
Marina Liu

彼らは何をするかで完全に異なります:

git pull:リモートリポジトリからの変更を現在のブランチに組み込みます。デフォルトモードでは、git pullはgit fetchの後にgit merge FETCH_HEADが続く形式です。

git reset --hard Origin/branchを使用すると、Gitは次のことを行います。

  • 現在のブランチ(通常はマスター)を<SOME-COMMIT>を指すように戻します。
  • 次に、作業ツリーとインデックス(「ステージング領域」)内のファイルを、<SOME-COMMIT>でコミットされたバージョンと同じにします。

git reset --hardは、コミットされていない変更をすべて破棄するため、危険なコマンドである可能性があることに常に注意する必要があります。安全のため、使用する前にgit statusの出力がクリーン(つまり、空)であることを常に確認する必要があります。

0
VaTo