Git 学習メモ

Git|わかばちゃんと学ぶ git使い方入門CHAPTER4をターミナルで

前回からの続き
そういえば言ってなかった気がするんですが、
今更だけど練習用のデータは本文に合わせたものを作ってやった方がわかりやすいです
ちょっと面倒だったりもしますがそれも何かしらの練習と思ってやりました

わかばちゃんと学ぶ git使い方入門で解説されているSourceTreeの操作をCloud9のターミナルで行うにはどうしたらいいかと言うお話です
PC上だと少し違うかもしれませんがGitのコマンドは大体同じかと思います
同じような環境の人のお役に立てれば幸いです

  • 本文中、ユーザーネームなどはご自身の環境によって変わります
  • 御本があること前提なので本文に載っている部分の解説はほぼ省略しています
  • 御本にあることをターミナルでと言う前提なので紹介されていない機能や関連オプションについてはほぼ省略しています
  • コマンドを実行した際の表示メッセージを適宜省略しています

間違っている所は教えていただけるとありがたいです

わかばちゃんと学ぶ git使い方入門
CHAPTER4の内容をターミナルで実行したい

SECTION 17|過去に戻って新規ブランチを作成

CHAPTER2でやった事の合わせ技です
git log→戻りたい部分のコミットIDをコピー→戻りたいcommitにcheckout→新規ブランチを作成

 (master) $ git log
#中略
commit ac5ea31ea2873ad7b0203fe1d75191df0ef66da3
Author: user-name 
Date:   Mon Apr 29 08:06:02 2019 +0000

    キャベツを追加
(master) $ git checkout ac5ea31ea2873ad7b0203fe1d75191df0ef66da3
#ここで出るメッセージについてはSECTION28にて
((ac5ea31...)) $ git checkout -b butatama
Switched to a new branch 'butatama'  #新しいブランチ(butatama)に切り替わったというメッセージ

御本と違って枝分かれの樹形図にはならないですが大丈夫です

SECTION 18|過去のコミットを打ち消す

git logで打ち消したいコミットのIDをコピー

(master) #コミットメッセージは自動で挿入される
$ git revert 4eefc30de2d4d20cdcf52ec0fe729d40a69af5f0 --no -edit
[master d187b76] Revert "コーラを追加"  #Revert "元のコミットメッセージ"の形で自動挿入
(master) $ git log --oneline --graph
* d187b76 (HEAD -> master) Revert "コーラを追加"  #打ち消した事が記録に残っている
* 4eefc30 コーラを追加
* 96d8105 キャベツを追加
* a53d0c7 具材を追加
* fd9d64c お好み焼きの生地を作成

コミットメッセージを編集したい場合

#オプションを付けない(もしくは-e,--edit)
(master) $ git revert d187b7618e5bfc1e82d83f6f294c42b00f1c5817

ターミナルにエディタが開くので赤丸部分を編集

ctrl+x(保存して終了) → y(確認) → Enter(ファイル名はそのままで実行) でターミナルに戻る
間違えておかしなコミットメッセージになってしまっても後からコミットメッセージを編集することも出来るので慌てない

SECTION 19|履歴を直線に

御本の見本と同じになるようにデータを作っておく
ブランチごとに別ファイルにしておくと後でコンフリクトが起こらないので良いです

#git revase リベース先のブランチ名 リベースしたいブランチ名
(facebook-button) $ git rebase master facebook-button
#樹形図を表示すると本文と同じになっているのがわかる
(facebook-button) $  git log --oneline --graph                                               
* 6f31778 (HEAD -> facebook-button) Facebookいいねボタンを追加
* 410be87 Facebook SDKを設置
* 74c509e (master) ナビゲーションの文字サイズを修正
* 7ccfb49 ナビゲーションの背景を修正
* 0101afa first commit

因みにマージした場合はこちら
なぜか更新順ではなくなっています

(master) $ git merge facebook-button
#mergeに対するコミットメッセージを編集するエディタが出ますので先ほどの図を参考にどうぞです
(master) $ git log --oneline --graph
*   5a891f7 (HEAD -> master) Merge branch 'facebook-button'    #編集をしなかった場合のメッセージはこうなります
|\  
| * 1a6ac69 (facebook-button) Facebookいいねボタンを追加
| * 7e4bca6 Facebook SDKを設置
* | 6f60d03 ナビゲーションの文字サイズを修正
|/  
* c568f64 ナビゲーションの背景を修正
* 3e5c0a4 first commit

SECTION 20|コミットを一つにまとめる

