2024年4月25日木曜日

実用Git第3版 備忘録4 コミットの書き換え 一時退避

P199 履歴の書き換えについて 注意すべきこと:共有リポジトリに組み込まれたブランチの一部を改変、改ざん、改良してはならない。

P201 A-B-C-D-E-F-G  のコミットDに問題があり、取り消したい場合
    git revert main~3
          A-B-C-D-E-F-G-D'   D'はコミットDの逆(Dの効果を打ち消すようなコミット)

P202 git commit --amend コミット後ログメッセージを修正できる。
 それ以外の活用方法として:
  例:①誤ったコミット ②ファイルを再編集して、新たにコミット もできるが、
 コミット履歴をきれいに残すため、①直接書き換え、必要に応じてファイルを追加、削除できる。②git addやgit rmでインデックスに変更を反映、③git commit --amendを実行
  ①speech.txt修正  git diffでインデックスと作業ディレクトリの差分チェック
  ②git add speech.txt   ③git commit --amend 必要ならコミットメッセージ編集
   git show-branch --more=5      git shouで確認
      A-B-C HEAD  を  A-B-C' HEAD  に変更したというイメージ

                                             ↓dev HEAD                                    ↓dev HEAD
P205 git reset           A-B-C-D                                                 A-B-C-D  
      オプションの影響       HEAD    インデックス     作業ディレクトリ
         --soft       〇
         --mixed        〇        〇
         --hard        〇        〇           〇

--softの例:①file1コミット②file2をステージング③file1のコミットとfile2のステージングした変更をひとつにまとめたい④git reset --soft HEAD^ ⑤git commit -m 'file1 And file2'
  ※インデックスには影響与えてないので、ステージングはそのまま使えて、コミットだけでいいということ。

--mixedの例:①file3とfile4作成した ②コンテンツにもとづき、コミットの順序をきめたい③ git reset HEAD^ (--mixedはディフォルトなのでオプション指定なしでもOk) ④git add file4    git commit -m 'content from file4'  ⑤git add file3    git commit -m 'content from file3'  ⑥git add file1    git commit -m 'content from file1'  などのように
 ※作業ディレクトリには影響あたえないが、ステージングはリセットされるので、再度、ステージングを順序を変えて行うことができるということ。

--hardの場合は、作業ディレクトリもインデックスも含めリセットされるので、ファイルの作り直し、ステージングのやり直しをした上で、コミットすることになる。

  

P214 git cherry-pick  指定したコミットFをカレントブランチに加える 以下の場合はF’

   A-B-C-D-E-F-G-H  dev          A-B-C-D-E-F-G-H  dev

       |                                        |

       V-W-X-Y-Z   rel_2.3             V-W-X-Y-Z-F'   rel_2.3

     git checkout rel_2.3     のあと    git cherry-pick dev~2

P217  reset,revertとcheckoutの関係

  ブランチを移るとき:git checkout またはgit switch

      git resetはブランチ切り替えはしない:ブランチ名指定するとカレントブランチをリセットしてしまう git rest --hardは既知の状態を復元することが目的

P218 他の開発者があなたの李ぴ時取りをクローンしたり、一部のコミットをフェッチしたりしているときは、リポジトリ内のコミット履歴を書き換えるようなコマンドを使うべきではない。代わりにgit revertを使う。git resetやgit commit --amendを使ってはならない。

P219 rebaseについて:書籍にはないが、簡単な例で試してみる

①topicブランチで git rebase main ②mainブランチで git merge --no-ff topic

(--no-ffはfast-forwardなしで、そのほうがあとで管理しやすいとのこと)

③git log --graph で確認できる

もし、①で競合が発生したら、②エディタで競合の原因(main_file)を編集し、競合を解決 ③git add main_file  git rebase --continue(P220)  ④mainブランチで git merge --no-ff topic

P221 rebaseを途中でやめたいとなったら git rebase --abort

P225  git rebase -i コミット  とすると、指定したコミット以降のコミットが編集可

エディタで先頭のpickをsquashにすると、直前のコミットの結合され、新しいコミットメッセージのテンプレートができる。先頭の#は無視される。


P237 git stash list 一時退避されたコンテキストの表示
   git stash -m コメント  でインデックスと作業ディレクトリの内容全体を一時退避          git stash popでもどす
git stash apply + git stash drop =git stash pop

例:  ①file1とfile2を作成、add、commit ②file1に追加文字 ③git stash -m 'Tinkerd file1'
④git commit --dry-run 仮コミットしてみると、コミットするものなしと表示、git stashでまったく、残っていない状態であることを示している? 
⑤ file3を作成 ⑥git stashしても失敗 新しい未追跡ファイルは-uが必要  ⑦ git stash -u -m 'add new untracked file3'  
# 変更を避けておく
$ git stash


利用例1: ブランチを切り替えて、他の作業をする>元の作業ブランチに戻る>スタッシュを今いるブランチに適用  git stash apply
  ブランチを切り替えるためだけに中途半端な状態をコミットしなくてよい

利用例2:コミット…と思ったらブランチ間違いに気づいた>コミットしないままブランチの切り替えに成功すれば良いが、コンフリクトする場合など切り替えられないこともある
git checkout  proper-branchでエラー>git stash> git checkout proper-branch>スタッシュを今いるブランチに適用 git stash apply

利用例3:コミットしてしまったとき>直前のコミットを取り消して、コミット前の状態に戻す。インデックスは残すので--softで  git reset --soft HEAD^ > git stash> git checkout proper-branch>スタッシュを今いるブランチに適用する git stash apply

P246 参照ログで、git reset --hardで削除してしまったものを復活
ログで見えなくても、 git reflog で表示できる。それをもとに、もどりたいところを指定して  git reset --hard HEAD@{1} > git log で確認

0 件のコメント:

コメントを投稿