Git備忘録

コミットとプッシュ

ステージングにadd

git add -A  //すべてのdiffをadd
git add .  //カレントディレクトリ配下のdiffをadd

コミット

git commit -m "commit message"

プッシュ

git push origin master

ローカルと同名のリモートがあればそこへプッシュされる。無ければ新規ブランチがリモートに作成される。

このため、ローカルブランチの命名規則を、それとわかるように作成しておくことで、リモートに直接プッシュされるリスクを防ぐことができる。一般的には、feature/branch-name のように命名する。

プル

git pull origin branchName

修正内容の確認

誰がいつどのコミットで修正したか調べる

git blame [filepath]

修正者、修正日、修正コミットIDを表示してくれる、死ぬほど便利なコマンド。

ローカルとステージングの状況を確認

ローカルの変更と、ステージングに上がっている変更を確認する。

git status

リモートとの差分を確認する

git diff --name-only origin/branchName

-name-only:ファイル名のみを表示する。これを付けないと各ファイルの中身まで出力されるので、基本つける。

git diff はバリエーションが結構ある。

  • ローカルとリモートのDiff:git diff
  • ステージングとリモートのDiff:git diff –cached
  • リモート同士のブランチ比較:git diff origin/master origin/branchName
  • リモート同士のタグ比較:git diff origin/tag1 origin/tag2
  • ファイル単体のDiff:git diff — [filePath]

git diff と git statusの違い

git statsu:ローカルとステージング、つまりは自身のPC内での変更を確認する

git diff:自身のPCとリモートの変更を確認する

ブランチ

ローカルブランチの確認

git branch

-rオプション

リモートにあるブランチの一覧を表示する

-vvオプション

-vvオプションを指定すると、どのリモートブランチと紐づいているかも合わせて確認できる。

リモートと同期されているブランチは [origin/xxx] といった形式で表示される。

ただし、新規ブランチとして checkout したばかりで、push 先(upstream)が指定されていない場合は、checkout時に指定したリモートブランチが表示される。このとき、upstream自体はまだ設定されていない。

ブランチを切り替え

git checkout branchName

ブランチを作成

ブランチを切り替えるときのコマンドに『-b』を付けることで、指定したブランチ名が無ければ新規作成される。

git checkout -b feature/branch-name origin/remote-branch
git checkout -b [ローカルに作成するブランチ名] [origin/元にしたいリモートブランチ名]

checkout は、リモートブランチに対しても実行できる。例えば以下のコマンドでは、直接リモートにチェックアウトしてしまう。

git checkout origin/branch-name

detached HEAD となり、commit が保存されなかったり、リモートに直接プッシュしてしまう危険がある。

また、以下のようにリモートのブランチ名をそのままローカルで使用することも危険。

git checkout -b new-feature origin/new-feature

プッシュする際、修正中のローカルブランチと同名のリモートブランチが存在すると、そこに直接プッシュしてしまうため。

例えば以下のように、ローカルブランチとリモートブランチの命名規則を変えれば、間違えてプッシュしたとしても、feature/[案件番号]というリモートブランチが新規作成されるだけで済む。

git checkout -b feature/[案件番号] origin/new-feature

ただしこれだと、ブランチ名から機能内容が分からないという欠点もあり、開発者を悩ませるポイントでもある。

ブランチ名変更

リネームしたいブランチにチェックアウトしてから以下コマンド

git branch -m newBranchName

ブランチ削除

git branch -d localBranchName

Appendix

CurrentとIncoming

VSCodeなどで資源をマージする際、コンフリクトが起こると自分の修正とリモートの修正のどちらを優先するか聞かれる。

このとき、Current (現在の変更)とIncoming (入力側の変更)と表示されるが、どちらがどちらかよくわからない。

Incomingはorigin、つまりリモート側の変更で、 Currentは自身、つまりローカルの変更。

ローカルリポジトリとリモートリポジトリ

git push origin master

上記のコマンドを見たとき、originとかmasterとか、何をやっているのかよくわかっていない人はまずこの概念を理解する。

  • ローカルとリモートが対になっている
  • originはリモートリポジトリのデフォルトの名前
  • masterはデフォルトのブランチ名
  • gitで指示するのはリモートの場所、送信元は自分の今いるブランチとなる

上記から改めて最初のプッシュコマンドを文字にすると、『ローカルリポジトリ(自分のPC)の変更を、リモートリポジトリ(GithubとかGitLabとか)のmasterブランチにプッシュする』となる。

gitコマンドの送信元は自身のPCのカレントディレクトリとなるため、コマンドでは出てこない。gitコマンドでは、リモートの情報だけ入力するものと理解しておく。

masterは特別なもののように思えるが、ただのデフォルトのブランチ名。自分で作るブランチと特に変わりはないので、変な誤解をしないようにする。

originも同じくデフォルトのリモート名なので意識する必要はない。リモート名をorigin以外の名前で複数管理することは少ないので、おまじない程度に考えておけばよい。

タグから復元する

タグは、今のHistoryとは全然違う位置にいるので、もちろんPULLなんかはできない。

リモートにあるタグを指定して、ローカルの新しいブランチとして使用する。

git fetch –tags  // リモートのタグ一覧を取得
git checkout <tag名>  // タグを指定してチェックアウト

この断面で検証および新たに修正を加えて、masterにマージすれば、pullと同じような動きになる。(pullは、fetchとmergeをしているに過ぎない)

インシデント

git diff に反映されない

git diff で修正差分を見ようとしたときに、ローカルで追加したファイルが反映されない。

これは、git diff では追跡対象として認識されているファイルいか表示しないため。新規ファイルは追跡対象と認識されずにgit diff では表示されないことがある。

git add してステージングに上げればgit diffでも表示されるようになる。

ステージングに上げたくない場合は、git status で確認する。これで見ると、新規ファイルは『Untracked files』というくくりで、まだgitで追跡されていないことがわかる。

コメント

タイトルとURLをコピーしました