タイトルにはスカッシュとありますが、実行するコマンドはスカッシュじゃないんですね。
コマンドによって行う行動がスカッシュと言う認識でおりますがそれでいいのかな?
因みに使うコマンドはrebaseです

正直ここは特に自信がありませんしもっといい方法があると思うのですが、現状ここまでで精一杯です💧

(edit-work) $ git log --oneline --graph  #ログを表示して纏めたいコミットを確認
* 47ac562 (HEAD -> edit-work) 誤字修正     #HEAD~3つ目までを纏めます
* e9c087b ゼミの活動内容をさらに追加
* cdb27ef ゼミの活動内容を追加
*   f467d0f (master) Merge branch 'update-news'
|\  
#ログ後略
(edit-work) $ git rebase -i HEAD~3                 #HEAD~3を指定

エディタが開きます

赤丸部分を修正します
pickの部分を、残したいコミット(一番新しいもの)はそのまま
纏めたいコミットをsに書き換えます

ctrl+x(保存して終了) → y(確認) → Enter(ファイル名はそのままで実行)
と、ここでコミットメッセージの編集画面に移りますがどこをどうすればいいのかわからず・・・
なのでそのままctrl+x(保存して終了) → y(確認) → Enter(ファイル名はそのままで実行) でターミナルに戻ります
残した分のコミットメッセージが表示されています(わかったら修正しますねすみません)
コミットメッセージを修正する場合、↓こちらのコマンド(SESSION24の方法)で修正できます(引き続きエディタの方で何かできないのか勉強します)

$ git commit --amend -m"コミットメッセージ"

SECTION 22|リモートリポジトリから最新の状態を取得

現在の状況

御本とちょっと違ってしまっているのですが
git logで確認するとすべての状況が揃っているのがわかります

(master) $ git log --oneline
#すべてが揃っている
0c3251c (HEAD -> master, origin/master, origin/HEAD) READMEにGitHub PagesのURLを追加
1294305 活動内容ページを追加
1ccc226 メンバー紹介ページを追加

リモートの状況を取り込む

御本に従ってGitHubでデータの更新をします

(master) $ git fetch                                           #更新データを取得するコマンド
(master) $ git log origin/master --oneline                     #リモート追跡リポジトリのログを表示
6882a1b (origin/master, origin/HEAD) README.mdに大学名を追加      #リモートの現在位置
0c3251c (HEAD -> master) READMEにGitHub PagesのURLを追加        #ローカルの現在位置
1294305 活動内容ページを追加
1ccc226 メンバー紹介ページを追加

変更をローカルブランチにマージする

(master) $ git branch  #masterブランチにcheckoutしていることを確認
* master
(master) $ git checkout master  #ちなみにcheckout masterするとメッセージが表示されます
Already on 'master'  #masterブランチにいるよ
#1コミット分リモートが進んでるよ 早送りしていいよ(衝突しないので取り込んでいいよ)
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.    
  (use "git pull" to update your local branch)
(master) $ git merge origin/master #リモート追跡リポジトリとマージ
(master) $ git log --oneline
6882a1b (HEAD -> master, origin/master, origin/HEAD) README.mdに大学名を追加
#位置が揃っている
0c3251c READMEにGitHub PagesのURLを追加
1294305 活動内容ページを追加
1ccc226 メンバー紹介ページを追加

SECTION 23|不要になったリモートブランチを削除する

リモートブランチの削除

適宜マージしたデータを用意してリモートにもpushしておきます

(master) $ git log --oneline --graph #最初の状態はこちら
* c67e225 (HEAD -> master) Merge branch 'facebook-button'
|\
| * a2719fb (facebook-button) Facebookいいねボタンを追加 #マージ済のこのブランチを削除する
| * 7842f5a Facebook SDKを設置
* | c0eec98 ナビゲーションのフォントサイズを修正
|/
* a608c67 ナビゲーションの背景を修正
* 5ba6871 first commit
(master) $ git branch --remote              #リモートにあるブランチを確認する
  origin/facebook-button
  origin/master
(master) $ git push --delete origin facebook-button    #git push --delete origin 削除したいリモートリポジトリ名
(master) $ git branch --remote                #リモートにあるブランチを確認すると指定ブランチが削除されている
  origin/master
(master) $ git branch                                  #ローカルにあるブランチを確認する
  facebook-button
* master
(master) $ git branch -d facebook-button               #git branch -d 削除したいブランチ名
 (master) $ git branch                                 #ブランチを確認すると指定ブランチが削除されている
