頭脳一式

人の記憶なんて曖昧なもの。すべての情報を頭に記憶するなんてナンセンス。困ったらここに来ればいいじゃん?というスタンスで最強のナレッジベースを目指すブログ

【Git】気づいたこと・分かったこと

触ってて気づいたこと・分かったことをまとめます。

チェックアウトするとファイルのタイムスタンプが、チェックアウトした日時に変わる。

なんでチェックアウトする度にタイムスタンプが変わるんだろう…って思ってたけど分かった気がする。
git checkout [branch]ってブランチを切り替える作業のことだけど、これってつまり「リポジトリから対象のブランチのファイルを取り出して上書きする」ってことだからタイムスタンプが変わるんだ!と気づいた。

リモートリポジトリに複数のブランチが在っても、クローン時はmasterブランチしか作成されない

例えば、以下のようにリモートリポジトリにはmasterブランチとdevelopブランチが在るけど、まだローカルリポジトリが無い場合。

リポジトリ masterブランチ developブランチ
リモートリポジトリ
ローカルリポジトリ × ×

この状態でgit cloneしてもmasterブランチしか取り込まれない。

XXXXX@DESKTOP-AQBVPOG MINGW64 /c/workspace2
$ git clone http://localhost:8888/group1/prj1.git
Cloning into 'prj1'...
remote: Enumerating objects: 34, done.
remote: Counting objects: 100% (34/34), done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 34 (delta 3), reused 0 (delta 0)
Unpacking objects: 100% (34/34), done.

↑クローン完了。
↓ブランチの一覧を表示してみる。

XXXXX@DESKTOP-AQBVPOG MINGW64 /c/workspace2/prj1 (master)
$ cd prj1/
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master

実行結果を確認するとローカル側はmasterブランチしかない。
けどリモート側にはdevelopブランチが在ることが確認できる。
つまりリモートのリポジトリ情報(履歴情報)は取得できているわけだ。
なのでdevelopブランチが欲しければ以下のコマンドを実行すれば良い。

XXXXX@DESKTOP-AQBVPOG MINGW64 /c/workspace2/prj1 (master)
$ git checkout -b develop origin/develop
Switched to a new branch 'develop'
Branch 'develop' set up to track remote branch 'develop' from 'origin'.

↑developブランチの作成完了。
↓ブランチの一覧とlsの結果を見てみる。

XXXXX@DESKTOP-AQBVPOG MINGW64 /c/workspace2/prj1 (develop)
$ git branch -a
* develop
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master
XXXXX@DESKTOP-AQBVPOG MINGW64 /c/workspace2/prj1 (develop)
$ ls
20181231.md  README.md

ふむ。問題なさそうだ。

チェックアウト時にuse "git push" to publish your local commitsというメッセージが表示される場合

ローカルブランチをチェックアウトしたとき、たまに以下のようにuse "git push" to publish your local commitsと表示されることがある。

XXXXX@DESKTOP-AQBVPOG MINGW64 /c/workspace2/prj1 (master)
$ git checkout develop
Switched to branch 'develop'
Your branch is ahead of 'origin/develop' by 1 commit.
  (use "git push" to publish your local commits)

これはリモートリポジトリの追跡ブランチに対してローカルリポジトリのブランチがコミットされている場合に表示されるメッセージで、
この場合、ローカルリポジトリのブランチは、リモートリポジトリの追跡ブランチよりも一歩先を行っていることを指します。
この状態であればgit pushを行ってもコンフリクトが発生することはありません。
但しこのメッセージはgit fetchしている前提。git fetchしていない場合はローカルリポジトリのブランチの方に変更があってもこのメッセージは表示されない。