Git メモ(VisualStudio)

VisualStudioでは、
チェックアウト、マージなど
表示>Git 変更
表示>Git リポジトリ
どちらからでも実行できるが、Git リポジトリは不安定なことが多い。

既存のソリューションにGitに追加

ウィンドウ右下>ソース管理に追加>Git
あるいは
ソリューション右クリック>Gitリポジトリの作成

・既存のリポジトリにソリューションの追加

新規作成したソリューションをリポジトリに保存すればいいので、
Git 変更>Git リポジトリの作成
リポジトリ作成後、
ファイル>スタートウィンドウ>新しいプロジェクトの作成
からソリューションを追加すればいい。

コミット

Git 変更>すべてをコミット
(保存していない場合、その状態でコミットされる)

元に戻す(Revert)

Git リポジトリ>ローカル履歴の上で右クリック>元に戻す。

特定のコミットを消す。その履歴自体をコミットされる。

//1、//2、//3
をコミットして、2をRevertした場合。

編集場所が連続していたりすると競合する。

リセット(Reset)

ある時点のコミットに戻す。

Git リポジトリ>ローカル履歴の上で右クリック>リセット>
・変更を保持(–mixed)
・変更を削除(–hard)

–mixedはHEADの位置、インデックスのみ修正しファイルはそのまま。

ブランチ作成

Git リポジトリ>ローカル履歴の上で右クリック>新しいブランチ

ブランチの切り替えはウィンドウ右下、あるいはGit 変更から。

ブランチツリー

・ブランチはコミットへの参照。
・コミットは親への参照を持っている。
・マージすると親を複数持つ。

masterブランチで、
//1、//2、//3
をコミット。

//1からfeat1ブランチ。
//2からfeat2ブランチ。

feat1に//4を追加しマージ。
feat2に//5を追加しマージ。

ブランチのマージ

featブランチをmasterブランチにマージする場合。

masterブランチをチェックアウトする。
featブランチ右クリック>featをmasterにマージする。

競合した表示。

マージエディターで競合している部分が、赤くなっているので、
チェックボックスを選択>マージを許可。

ブランチのリベース

分岐したブランチをもと(master等)の先頭にくっつける。

masterブランチで、
//1、//2
をコミット。

//1からfeatブランチを作成。

featに//3をコミット。

・featをmasterにリベース。

・マージの場合。

ちなみに、リベースのとき//1からfeatブランチを作成しているが、//2からfeatブランチを作成しリベースすると以下の通り。

マージとリベースの違い

マージは、masterとfeatを共通の親とするコミットを作るが、リベースはmasterを親としてfeatを付ける。VisualStudioでの画面の場合。

・masterブランチ
1コミット
2コミット
featブランチ作成
4コミット

・featブランチ
3コミット

・masterブランチをチェックアウトし、マージとリベース

マージ

リベース

チェリーピック

分岐したブランチの特定コミットをもと(master等)の先頭にくっつける。

masterブランチで、
//1、//2、//3
をコミット。

//1からfeatブランチを作成し、
//4、//5
をコミット。

masterをチェックアウト。

featブランチの
//4
を右クリック>チェリーピック。

リモートリポジトリ

ローカルリポジトリ作成時のダイアログでGitHubにリモートリポジトリが作成される設定になっている。

・ブランチの種類

ブランチには、
1.ローカルブランチ
2.トラッキングブランチ
3.リモートブランチ
がある。

ローカルブランチ、トラッキングブランチはローカルに存在していて、リモートブランチに変更があってもフェッチするまでトラッキングブランチは自動で変化しない。

例えば、
1.master (ローカル)
2.origin/master (ローカル)
3.master (GitHubなど)

ローカルブランチの追跡対象

1はリモートと同名(例えばmaster)であっても追跡対象を持っても持たなくてもいい。VisualStudio上では持っていると緑色の矢印がある。

Git 変更>ブランチ名プルダウン>右クリック>リモートブランチ名>チェックアウト
からローカルブランチを作成すると追跡対象を持つローカルブランチとなる。

また、
Git リポジトリ>ローカル履歴>右クリック>新しいブランチ
から作成すると追跡対象がないローカルブランチになるが、その後プッシュした時点で追跡対象を持つ。

標準では追跡対象を持っている。

フェッチ

フェッチを使うとリモートブランチの情報を取得してトラッキングブランチが最新になる。ちなみに、VisualStudioでフェッチは、どのローカルブランチをチェックアウトしていても全てのトラッキングブランチが最新になる。

プル

フェッチ、マージを同時に行う。

プルを実行すると、チェックアウトしているローカルブランチだけマージまで実行される。その他のチェックアウトしていないローカルブランチもフェッチは実行される。

プッシュ

プッシュはブランチ単位で行う。

Git リポジトリ>ローカルブランチ>右クリック>プッシュ
あるいは、
Git 変更>リポジトリ名プルダウン>右側にあるプッシュボタン

プッシュ実験

リモートが追跡対象の場合

・ローカルで新しいブランチを作成してプッシュ

リモートに同名のブランチが存在しない場合、自動でリモートにfeatブランチが作成される。

・ローカルブランチのコミットを進めてプッシュ。

これは通常処理なので問題ない。

・リモートブランチのコミットが進んでいる状態でプッシュする

エラーになるので、
プル>プッシュ(フェッチ>マージ>プッシュ)
で処理する。

・ローカル、リモートそれぞれコミットが進んでいる場合。

エラーになるが、競合しない個所なら
プル>プッシュ(フェッチ>マージ>プッシュ)
で処理できる。

・他のローカルからリモートにブランチがプッシュされていて、ローカルで新しく同名ブランチを作成してプッシュする。(追跡対象になっておらずブランチの名前が一緒なだけ)

ローカルのコミットが進んでいるのはOKだが、リモートのコミットが進んでいるとNGになる。前述と同じ結果。

この場合、ローカルとリモート別々にブランチを作成していて追跡対象になっていないので、
プル>プッシュ(フェッチ>マージ>プッシュ)
とする。前述と同じ結果。

・他のローカルから既にリモートにブランチがプッシュされていて、
ローカルで新しく同名ブランチを作成してフェッチする。

フェッチはトラッキングブランチを更新するだけなので、ローカルブランチと
トラッキングブランチの状態が違うだけで何もおきない。

・ローカルリポジトリでリセットしてリモートにプッシュ。

ローカルリポジトリのコミットの方が前にあるのでプッシュできない。

・ローカルリポジトリで元に戻して(特定のコミット削除)プッシュ。

元に戻す(Revert)は削除の処理もコミットされるので、プッシュできる。

リモートリポジトリ削除

Git リポジトリ>(remotes/origin以下の)リポジトリ>右クリック
リモートブランチを削除

デフォルトブランチは削除できない。

エラー対処

ときどき、インデックスファイルへ書き込めない、チェックアウトできないなどのエラーが発生する。その場合は、一度.gitフォルダごと消してしまう。チェックアウトするとソースファイル自体が書き換わっているので、最新の状態にして.gitフォルダを消しても問題はない。