Gitまとめ
Gitとは??
GitとはSubversionのバージョン管理を行うことが出来るもの。
複数人で何か開発するときに作業を分担して行うときに力を発揮する。
以下のサイトがとても参考になるのでこちらもどうぞ。
https://qiita.com/y_ito/items/91cd96659a56ec9f9dbf
主な用語
ここに記載している内容は個人的な理解なので鵜呑みしないように。
なるべく専門用語を使わずに解説したつもりです。
(ネットや書籍で説明しているものとは相違点が多いです。)
Git
分散管理構成バージョン管理システムのこと。
リポジトリ
Gitで管理されている資材がまとまっているもの
ブランチ(枝、派生先)
Git管理しているバージョンの単位、(これがGitのいいところ!)
チェックアウト(取得)
リモートブランチのファイルを取得することやブランチの切り替えのことを指す
クローン
複製、先述したリポジトリを自身のローカル(Cドライブ等)にコピーすること
リモートブランチ
みんなで触るブランチ、基本的には直接触らないこと!
※取り扱いに注意
ローカルブランチ
一人で触るブランチ、ここで修正したものをリモートブランチに反映させていく
ブランチを切る
ブランチを作成することと同義
ブランチのマージ
ブランチを合成させること。具体例として、マスターブランチをもとに作った開発ブランチの変更点をマスターブランチに反映させることをいう。
マスターブランチ
単に「マスター」とも。リリースのためのブランチで、マスターブランチはすべてのテストが完了した状態であることがほとんど。
後述する開発ブランチは基本的にマスターブランチを起点に作成される。
開発ブランチ
文字通り開発中のブランチ。このブランチを作成する粒度はプロジェクトの方針によって異なるが、基本的に一つの課題に対して一つのブランチが作成されることが多い。
その理由の一つとして、複数の課題を一つのブランチで開発しようとすると、どれか一つでも課題が達成されないでマスターブランチなどにマージされた場合、発見が困難になる。
主なGitコマンド
Clone(リポジトリのコピーを取得)
既に作成されているGitリポジトリのコピーを取得する
$ git clone http://example/sampledirectory/sampleproject.git
Branch(ブランチの作成)
現在いるブランチの内容を別名コピーしたブランチを作成する。(ブランチの移動は行われない)
$ git branch branch_name
Checkout(ブランチの切り替え以外にもつかうよ!!)
ブランチのチェックアウト
作成したブランチをチェックアウトする(作業したいブランチへの移動)
$ git checkout branch_name
ファイルのチェックアウト
ファイルを選択してチェックアウト
$ git checkout source/xxxproject/XXXfile.txt
複数ファイルをチェックアウトする場合は「.」を使う
$ git checkout source/xxxproject/.
Tips
修正したファイルをブランチのチェックアウト時の状態に戻したいときにも使える!
https://qiita.com/macer_fkm/items/ea2337a9b504b982c295
Status(変更内容の確認)
修正・追加内容の確認
ファイルの追加やコミットを行う前にファイルの変更を確認する際に使用する
$ git status
Add(変更ファイルの追加)
コミットしたいファイルの追加
1つずつ選択する場合(こっちのが安全)
$ git add file_name
編集したファイル全部選択する場合(編集したファイルが少ない時はこっちでも)
$ git add .
Commit(追加ファイルの確定)
コミット
追加したファイルを確定
$ git commit –m “commit_reason”
$ git commit –amend –no-edit
ステージされた内容と直前のコミットとの結合をする。コミットした後に漏れていたファイルに気付いた時やちょとした修正をして前のコミットに加えたい場合などに便利。
「どのタイミングでコミットしようか?」と迷うくらいならとりあえずコミットして、それからこのコマンドでどんどん追加していけばいい。
“–no-edit” を付けないとエディタが立ち上がってコミットログ編集画面になってしまう。
$ git commit –amend [-m <コミットメッセージ>]
上と同じだがコミットログをついでに編集したい場合は “–no-edit” を付けずに実行する。
この記事で以前は「直前のコミットのコミットメッセージを変更する」と説明していたが、それはインデックスに何も追加していない状態でこのコマンドを実行すれば結果的にはコミットメッセージの変更になるということ。
https://qiita.com/y_ito/items/91cd96659a56ec9f9dbf
Push(リモートブランチへの反映)
プッシュ
リモートリポジトリにコミット内容を反映、大体Pullしてからやる
$ git push origin remote_branch_name
※pushできないときはpush –fで強制プッシュできる。リモートリポジトリの内容を強制的に上書きするため使い方には注意
Tips
Pushがrejectされる
https://qiita.com/katsuyuki/items/8e03e5eb4223912a08c5
Pull(リモートリポジトリの変更内容を取得)
プル
ローカルブランチにリモートリポジトリの変更内容を取り込む、Pushの前にすることが多い
$ git pull
Fetch(リモートリポジトリの最新状態を取得)
フェッチ
リモートリポジトリの最新状態をローカルに反映するコマンド
リモートブランチの最新状態を取得(リモートで削除されたブランチも同期)
$ git fetch -p
Rebase(ブランチの直列化)
リベース
あるブランチAをもとにブランチBを作成し、ブランチBでの変更をブランチAに取り込むときコンフリクトを起こした際にも使用することがあるコマンド。
$ git rebase branchA
Ex
あるブランチAをもとにブランチBを作成してブランチB上で開発を行っていた際に、ブランチAにコミットが行われ、ブランチBをブランチAにマージしようとするとコンフリクトを起こす。・・・fastForwardMargeが出来ない!!!
Stash(作業内容の退避)
スタッシュ
作業中のブランチの作業内容を一時的に保存したいときに使うコマンド
ブランチのチェックアウト(移動)をするときなどに便利
ブランチの作業内容を退避
$ git stash save
退避した作業内容を復活
$ git stash pop
ブランチのコピー
$ git checkout base_branch_name –b new_branch_name
マスターブランチから派生したブランチをもとに開発をしたい時などに使えるコマンド
例)ver1.0を半年後にver1.1としてリリースしたい。じゃあ、開発しますか。Ver1.1のリポジトリが作成したからそこからissueごとにブランチ切って開発してください。
$ git checkout develop/1.1.0 –b issues/addNewModify
-bオプションにより別のブランチ名としてチェックアウトできる
横着しないで派生元ブランチに移動
$ git checkout originalBranch
開発ブランチを作成
$ git branch newDevelopBranchName
プルリクエスト
単に”PR”や”プルリク”などと訳されることが多い。
基本的にはgit push をするとgitbucket上でほかのブランチに変更内容を取り込んでよいかをレビューするときに用いられる。
マージ
執筆中
RebaseとStashを組み合わせたリベース
利用例
今いるブランチはissue/add_modify
作業ブランチ移ろうかな
$ git checkout develop/1.1.0
error: Your local changes to the following files would be overwritten by checkout:
document/01_release/specifications/XXXspecifications.xlsx
Please commit your changes or stash them before you switch branches.
Aborting
エラーでチェックアウトできない(ブランチの切り替えができない)!!
作業内容を退避しよう
$ git stash save
何退避したんだっけ?
$ git stash list
改めてチェックアウトしよう
$ git checkout develop/1.1.0
リベースするか
さっきstashしたブランチをチェックアウト
$ git checkout issue/add_modify
リベースしよう
$ git rebase develop/1.1.0
リベースしたブランチに退避した作業内容を取り込もう!
$ git stash pop
おわり
チェリーピック
他のブランチのコミット内容を作業中のブランチに取り込みたい
取り込みたいコミットがあるブランチに移動する
※移動できないときはStash(作業内容の退避)を参照のこと
$ git checkout branchA
ログコマンドで取り込みたいコミットのコミット番号を探す
$ git log
commit 1efcdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9
Author: buruyuki
Date: Fri May 10 10:15:22 2019 +0900999 処理一覧更新
作業ブランチに戻る
$ git checkout branchB
チェリーピックコマンドを実施
$ git cherry-pick -m 1 9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1
-m コマンドはマージコミットのときに付与する。基本的には1を使うと思う。詳細は以下参照
http://te2u.hatenablog.jp/entry/2013/11/02/130740
ステータスを確認
$ git status
Unmerged paths:
(use “git add …” to mark resolution)
both modified: document/01_release/Specifications/XxxSpecifications.xlsx
変更したファイルを追加する。
$ git add document/01_release/Specifications/XxxSpecifications.xlsx
ステータスを確認
$ git status
Changes to be committed:
modified: document/01_release/Specifications/XxxSpecifications.xlsx
コミットする(チェリーピックおつかれさま)
$ git commit
※チェリーピック時はコミットメッセージ-m コマンドを追加しない。
ブランチ名が(issues/244_Xxx_Comment_keep|CHERRY-PICKING)
こんな感じだったらまだチェリーピックが終わってない...
チェリーピックをやめたいときは...
$ git cherry-pick –abort
コミットを取り消す(ロールバック)
直前のコミットをなかったことにするには
$ git reset –soft HEAD^
また、オプションは以下
–soft…ワークディレクトリの内容はそのままでコミットだけを取り消したい場合
–hard…コミットを取り消した上でワークディレクトリの内容も書き換えたい場合
HEAD^…直前のコミットを意味する
HEAD~{n}…n個前のコミットを意味する
HEAD^やHEAD~{n}の代わりにコミット番号を書いてもよい(直前のコミット以外はこっちのほうがいいかも)
https://qiita.com/shuntaro_tamura/items/06281261d893acf049ed
CRLFについて
Gitに新規でファイルをaddしたときに「CRLFはLFに変換されます」のようなwarnログが出た場合はテキストエディタで(\r\n→\n)で置換してからaddすればwarnログは出てこない。
GitがUNIXで開発されているため、ローカルの開発環境がWindowsの場合に起きる
追記
$ git config –global core.autocrlfがtrueまたはinputで設定されている場合、gitが改行コードを自動で変換してくれるので上記手順を踏まずとも問題ない。(ちな、ブルはinputで設定してます)
https://qiita.com/uggds/items/00a1974ec4f115616580
addを取り消す
$ git reset HEAD sample.txt
https://qiita.com/nabezokodaikon/items/7ee4900d28d8d863978e
その他
GitBashのショートカットとか
https://www.granfairs.com/blog/staff/gitbash-setting-shortcut
リベース(コミットの統合)
$ git rebase –i commitNo
指定するコミット番号はまとめたいコミットのひとつ前のコミット番号を指定
https://qiita.com/tsuuuuu_san/items/f708a9f7ea8ab8eb6945
https://dev.classmethod.jp/tool/git/git-rebase-fixup/
http://blog.katty.in/853
文字を入力し終わったら、ESCして:wqを打つ。
※メモ
コミットログを破棄する場合はfixupを指定する。
追跡ファイルの削除
$ git clean [-d] -n # 削除対象の確認
$ git clean -f # 削除実行
$ git clean -d -f # ディレクトリも含めて削除