web-dev-qa-db-ja.com

`git reset --hardmaster`と` git reset --hard Origin / master`の違いは何ですか?

Stackoverflow/elsewhereで多くのリンクを試し、の動作を正しく理解しました

git reset --hard option

そんなこと知ってる:

  • 省略されている場合、またはOriginの場合、リセットはOriginの最新のコミットで実行されます。
  • SHA1ハッシュが提供されている場合、対応するコミットでリセットが実行されます。

私が理解していないのは、次の値です。

  1. Origin
  2. HEAD
  3. Origin/master
  4. Origin/branch

すべて同じ動作をしているようです。つまり、masterでの最新のコミットを示しています。

上記の4つの値のオプションすべての重要性を説明してください。

また、特定のブランチにいるかどうかを知りたいのですが、そのブランチの最後のコミットにリセットするにはどうすればよいですか?たとえば、私がv1.2を使用している場合でも、Origin/v1.2masterの最新のコミットに移動します。

9
vashishatashu

まず最初に、ブランチ名とタグ名は単一のコミットを表すハッシュ値への単なるポインタであることを理解する必要があります。同じ動作を持つ4つのオプションがあると言う場合、最初の論理的な答えは、それらがすべて同じコミット

  • Originこれについてはよくわかりませんが、Origin自体がOrigin/HEADに解決されると思います。これは、githubの設定に依存すると思います。githubでは 'を設定します。デフォルトのブランチ '、Origin/headOrigin/[default_branch]に解決されます。この場合、マスターであると想定しているため、Origin/masterと同じ効果があります。

  • HEADは常に現在のコミット、つまり現在のコミットを指しているため、git reset --hard HEADは追跡ファイルとステージングされたファイルの変更のすべての変更を完全に削除しますが、コミットハッシュは変更しません。

  • Origin/masterは、最後のフェッチ/プル以降、リモートマスターブランチで最後にコミットされます。masterにコミットするたびに、ローカルのmasterが更新され、Origin/masterは更新されました。他の誰かがmasterにプッシュした場合、git fetchを実行しない限り、リポジトリは更新があることを認識しません。Origin/mastermaster、または多分発散さえ。
    git reset --hard Origin/masterを実行すると、現在masterブランチにいて、masterOrigin/masterと同期している場合に同じ効果があります。

  • Origin/branchデフォルトではOrigin/branchがないため、これが何を表しているのかわかりません。そのため、branchという名前のブランチを作成し、たまたま同じコミットにあると思います。マスター、git branchを実行してすべてのブランチを確認できることを確認するには、branchという名前のブランチが見つかると思います。

これらすべてを視覚的に確認するには、git log --graph --decorate --allを実行するか、gitkのような視覚ツールを使用します。バイナリがインストールされている場合は、gitk --allを実行してすべてのブランチを表示します。互いに対して

13

masterHEADOrigin/something、そしておそらくいくつかのタグ、なぜそうではないのか、mayはすべて同じコミットですが、間違いなく同じものではありません。

Originは通常、 remoteリポジトリ の名前です。

git remote -vを使用して、リモコンを表示し、新しいリモコンを構成できます。

-vを使用して)試してみてください。おそらく意味があります。

remote/somebranchは、リモートリポジトリのブランチの先頭を指します。

Origin/masterは、masterOriginの先頭を指します。

masterと同じですか?

はいといいえ。マスターブランチをプルし、何らかの作業を行い、その間に他の誰かがmasterにコミットし、Originにプッシュすると、それらは異なります。

git fetch Originを実行すると、Origin/masterに追加のコミットがあります(aheadになります)。

HEADは単に「現在のコミット」です。 .と考えてください。

この質問 を参照してください

繰り返しますが、これcouldmasterと同じですが、別のブランチをチェックアウトするか、コミットするか、リベースの最中の場合、まあ、そうではありません。

したがって、他の誰も作業していない新しいリポジトリでこれを試してください。

$ git checkout master
$ git log -1 --format="%H" HEAD
123abc
$ git log -1 --format="%H" Origin/master
123abc

それらは同じです!

$ git diff Origin/master

もちろん、内容は同じです。

$ echo "foo" > foo
$ git add foo
$ git commit -m "Foo the thingy"
$ git log -1 --format="%H" HEAD
321bca
$ git log -1 --format="%H" Origin/master
123abc

ああ、見て、今は別のコミットです!

$ git Push Origin master
$ git log -1 --format="%H" HEAD
321bca
$ git log -1 --format="%H" Origin/master
321bca

そして今、彼らはそうではありません!最新のコミットをプッシュしましたが、どちらも同じことを示しています。

$ git checkout -b newbranch
$ echo "baz" > baz
$ git add baz
$ git commit -m "Baz the thingy with the stuff"
$ git branch -a
  master
* new_branch
  Origin/master
$ git log -1 --format="%H"
789def
$ git log -1 --format="%H" master
321bca
git log -1 --format="%H" Origin/master
321bca
git log -1 --format="%H" Origin/new_branch
unknown revision or path not in the working tree.

もちろん違います。 new_branchOriginにプッシュしていません。これは、ローカルマシン上にのみあります。

git checkout 123abc

masterの古いヘッドである123abcをチェックアウトしました。現在、どの支店の責任者でもありませんが、同じように確認できます。

Note: checking out 123abc. You are in 'detached HEAD' state, etc
$ git checkout -b old_master
$ git branch -a
  master
* new_branch
  Origin/master
  old_master

では、SHA1がそれぞれどうなるかを推測しますか?

4
Tobia Tesan