20200519のGitに関する記事は5件です。

【Railsチュートリアル】第1章にあるGitのこと


はじめに

この記事ではRails チュートリアルの第1章
で使用されているGitの使い方について
まとめた記事です。
ベストプラクティスや間違いがあれば
チュートリアルをやりながら書き直していく予定です。

Git

言わずと知れたVersion管理ツール
ちなみにGit HubとGitは別物
よく勘違いされているのであらかじめ書いておきます。

Git : 技術の名前、コマンド
Git Hub : Gitを使ったサービス

ザックリいうとそんな感じです。

チュートリアル 第1章

チュートリアル上で使われてるAmazonのクラウドIDE
Cloud9もそうですが、まぁ日頃使っていないので
使い方を忘れるんですよね。。。
それと同じようにGitも業務に取り入れていない状態で
案の定忘れていました。

今後、職場に導入することも考えて
自分なりのリファレンスをどこかで作りたいな。。。

今回はそんな忘れっぽい私のような人に贈る内容です。

設定コマンド

インストールをするときに欠かせない設定コマンド
社内のそれも外の世界とつながっていない場合でも
これは入れるのだろうか。。。

git config --global user.name [username]
git config --global [mailaddress]

最低限知っておきたい Gitコマンド

$ git init
$ git add -a
$ git status
$ git commit -am "命令系のコメント"

git addの-aオプションは
作業ツリーのファイルをすべてステージするという意味
チュートリアルでは注意して使うように書いてある。
「変更する必要のないファイルも
一緒にステージングしてしまうから」という意味で書いてるのかな

といっても中途半端にあらゆるファイルに変更を加えるのにはリスクがある。
そう思うのは一人で開発しているからかな。

ちなみに初めて知りましたがGitのコメントは命令形
(チュートリアルでは体言止めと表記)が良いみたいです。

筆者は日頃から体言止めで書いているので
ここは当たり前のようにcommitしてました。

Git初心者から脱却したいなら

リポジトリやバックアップについて勉強しよう。
Gitではブランチを使うことで
変更履歴を複数持たせることができる。

文字通どおり枝分かれさせることができるので

オリジナルファイルを複数持つことなく
変更履歴A 変更履歴B といった感じに
変更履歴のみを管理することができる。

何がすごいってオリジナルファイルを
2コ3コと持たなくてよいということ

よくファイル名で
ファイル名_YYYYMMDD-0.txtやファイル名_YYYYMMDD-1.txtといった
ファイルを目にすることだろう。

どれが新しいのかわからない
そういった面倒な版数管理をする必要がないのだ。

また、どうしても
2重管理したいということであれば
別のサーバ上にリポジトリを作成することができる。

これを

「リモートリポジトリを作成する」

という。

リモートリポジトリは
まず、リモートにリポジトリを
登録することから始まり
プッシュすることで終わる。

厳密にはSSHの鍵が必要だとかどうとかあるけど今回は脱線するので
もっと知りたい人は調べてください。

' 現在、スイッチしているブランチ名を参照する
$ git checkout

'リモートリポジトリの操作(ここではmasterブランチにプッシュ)
$ git remote add origin リポジトリURL
$ git push origin master

' 枝分かれtestの作成
$ git checkout -b test

' 枝分かれtestとmasterの結合(masterにスイッチ後)
$ git merge test

' 全ての枝分かれを表示
$ git branch

' コミットログの表示(変更履歴が多い場合はこのまま打つのは得策ではないかも)
$ git log

'任意の変更箇所まで戻る(もしかすると、ベストプラクティスがあるかも)
$git reset ハッシュ値

出力メッセージの英語翻訳

あと、チュートリアルの最中に気になった文言

単語 日本語
On branch master 親ブランチを参照しています
No commits yet まだコミットされていません
Changes to be committed コミットされる変更
Changes not staged for commit 変更がステージングされていません
nothing to commit, working tree clean 作業ツリーにコミットするものは何もありません
discard changes in working directory 作業ディレクトリの変更を無視する

おわり

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gitの使い方-permission deniedが出ると思ったらそもそもcdしてなかった話-備忘録

プログラミング初心者の少し笑い話な備忘録。

permission deniedというエラーが発生した

既存フォルダにgit initしようとしたところ、上記のエラーが発生した。
私の場合はpublickeyは表示されなかった。

このエラーの簡単な解決方法は
Git Bashのアイコン上で右クリック→管理者権限で実行ということだった。

ひとまず、実行すると今度は次の表示が。

*****:Is a directory

