Gitタイムマシン

最近、私の同僚はgitに精通し始めています。 そして、彼らの質問の1つは、特定のリビジョンにロールバックする方法です。 インターネットでは一連のコマンドを見つけることができますが、それぞれのコマンドについて理解したいと思います。 理解せずにgitチームを甘やかすと、開発履歴が失われる可能性があります。

この記事では、キー--softおよび--hard使用したgit checkoutおよびgit resetコマンドについて説明します。

それでは、gitが提供するタイムマシンで短い教育プログラムを始めましょう。 まず、ストーリーを説明しましょう。



ここで、円はコミットを示します。 コミットが正しいほど、新しいものになります。 ハッシュが6e04e ..のコミットが最初のコミットです。 初心者が理解する必要がある基本概念の1つは、コミットへのポインター、または特定のコミットの特定の「ニックネーム」です。 それらの暗闇は暗いです、例えば: HEAD、master、FETCH_HEAD、ORIG_HEADなど。 これは、標準的なニックネームの粒をリストしました。 自分で作成することもできますが、さらに先に作成します。

masterHEADの 2つのポインターに注目しましょう。 masterは、 masterと呼ばれるブランチ内の最も古いコミットを指します(このブランチは、リポジトリが初期化されるときに作成されます)。 HEADはマスターポインターを指します(ファイルの現在の状態を読み取ります)。 リポジトリに最初のコミットが表示された後、 HEADマスターは同じコミットをポイントします。 そのため、別のブランチに切り替えるか、履歴をロールバックするか、一連のラッシュアクションを完了するまで継続します。 そのため、私たちはポインターでストーリーを説明します。



この場合のHEADポインターはmasterを指し、 masterはd79fbコミットを指します...バージョン管理下の未変更ファイルの現在の状態はHEADが指すコミットであることを理解することが重要です。 つまり、 HEADが6e04e ..のハッシュを持つコミットを指している場合、ファイルは元の状態になります。 HEADポインターを「移動」するには、コマンドgit checkoutがあります。 gitに少しでも慣れている人は、このコマンドで別のブランチに切り替えることを認識しています。 すべてが完全に真実です-別のブランチに切り替えるとき、 HEADポインターをブランチの最後のコミットに転送するだけです。

HEADポインターの移行( git checkout


コミット履歴のロールバック:



チェックアウト操作が完了すると、2つのコミットが戻された状態になります。 これはすべて素晴らしいことです。過去に少し足を踏み入れ、そこに何かをスパイしましたが、どのように戻るのでしょうか? たとえば、スーパーメモリがなく、最新のコミットのハッシュを覚えていません(右側のコミットはd79fb ..です)。 git logを作成すると、3つのコミットで構成されるストーリーが表示されます。
 [user@localhost project]$ git log --pretty=oneline 6741a69bd121c295413be95d7597cd7409e713a0 add unit test b3e74f50c3cc48e6b335014b6dc7e301b382a903 add readme 6e04e39d0952a2d6022502d56aaa05d5a064bea Initial commit 

ストーリー全体を失いましたか? 最も「新しい」コミットを見つける方法は? これは問題ではありません-抜け道があり、それらのいくつかがあります:

  1. git log --allコマンドを作成しgit log --all 。 このコマンドは、現在までのストーリー全体を印刷します。 私たちの場合、5つのコミットの履歴:
     [user@localhost project]$ git log --pretty=oneline --all d79fb5688af71b4577f450919535e7177e9d74e8 fix bug 478927e3a088d3cec489ca8810eaaca97c6ce0ff documentation 6741a69bd121c295413be95d7597cd7409e713a0 add unit test b3e74f50c3cc48e6b335014b6dc7e301b382a903 add readme 6e04ee39d0952a2d6022502d56aaa05d5a064bea Initial commit 

    その後、必要なハッシュをコピーしてタイムマシンを再起動します: git checkout 。 ただし、必要なアクションが多すぎるため、この方法はお勧めしません。
  2. Gitでは、 HEADポインターに対するすべての変更を追跡できます。 これはgit reflogで可能ですが、これは初心者向けではなく、私たちの目的には使用されません。 最も有能なのは次のことです。
  3. マスターポインターが最新のコミットを指していることを思い出してください。 したがって、リセットは1つのコマンドgit checkout masterによって実行されます。 出来上がり:




git checkoutメカニズムを明確にするには、新しい開発ブランチを作成します。
 [user@localhost project]$ git checkout -b devel 

* -bフラグは、指定した名前でブランチを作成し、すぐに切り替える必要があることを意味します。
アクションを説明します。



HEADポインターは、 develブランチの上部を指していることに注意してください。

新しいブランチでいくつかのコミットを生成しましょう。 リポジトリの履歴は次のようになります。



masterブランチに戻るのも簡単です。
 [user@localhost project]$ git checkout master 




したがって、最初の段落を覚えておいてください。

ブランチのトップへのポインターの移行( git reset ...


さらに、gitを使用すると、 HEADだけでなく、 大陸のポインターをブランチの最上部に移動することもできます。 これを行うには、-- --softまたは--hardしたgit resetコマンドがあり--hard

どちらの場合も、リセットが行われたコミット-ORIG_HEADに対して「ニックネーム」が表示されます。

git reset --hard HEAD~2


git reset --soft HEAD~2


ORIG_HEADは、ローカルマシン(!)で無効なコミットを編集するのに役立ちます。 最後の2つのコミットを1つに結合したいとします。 これを行うには、ファイルの現在の状態を維持し、マスターポインターを2つのコミットに変換します。
 [user@localhost project]$ git reset --soft HEAD~2 

変更点を見てみましょう。
 [user@localhost project]$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # -    # 

さて、トリックをしましょう-コミットを結合します
 [user@localhost project]$ git commit -c ORIG_HEAD 

メッセージを入力して保存します。 これで、ストーリーは次のようになります。



重要な注意-ORIG_HEADはまだd79fbコミットを指している... git checkout ORIG_HEADコマンドを実行すると、いわゆるHEADの切り離し状態が得られます。 これは、 HEADがブランチの最上部を指すのではなく、単にコミットすることを特徴としています。 HEADは常にブランチの最上部のみを指す必要があります!



HEAD状態を「終了」するには、単純にブランチに切り替えるか、 git checkout -b new_branch_name新しいブランチを作成します
したがって、2番目の点を覚えておいてください。

そして最も重要なこと! gitを使用する場合の上記の最も一般的な操作は、ブランチ間の切り替えです。 考慮される他のすべてのケースはまれですが、それにもかかわらず、それらが使用されるときに起こるすべてを理解する必要があります!

リポジトリの歴史をたどりましょう!

材料の準備では、次のソースが使用されました。
最高のマニュアル-本: ProGit
Git Visual Aid: A Visual Git ReferenceRussian Version

UPD:
コメントでは、gitに関する別の有用なリソースがアドバイスされました: githowto

PS招待してくれてありがとう、そして皆が楽しい週末を過ごせるように!

Source: https://habr.com/ru/post/J157175/


All Articles