- 投稿日:2020-10-27T22:59:54+09:00
【git】git stash の使い方を具体例を使ってわかりやすくしてみた
はじめに
Git Hubを使用するときに、次のようなことありませんか。
プルリクして他の人に確認をしてもらっている時にそのプルリクの内容を使用して開発を続けたい。
作業するブランチを間違えて本来作業したいブランチにその作業した内容を反映させたい。
そんなときにstashというコマンドが便利のなので使用例と共に紹介していこうと思います。
git初心者のためもっと便利な方法がありましたら指摘してただけると幸いです。前提として
- git hub の基本的な使い方(comit,push,pullなど)が分かっていること
私の使用している環境
- pc:macOS Catalina 10.15.7
- 統合開発環境:atom version1.50.0
stashについて
stashとは・・・
一言で言うとコミットからの変更履歴をstash listに避難(保持)ができるコマンドです。具体例を使用して説明していきます。
大まかな手順をまとめておきます。
- 手順①Aブランチをつくってtest1.pyプルリクエスト
- 手順②プルリクエスト後Aブランチのままtest1.pyに内容を追加
- 手順③test1.pyに追加した内容をgit stash listに避難させる
- 手順④git stash list でstashした内容の確認
- 手順⑤新しいブランチを作成(Bブランチ作成)
- 手順⑥リモートの内容をBブランチにpullする(Aブランチの状態によってpullしてくる箇所が異なる)
- 手順⑦git stash listの内容を反映することができるコマンドを確認
- 手順⑧git stash listの内容を反映する
手順①Aブランチをつくってtest1.pyプルリクエスト
masterブランチからAブランチを作成後、以下のファイルをコミットしてプルリクエストをした。
test1.py# 最初のコミット print("test1")次にプルリクエストを待っている間にコミットしたファイルを使用したい。
手順②プルリクエスト後Aブランチのままtest1.pyに内容を追加
Aブランチのままtest1.pyに以下の内容を追加した。
test1.py# 最初のコミット print("test1") # 内容の追加 print("test2")保存をすると画像みたいにunstagedの箇所にtest1.pyの変更が反映される。
次にこの追加した内容を違うブランチに反映したい。
同じブランチでそのままコミットすることも可能ですが、基本的に相手に確認してもらっている最中にコミットするのはあまり気持ちのいいものではないので避けたい。今回の例は追加のみでしたが実際は手順①でプルリクしている箇所の間違いに気づいて修正することも考えられます。(相手からすると途中までみてたのに勝手に内容変えられると最初から見ないといけないじゃないかクソが!となってしまします。笑)
手順③test1.pyに追加した内容をgit stash listに避難させる
変更内容を避難させる。
ターミナル(windowsの場合はコマンドプロンプト)にてgit stash
コマンドを実行します。するとAブランチにあるtest1.pyファイルは以下のようになります。ターミナルgit stash<実行後>
test1.py# 最初のコミット print("test1")手順①でコミットした時のファイルの内容に戻ります。言い方を変えると手順②で追加した内容を
git stash list
に避難させています。unstagedの箇所にあったtest1.pyの変更もなくなります。(以下の画像のようになります。)手順④git stash list を確認するコマンドの確認
避難させたgit stash listを確認する。使用するコマンドは以下のとおりです。
①
git stash list(内容)
git stash listを確認できます。
(使用例)ターミナルgit stash list <以下実行結果> stash@{0}: WIP on branch_name: commit_id2 commit_comment2上の
stash@{0}
に先ほど避難させた内容が入っています。この0はstash listの0番目だよってことを示しています。複数ある場合はこの数字によって使用したいstash listを指定します。実行しても何も起きない場合はgit stash list がないことを示します。
※git stash listにsatsh@{0}があるときにgit stash listコマンドを実行すると実行前のstash@{0}はstash@{1}となる。新たにstashされた内容がstash@{0}となる。{}の中の数字が小さいほど新しいstash listの内容である。②
git stash show stash@{0} -p(内容)
git stash list の退避内容が確認できます。stash@{0}の中の0はgit stash list が複数ある際にどのstash listを確認したいかを指定するものです。-p
の部分は--patch
でも代用可能です。(使用例)
ターミナルgit stash show stash@{0} -p <以下実行結果> # 最初のコミット print("test1") + +# 内容の追加 +print("test2")③
git diff stash@{0}(内容)git stash list のdiff(差分)を表示できます。言葉での説明はわかりにくいので使用例をみてください。
(使用例)
ターミナルgit diff stash@{0} <以下実行結果> # 最初のコミット print("test1") - -# 内容の追加 -print("test2")手順⑤新しいブランチを作成(Bブランチ作成)
反映をさせる前に新しいブランチを作ります。ここではmasterブランチからBブランチを作ります。
手順⑥リモートの内容をBブランチにpullする(Aブランチの状態によってpullしてくる箇所が異なる)
Bブランチ作成後に、リモートの内容をpullするのですが、Aブランチのプルリクがマージされているのか、されていないのかでpullしてくる箇所が変わってきます。
1.マージされている場合
git pull origin master
によりリモートのmasterブランチの内容をBブランチに反映させる。その時のtest1.pyの内容は以下のとおりである。test1.py# 最初のコミット print("test1")2.マージされていない場合
git pull origin A
によりプルリク中のAブランチの内容を反映させる。これでもtest1.pyのAブランチの内容をBブランチに反映させることができる。反映内容は上記と同様。test1.py# 最初のコミット print("test1")※注意
2の方法によりpullしてきた箇所を修正すると、AブランチのプルリクがマージされたあとBブランチのプルリクをマージしようとするとコンフリクトしてしまいます。コンフリクトしても都度解消すれば特に問題はありません。
pullしてきた箇所を修正せず追加のみだとコンフリクトはおきません。(補足)Aブランチの内容をBブランチにpullしたいときにAブランチに複数のコミットがあり、その中の1つの内容を反映させたい場合があると思います。その時は
git cherry-pick
という便利なコマンドがあります。cherry-pickについて知りたい方は以下のurlでわかりやすく説明されている方がおられますのでそちらを参考にしてください。[git]他ブランチの作業を自分のブランチに持ってくる方法まとめ
手順⑦git stash listの内容を反映することができるコマンドを確認
反映ができるコマンドは主に2つあります。
○1つ目
git stash apply stash@{0}こっちは反映した後にgit stash listはそのまま残ります。
○2つ目
git stash pop stash@{0}こっちは反映した後にgit stash list を削除されます。
{}の中の数字は整数を入れてどのstash listの内容を反映するのかを指定します。
stash listを指定しない場合は、デフォルトでstash@{0}指定されます。手順⑧git stash listの内容を反映する
手順⑦で確認した
git stash pop
コマンドにより避難させた内容を以下のとおり反映します。ターミナルgit stash pop stash@{0}実行後のtest1.pyファイル
test1.py# 最初のコミット print("test1") # 内容の追加 print("test2")これで手順①でプルリク後からの変更内容をBブランチに反映することができました。
このあとにgit stash list
を実行してもstash@{0}はありません。git stash apply stash@{0}
により実行した場合だとstash@{0}は残っています。参照url
- 投稿日:2020-10-27T22:58:37+09:00
Tigを導入して今日から君もSourceTree離れしよう!!
この記事の対象者
普段からSourceTreeを使用している方
Tigとは
Gitの履歴や差分を可視化してくれる超絶便利な機能です。
https://github.com/jonas/tigHomebrewを導入している場合は、
brew intall tig
でインストールすることができます。SourceTreeから離れてTigを使おうと思ったきっかけ
- リポジトリの容量が重いとSourceTreeがフリーズする
- SourceTreeの起動速度が遅い
- SourceTreeが度々モサモサする
- 最初の初期設定云々がめんどくさい
- めんどくさい
- Dockerの中に入っているフォルダがSourceTreeで管理できないことがあった(設定でできる様です)
- VSCodeからそのままGIT操作がしたかった
- なんかカッコいい
- なんか黒い画面から操作してるとカッコいい
- スタバとかで黒い画面操作してるとカッコいい
そもそもSourceTreeでは大した操作はしていなかった
普段の操作例
- コミット
- プッシュ
- フェッチ
- プル
- チェックアウト
- マージ
- リセット
ぐらいでした。
これをコマンドで入力すると
コミット git commit or git commit -m "コミット内容" プッシュ git push (リモートと紐付けできていればこれでOK) フェッチ git fetch プル git pull チェックアウト git checkout <branch> マージ git merge <branch> リセット git reset --soft HEAD^結構簡単ですね!!
具体的にTigを使用すると何ができるのか
コマンド入力例から見てみましょう!
tig
を入力すると現在のブランチの履歴がターミナルから閲覧できます。
キーボードの矢印もしくは
J,K
で上下することができEnterを押すと詳細な変更点を閲覧することができます。
一枚目のスクショのときに
cmd+s
でuntracked, changed, commited
のファイルをそれぞれ閲覧することができ、commitedにしたい時はu
でcommitedにすることができます。ファイルの上でEnterを押すと詳細な変更点を閲覧することができます。
commitしたいファイルをcommitedに移動したら
cmd+c
でコミット画面を表示することができます。
vimの操作で
i
で編集モードに入り、control+c
で編集を終了します。
コミット内容に問題がなければ:wq
でコミットを確定します。その後はターミナルから
git push
でリモートにpushすることができます。初めのうちはTigの操作というよりはVimの操作に手こずりますが、Vimを覚えておくとDockerの中のファイルを編集したりするときにスムーズに作業が完了するので覚えておいて損はないとおもいます。
ターミナルからGIT操作することに何を抵抗を感じるのか
私もそうだったのですが、なんとなく色付きでリッチに履歴を見たい!
GUI操作のほうが簡単!
周りの人はみんなSourceTreeを使っているから!!
なんかこわい。
コマンド操作が分からない。
なんか黒い画面がこわい。というのが主な理由でした。
最後に
最初はSourceTreeから離れるのが不安だと思います。
その場合はSourceTreeとターミナルを併用して両方からGit操作することをオススメします。
徐々にターミナルを使用することで抵抗感なく移行することができるようになるとおもいます。
- 投稿日:2020-10-27T17:23:55+09:00
branchを指定してcloneする方法
背景
YouTubeで、Vuetifyのチュートリアルを学習しようと思った。動画投稿者が、githubにサンプルコードを載せてくれていた。それは、各lessonごとにbranchが切られていたので、ただgit cloneするだけだと、目的のファイルが入手できず、branchごとにcloneする必要があった。
これ→https://github.com/iamshaunjp/vuetify-playlist
方法
$ git clone -b ブランチ名 cloneのhttpsつまり
$ git clone -b git clone -b lesson-2 https://github.com/iamshaunjp/vuetify-playlist.gitです。
- 投稿日:2020-10-27T14:42:24+09:00
SVN のリポジトリを Git のリポジトリとして clone する
環境
CentOS 7.7
手順
必要なパッケージをインストールする
$ sudo yum install -y git-svn
SVN と Git のユーザ情報のマッピングファイルを作成する
$ vi authors
authors# format svn-user-name = git-user-name <git-user-email>SVN リポジトリを Git のリポジトリとして clone する
$ git svn clone --stdlayout --no-metadata --prefix=svn/ --localtime --authors-file=authors <svn-repository-url>
clone 時に使用するオプションについて
- --stdlayout
- SVN のリポジトリが trunk, branches, tags の構成になっている場合に使用する
- --no-metadata
- コミットログに SVN のメタ情報を残さない
- --prefix=svn/
- SVN のリポジトリから作成したブランチに、指定したプレフィックスをつける(ex.
remotes/svn/trunk
)- --localtime
- コミットログの Date 情報をローカルのタイムゾーンに合わせる(デフォルトはUTC)
- --authors-file=authors
- コミットログの Author 情報を指定したファイルで置換
今回は Git のローカルリポジトリを作成するところまで検証した。
あとはgit remote add
でリモートリポジトリを追加してプッシュしてやれば良さそう。
- 投稿日:2020-10-27T14:35:43+09:00
gitのssh認証
はじめに
gitのssh認証する.
参考文献
環境
- wls2
- Ubuntu 20.04 LTS
やっていく
ディレクトリ作成
~/.sshディレクトリを作成し中に入る.
鍵作成
以下を入力.
※※GitHubに登録しているEmailアドレスを使う.ssh-keygen -t rsa -b 4096 -C "your_email@example.com"SSH Keyの保存場所を聞かれるので,名前を変え保存.
Enter file in which to save the key (/home/[UserName]/.ssh/id_rsa): /home/[UserName]/.ssh/id_rsa_githubパスフレーズを入力.
Enter passphrase (empty for no passphrase): [Type a passphrase] Enter same passphrase again: [Type a passphrase]鍵作成完了
Your identification has been saved in id_rsa_github. Your public key has been saved in id_rsa_github.pub.GitHubアカウントにSSH Keyの登録
- ~/.ssh/id_rsa_github.pubの内容をクリップボードにコピー
- GitHubにログインし、右上のプロフィールをクリック -> Settingsにて設定画面に遷移
- 左のメニューからSSH keysをクリック
- Add SSH Keyをクリック
- Titleに識別できる文字列を入力
- Bodyに先ほどクリップボードに入れた値をペースト
- Add Keyをクリック
config設定
.ssh内にconfigファイルを作成
vim ~/.ssh/config権限を修正
chmod 600 ~/.ssh/config下記を追記
Host github HostName github.com IdentityFile ~/.ssh/id_rsa_github User git秘密鍵をssh-agentに登録する
まずはssh-agentが動作しているかを確認.
$ eval "$(ssh-agent -s)"秘密鍵を登録
$ ssh-add ~/.ssh/id_rsa_github Enter passphrase for /Users/ts/.ssh/id_rsa_github: [Type a passphrase] Identity added: /home/[UserName]/.ssh/id_rsa_github (/home/[UserName]/.ssh/id_rsa_github)接続確認
proxyに通していると,認証できないのでテザリングに切り替える.
以下を入力ssh -T git@github.com接続するか聞かれるので、GitHubのSSH Keyに記述されているものと一致するのを確認してからyesを入力
Are you sure you want to continue connecting (yes/no)?次のように出れば認証ok
Hi username! You've successfully authenticated, but GitHub does not provide shell access.