bash: /c/Users/*********: Is a directory

立て続けに起こるエラーにパニックになっていると、ふと、いつもなら黄色くファイル表示されるはずの部分がないことに気付く。
そしてよくよく、自分が入力し続けているワードを見ると、チェンジディレクトリのcdを入力していない!

cdから間違えることなく入力し、実行すると無事git initできました。

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gitの容量を削減して地球(コンピュータ)に優しい世界を作ろう!

この作業は慎重に行ってください。一切の責任を負いかねます。

.git/objectsのサイズを測ろう

du -sh .git/objects.git/objectsのサイズが測れます。
削減前に測ってみましょう。

Garbage Collection --optional

git gc --auto

使われないデータを選定

git reflog expire --expire=now --allで使わないものを選定

 Clean!

git gc --aggressive --prune=nowで綺麗にしましょう
再度du -sh .git/objectsでサイズを測ってみよう!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[git]他ブランチの作業を自分のブランチに持ってくる方法まとめ

はじめに

開発作業中に

  • 他ブランチのあのコミットだけこっちにもマージしたい...!!
  • 他ブランチのあのファイルだけこっちにもマージしたい...!!

なんてことはないでしょうか?
今日はそんな方法を紹介してみたいと思います

1. git cherry-pick で他ブランチのコミットを取り込む

1つめの方法は git cherry-pick コマンドを使う方法です。

git cherry-pick とは?

既存の特定のコミットを自分のブランチに取り込むことができる というコマンドです。

書式はこうです。

書式
$ git cherry-pick {コミットのハッシュID}

サンプル

例えば、以下のように、proj/updateTestText ブランチで test.txt を更新したコミットと、新しく test2.text を作ったコミットが存在する という状態があったとします。

~/mywork/test-product (proj/updateTestText)
$ git log --oneline
2784fd2 (HEAD -> proj/updateTestText) create test2.txt
a8706e9 update text.txt
6a539d7 (master) create test.txt

このとき、「新しく作った test2.txt だけ欲しいなー、でも test.txt の更新はまだ欲しくないなー」 という一見無茶ぶりに見える要望に、git cherry-pick を使うと容易く応えることができるのです。

というわけで先ほど紹介した書式にしたがって実際にコマンドを実行してみますとこのとおり test2.txt があなたのお手元に作成されます:thumbsup:

$ git checkout master # master ブランチに戻って
$ git cherry-pick 2784fd2 # test2.txt を作ったコミットだけを cherry-pick!!!

[master 055cafa] create test2.txt
 Date: Mon May 18 22:57:18 2020 +0900
 1 file changed, 1 insertion(+)
 create mode 100644 test2.txt

もちろん、まだマージしたくなかった test.txt の更新コミットは反映されていません。

$ git log --oneline
055cafa (HEAD -> master) create test2.txt
6a539d7 create test.txt

git cherry-pick を行う際は上記のようにコミットの粒度が細かいほどやりやすいので、そのあたりも含めてコミットの粒度を考えて作業を進めると誰かがちょっと幸せになれるかもしれません。

2. git checkout で他ブランチの特定ファイルだけを取り込む

2つめは git checkout を使った方法を紹介します。
「は?git checkout はブランチを切り替えるコマンドだろ?」と思った方、実はそれだけではないんです。

git checkout とは

公式 からの引用ですが、git checkout コマンドとは、

  • ブランチの切り替え
  • 作業ツリーファイルの復元

この2点の機能を持っています。
前者の機能は広く知られているかとおもいますが、ここではこの後者の機能をつかって、別ブランチの特定ファイルを自分のブランチに復元する という流れで、別ブランチからの作業取り込みを実現してみたいと思います。

というわけでやってみましょう

書式は以下のとおりです。

書式
$ git checkout origin/feature/targetBranch -- path/to/targetFile.extension

以下は先ほどの cherry-pick の実行前と一見同じ状態ですが、test.textの更新とtest2.txtの作成を同じコミットで行ってしまっています。 これだと test2.txt だけを取り込みたい場合は cherry-pick コマンドでは対応できません。

事前準備
~/mywork/test-product (proj/updateTestText)
$ git log --oneline
d5416a0 (HEAD -> proj/updateTestText) update test.txt and create create test2.txt
3a5d667 (master) create test.txt

そこで checkout コマンドの出番です。
を実行すると、なんと master ブランチに test2.txt がそのまま復元されました。

checkoutコマンドで移植
$ git checkout proj/updateTestText -- test2.txt
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    new file:   test2.txt

あとはこの新しく作成されたファイルをコミットするだけです。

$ git commit
[master aec7110] create test2.txt on master
 1 file changed, 1 insertion(+)
 create mode 100644 test2.txt

checkout はさらにここがスゴイ

さて、勘の良い方はこう思いませんでしたでしょうか?
「proj/updateTestTextブランチをmasterにマージしたらコンフリクトしないの?」 と。

結論から言います。しないんです。

実際やってみましょう。

$ git merge --no-ff proj/updateTestText
Merge made by the 'recursive' strategy.
 test.txt | 1 +
 1 file changed, 1 insertion(+)

このとおり。

所感

毎日使うような操作ではないですが、こちらを覚えておくと非常時にけっこう役にたちます。
機会があれば試してみてください。

また、公式ドキュメントを見るとどちらのコマンドにもいろんなオプションがあります。筆者もまだ全てに目を通しきれてはいませんが、何か面白そうだったり、特に役にたちそうなオプションがあればまた改めて紹介したいと思います。

はばないすでい。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ブランチ2種類

統合ブランチ

リリース版が何時でも作成可能なようしておくためのブランチ
トピックブランチの分岐元としても使用し、安定した状態を保っておくことが重要

トピックブランチ

機能追加やバグ修正といったある課題に関する作業を行うために作成するブランチ
複数の課題に関する作業を同時に行う時は、その数だけトピックブランチが作成される

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む