💁‍♂️

GITのわかりにくいところまとめてみた

に公開

背景

gitのコマンドがいまだにしっかり使いきれていない気が。。
整理とアウトプット用に個人的に理解が怪しいところを備忘録的にまとめてみました。

git add/push/commit

  • add:資産をローカルのステージング上にアップ
  • commit:addした資産がローカルリポジトリに反映される
  • push:commitした資産をリモートリポジトリに反映する

各種コマンドを取り消す方法

git commit を取り消す

git reset --soft HEAD

git resetで直前のcommitを取り消すことができる
--soft :オプション。

git add を取り消す

git reset HEAD

直前のaddを取り消すことができる

各種コマンド解説

自分が作業している場所を示すポインタ

HEAD^は「一つ前のコミット」を表す。

reset

特定の時点までファイルを巻き戻せる。

--soft

HEADの位置のみ巻き戻す
Ex:git reset --soft HEAD^:直前のコミットを消す

--mixed

HEADの位置、インデックスを巻き戻す
オプションなしでも同じ結果になる
例:git reset HEAD→インデックスの変更(addしたもの)を消す

--hard

HEADの位置、インデックス、作業ディレクトリを巻き戻す
Ex:git reset --hard HEAD^:直前のコミットまですべて消す

-f

特定の操作を強制的に実行する。
使用は慎重に。。

git fetch/pull

  • fetch : リモートの資産を引っ張ってくる。マージはなし。

  • pull : リモートの資産を引っ張ってくる。マージあり。

違いはマージまでするか否か。

rebase

指定コミットを作り直して、ログをキレイにできる。

マージとの違い

  • マージ:過去のコミットを全て一つの新しいコミットとして、マージ先にマージされる。

  • リベース:マージ先のブランチの最新コミットにへリベース分のコミットが移動する(過去コミット履歴を含めた状態で)

コミットされたすべての変更を指定先のブランチでも再現できる点でマージとの差別化が可能。

履歴が直線的になるため、ログがきれいなまま保つことができる。

git revert

特定のコミットの変更を取り消す新しいコミットを作成する。

使用シチュエーション

過去の特定のコミットの変更を取り消したいが、その取り消し自体の履歴も残したい場合。

git resetとの使い分け

リモートのコミットを取り消したい場合は、revertのみしか使用不可。
resetではリモート分は消すことができない。

git remote add origin の origin について

origin とは何か?

リモートリポジトリに対するデフォルトの名前(エイリアス)。ローカルのGitリポジトリが、どのリモートリポジトリと連携しているかを示す。

一般的に、GitHubや他のリモートリポジトリサービスからプロジェクトをクローン(git clone)すると、そのリモートリポジトリは自動的に origin という名前で登録される。

資産(リポジトリ)ごとに origin が存在する

各リポジトリごとにリモートリポジトリが設定されており、そのデフォルトのエイリアスとして origin が使用される。

各ローカルリポジトリはそれぞれ異なる origin を持つことができる。異なるリポジトリに対して異なる origin が設定され、それぞれ異なるリモートリポジトリと連携される。

複数のリモートリポジトリを追加可能

1つのリポジトリには、origin 以外にも複数のリモートリポジトリを設定できる。これにより、例えばプライベートなリモートと公開されているリモートの両方にプッシュすることが可能になる。

感想

普段gitGraphを使用、中で実際どのようなコマンドが走っているか理解が足りていなかったと改めて痛感しました。。

Discussion