* master
 (master) $ git log --oneline --graph                  #樹形図でもブランチ名が削除されているのがわかる(マージされているのでコミットは残っている)
*   c67e225 (HEAD -> master, origin/master) Merge branch 'facebook-button'
|\  
| * a2719fb Facebookいいねボタンを追加
| * 7842f5a Facebook SDKを設置
* | c0eec98 ナビゲーションのフォントサイズを修正
|/  
* a608c67 ナビゲーションの背景を修正
* 5ba6871 first commit

他のメンバーが削除したリモートブランチをローカルで削除

masterブランチとトピックブランチ(facebook-button)をマージしたデータをpush
GitHubのページ上でトピックブランチ(facebook-button)を削除(ブランチの一覧を開いてゴミ箱マーク)
この状態でターミナルからリモートにあるブランチを確認してみます

(master) $ git branch --remote
  origin/facebook-button    #消えてない?!
  origin/master

どうやらターミナルから消した場合以外はこういうことが起こるようです

(master) $ git remote show origin                                                    #現在のリモート追跡リポジトリの状態を確認
* remote origin
  Fetch URL: git@github.com:user/sample.git
  Push  URL: git@github.com:user/sample.git
  HEAD branch: master
  Remote branches:
    master                             tracked    #tracked = 使用されているブランチ
    refs/remotes/origin/facebook-button stale (use 'git remote prune' to remove)    #stale = 削除されているブランチ
  Local branches configured for 'git pull':
    facebook-button merges with remote facebook-button
    master          merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)
 (master) $ git remote prune origin --dry-run                                       #削除するコマンドを実行したときに消されるブランチを確認
Pruning origin
URL: git@github.com:user/sample.git
 * [would prune] origin/facebook-button                                             #削除されるブランチ名
ec2-user:~/environment/sample (master) $ git remote prune origin                     #リモートで削除されているブランチをリモート追跡ブランチから削除する
Pruning origin
URL: git@github.com:user/sample.git
 * [pruned] origin/facebook-button                                                  #削除されたブランチ名
ec2-user:~/environment/sample (master) $ git branch --remote                         #確認
  origin/master
(master) $ git branch -d facebook-button                                             #ローカルのブランチも削除する

SECTION 24|直前のコミットメッセージを修正する

直前のコミットメッセージ且つpushしていないものに限る

>$ git commit --amend -m"コミットメッセージ"

SECTION 25|未コミットのファイルを一時退避

一時退避を行う

御本と同じようにデータを作成
樹形図を表示しても本文のように表示されませんが、気にせず進みます

$ git status                                                        #ステータスを表示
        modified:   sns-btn.txt                                    #ステージ・コミットされていないファイルがあることがわかる

 $ git stash save                                                    #退避データを保存するコマンド
Saved working directory and index state WIP on facebook-button: 6bf7fef ツイッターボタンを追加   #ブランチ名:表示コミットの後の状態を保存したよ的なメッセージ
 $ git status #ステータスを確認するとブランチはクリーンになっている
On branch facebook-button
nothing to commit, working tree clean

退避する際にメッセージを付けることも出来る

$ git stash save "Googleplus-button"                                              #退避データを保存するコマンド "メッセージ"
Saved working directory and index state On facebook-button: Googleplus-button     #ブランチ名:表示メッセージの状態を保存したよ的なメッセージ

復元

スタッシュをリスト表示

$git stash list                                                            #スタッシュのリストを表示するコマンド
stash@{0}: WIP on facebook-button: 6bf7fef ツイッターボタンを追加      #保存時にメッセージを追加しなかった時の表示

$git stash list #スタッシュのリストを表示するコマンド
stash@{0}: On facebook-button: Googleplus-button #保存時にメッセージを追加した時の表示

戻したいスタッシュ名(stash@{0}の部分)をコピー

(style-globalnav) $ git stash apply stash@{0}  #git stash apply スタッシュ名
        modified:   sns-btn.txt  #ステージ・コミットされていない表示ファイルの状態を復元

$ git stash apply stash@{0} --index     #ステージされていればその状態を維持したまま復元(オプションを付けないと未ステージ状態で復元される)

この状態だと退避したデータが残っている

$ git stash pop スタッシュ名         #変更を復元すると同時に退避データを削除

$ git stash drop スタッシュ名    #リストに残っている退避データを削除 復元前に間違って消さないように注意

SECTION 26|別のブランチから特定のコミットをコピー

御本の通りにデータを作ります。コミットごとに別ファイルにするとスムーズです。
現状はこんな感じ

(style-globalnav) $ git branch
  facebook-button
  master
