Stackoverflow/elsewhereで多くのリンクを試し、の動作を正しく理解しました
git reset --hard option
そんなこと知ってる:
Origin
の場合、リセットはOrigin
の最新のコミットで実行されます。私が理解していないのは、次の値です。
Origin
HEAD
Origin/master
Origin/branch
すべて同じ動作をしているようです。つまり、master
での最新のコミットを示しています。
上記の4つの値のオプションすべての重要性を説明してください。
また、特定のブランチにいるかどうかを知りたいのですが、そのブランチの最後のコミットにリセットするにはどうすればよいですか?たとえば、私がv1.2
を使用している場合でも、Origin/v1.2
はmaster
の最新のコミットに移動します。
まず最初に、ブランチ名とタグ名は単一のコミットを表すハッシュ値への単なるポインタであることを理解する必要があります。同じ動作を持つ4つのオプションがあると言う場合、最初の論理的な答えは、それらがすべて同じコミット
Origin
これについてはよくわかりませんが、Origin
自体がOrigin/HEAD
に解決されると思います。これは、githubの設定に依存すると思います。githubでは 'を設定します。デフォルトのブランチ '、Origin/head
はOrigin/[default_branch]
に解決されます。この場合、マスターであると想定しているため、Origin/master
と同じ効果があります。
HEAD
は常に現在のコミット、つまり現在のコミットを指しているため、git reset --hard HEAD
は追跡ファイルとステージングされたファイルの変更のすべての変更を完全に削除しますが、コミットハッシュは変更しません。
Origin/master
は、最後のフェッチ/プル以降、リモートマスターブランチで最後にコミットされます。master
にコミットするたびに、ローカルのmaster
が更新され、Origin/master
は更新されました。他の誰かがmaster
にプッシュした場合、git fetch
を実行しない限り、リポジトリは更新があることを認識しません。Origin/master
はmaster
、または多分発散さえ。git reset --hard Origin/master
を実行すると、現在master
ブランチにいて、master
がOrigin/master
と同期している場合に同じ効果があります。
Origin/branch
デフォルトではOrigin/branch
がないため、これが何を表しているのかわかりません。そのため、branch
という名前のブランチを作成し、たまたま同じコミットにあると思います。マスター、git branch
を実行してすべてのブランチを確認できることを確認するには、branch
という名前のブランチが見つかると思います。
これらすべてを視覚的に確認するには、git log --graph --decorate --all
を実行するか、gitk
のような視覚ツールを使用します。バイナリがインストールされている場合は、gitk --all
を実行してすべてのブランチを表示します。互いに対して
master
、HEAD
、Origin/something
、そしておそらくいくつかのタグ、なぜそうではないのか、mayはすべて同じコミットですが、間違いなく同じものではありません。
Origin
は通常、 remoteリポジトリ の名前です。
git remote -v
を使用して、リモコンを表示し、新しいリモコンを構成できます。
(-v
を使用して)試してみてください。おそらく意味があります。
remote/somebranch
は、リモートリポジトリのブランチの先頭を指します。
Origin/master
は、master
のOrigin
の先頭を指します。
master
と同じですか?
はいといいえ。マスターブランチをプルし、何らかの作業を行い、その間に他の誰かがmaster
にコミットし、Origin
にプッシュすると、それらは異なります。
git fetch Origin
を実行すると、Origin/master
に追加のコミットがあります(aheadになります)。
HEAD
は単に「現在のコミット」です。 .
と考えてください。
この質問 を参照してください
繰り返しますが、これcouldはmaster
と同じですが、別のブランチをチェックアウトするか、コミットするか、リベースの最中の場合、まあ、そうではありません。
したがって、他の誰も作業していない新しいリポジトリでこれを試してください。
$ 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_branch
をOrigin
にプッシュしていません。これは、ローカルマシン上にのみあります。
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がそれぞれどうなるかを推測しますか?