* style-globalnav
(style-globalnav) $ git log --oneline
f9b9a2b (HEAD -> style-globalnav) Facebookいいねボタンを追加    #このコミットをfacebook-buttonブランチに移動
ad5c9af ナビゲーションの背景を調整
451d117 (master) frst commit

実際の作業はこちら

(style-globalnav) $ git log                                                 #ログを表示
commit f9b9a2bba17c859f191a493e7a0ac05497e2200a (HEAD -> style-globalnav)      #移動したいコミットのIDをコピー
Author: user <user-mail@gmail.com>
Date:   Thu May 2 06:58:11 2019 +0000

    Facebookいいねボタンを追加
(style-globalnav) $ git checkout facebook-button                                #移動先のブランチにチェックアウト
(facebook-button) $ git cherry-pick f9b9a2bba17c859f191a493e7a0ac05497e2200a    #git cherry-pick 移動したいコミットのIDをペースト
(facebook-button) $ git log --oneline   #ログを表示するとコピーされているのがわかる
84cb8dd (HEAD -> facebook-button) Facebookいいねボタンを追加
eb13a32 ツイッターボタンを追加
ad5c9af ナビゲーションの背景を調整
451d117 (master) frst commit

移動元のコミットはrevertで打ち消しておく

SECTION 27|コミットにタグをつける

タグをつける

(master) $ git log                                                                 #ログを表示
commit d810d5710716b812a750202b77571dc5d4eeeb4d (HEAD -> master, origin/master)    #タグを挿入したいコミットのIDをコピー
Merge: 750f90f e75d04c
Author: user <user-mail@gmail.com>
Date:   Wed May 1 11:52:34 2019 +0000
    Merge branch 'facebook-button'

(master) $ git tag v1.0 d810d5710716b812a750202b77571dc5d4eeeb4d                    #git tag 付けたいタグ名 付けたいコミットのID
(master) $ git log --oneline
d810d57 (HEAD -> master, tag: v1.0, origin/master) Merge branch 'facebook-button'   #タグが付いているのが確認できる
e75d04c Facebookいいねボタンを追加
750f90f ナビゲーションのフォントサイズを修正

(master) $ git push origin v1.0                                                     #リモートにもpushする

タグの削除

(master) $ git tag -d v1.0                                                          #git tag -d 削除したいタグ名
(master) $ git log --oneline
d810d57 (HEAD -> master, origin/master) Merge branch 'facebook-button'              #タグが削除されている
e75d04c Facebookいいねボタンを追加
750f90f ナビゲーションのフォントサイズを修正

(master) $ git push origin :refs/tag/v1.0                                           #リモートも削除する

SECTION 28|HEADに直接コミットしてしまったら

CHAPTER2のSECTION06で「詳しくはSECTION28で」と書いたやつです
例えば状況としてはこんな感じ

(master) $ git log --oneline                                              #現在の状況
d810d57 (HEAD -> master, origin/master) Merge branch 'facebook-button'
e75d04c Facebookいいねボタンを追加
750f90f ナビゲーションのフォントサイズを修正                  #ここにチェックアウトしてみます
0d6574b Facebook SDKを設置
cba379a ナビゲーションの背景を修正
0e6399d first commit

(master) $ git log                               #ログを表示
#前略
commit 750f90fa9e4f494674ba6785f7d3c3f1625e9b83                            #チェックアウトしたい場所のコミットIDをコピー
Author: user <user.mail@gmail.com>
Date:   Wed May 1 11:51:23 2019 +0000

    ナビゲーションのフォントサイズを修正

 (master) $ git checkout 750f90fa9e4f494674ba6785f7d3c3f1625e9b83         
Note: checking out '750f90fa9e4f494674ba6785f7d3c3f1625e9b83'.             #このコミットIDにチェックアウトしたよと言うメッセージ

You are in 'detached HEAD' state. You can look around, make experimental    #detached HEADが起きている どういう状況かの説明と解決方法
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>                       #git checkout -b 新しいブランチ名 を実行してねと言うメッセージ

HEAD is now at 750f90f... ナビゲーションのフォントサイズを修正          #現在のHEADの位置
((750f90f...)) $                                                            #()内の現在位置がコミットIDになっている時はdetached HEADが起きている

解説は本文の通りです

以上で終了

ずいぶん長くなっちゃったので分ければよかったような気もしますが本文と同じまとまりと言う事で。
正直、ここどうなのよっていうところも残っていますが(スカッシュとかスカッシュとか)一先ず終了です。
入門編が終わったと言う事で、適宜勉強していきたいと思います。