2014/03/06

git

使い初め、基本のコマンドをメモする

■config proxy,sslなど
git config --global http.proxy http://proxy:8080
git config --global http.sslVerify false
接続の一覧:
git config --list


■git 一部ファイルだけ対象にする
Gitで「あのリポジトリのこのファイルだけをcloneしたい」という場合に、Sparse checkoutという機能があることを知ったのでそのメモです。
厳密には、一部のファイルのみをcloneするわけではなく、他のリポジトリをまるごとcloneした後に任意のファイルのみをチェックアウトする機能なのですが、目的に近い結果を得ることはできそうです。
git config core.sparse-checkout true
その後、「.git/info/sparse-checkout」へ対象とするファイル(または除外するファイル)を追加し、ツリーを読み込み直せば対象のファイルのみがチェックアウトされます。
echo 対象とするファイル>.git/info/sparse-checkout
echo !除外するファイル>.git/info/sparse-checkout

■リモートの削除・リネーム
git remote rename pb paul

■削除取り戻す
git checkout HEAD -- ファイル名

■add 複数
git add . はワーキングツリーに新規作成された、もしくは変更されたファイルをaddします。つまり、rmコマンドなどで削除されたファイルはaddされません。
git add -u は一つ前と最新のステージを比較して、変更があった部分のみをaddします。つまり、新しく作られたファイルはaddされません。
git add -A は git add . と git add -u を足したものですから、新規作成、修正、削除といった全てのファイルをaddします。
==ー>たまにうまくいかない時がある。。えん??
git add dir
git add -n *.txt 実際には実行せずにインデックスに追加されるファイルを調べる
git add -f file.txt 無視されるファイルを強制的にインデックスに追加する


■push
リモートリポジトリとローカルのどのブランチをリモートのどのブランチに送信するかを指定して
git push REPOSITORY LOCAL_BRANCH:REMOTE_BRANCH
git remote-->リモートリポジトリ
git clone で作成されたリポジトリである場合、
 デフォルトとして 送り先のリポジトリは git clone の元のリポジトリ、
 送信するブランチはローカルとリモートのリポジトリの両方で 共有しているブランチ全てになっているので
 次のように省略できる。
git push
プルとは、git fetch を自動化した操作です。このコマンドを実行すると、リモートリポジトリからブランチをダウンロードし、直ちにそれを現在のブランチにマージします

■git fetch
ローカルリポジトリに統合することまでは行いません
git fetch は、リモートリポジトリからローカルリポジトリにブランチをインポートするコマンドです。
インポートされたブランチは、これまで学習してきた通常のローカルブランチとしてではなく、リモートブランチとして保存されます。

git fetch <remote> <branch>

フェッチとは、他の開発者の作業内容を確認する場合に行う操作です。
フェッチされたブランチはリモートブランチとして表現されるため、ローカルな開発作業には全く何の影響も与えません。
通常の git checkout コマンドや git log コマンドを使用してブランチの内容を確認することができます。
リモートブランチに含まれる変更が承認可能な内容である場合、通常の git merge コマンドを使用してそれをローカルリポジトリにマージすることができます。
従って、SVN とは異なり、ローカルリポジトリをリモートリポジトリと同期する操作は、実際にはフェッチとマージの二段階の操作です

■git remote
git commit a b c -m "message"

■git remote
git remote は、他のリポジトリとの接続の作成、内容確認、削除を行うコマンドです。
リモート接続とは、他のリポジトリへのダイレクトリンクではなく、ブックマークのようなものです。
他のリポジトリにリアルタイムアクセスを行うのではなく、非短縮 URL への参照として使用可能な短縮名称として機能します
Git は、各々の開発者に対して独立した開発環境を提供するように設計されています。
従ってリポジトリ間で情報が自動的に移動することはありません。
開発者は、手作業で中央リポジトリのコミットをローカルリポジトリにプルしたり、手作業でローカルなコミットをプッシュすることにより中央リポジトリに戻したりする必要があります。
git remote はそのような「共有操作」コマンドに対して URL を引き渡す簡便な方法を提供するコマンドです。

git remote add <name> <url>
==>name でurlを使えるようなる

git cloneの時、自動的にoriginのremoteを作成する


■detached HEAD 状態???何の状態??

■git pull
--rebase-->単なるgit pull コマンドよりも --rebase フラグを指定して git pull コマンドを実行する方が、
SVN における svn update コマンドに近いと言えます。
私の変更作業は皆が変更を完了したものをベースとして行いたい」と言うに等しいものであり、
開発者の多くはマージよりリベースを選択する傾向があります。

git config --global branch.autosetuprebase always


新規に作成したリポジトリをcloneしてローカルリポジトリを作成し、そのローカルリポジトリ上でpushすると下記のようなログが出力されることがあります。

$ git push
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
Everything up-to-date

これは、リモートリポジトリ上にまだmasterブランチが作成されていないためです。push時の引数が省略された場合、デフォルトではリモートリポジトリとローカルリポジトリの双方に存在するブランチが対象となります。そのため、リモートリポジトリに存在しないブランチをpushする場合は、リポジトリとブランチを明示的に指定する必要があります。

$ git push -u origin master

一度pushを実行するとmasterブランチが作られるため、以降のpushではリポジトリとブランチの指定を省略することができます。

■Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
■non-fast-forward updates were rejected

It looks, that someone pushed new commits between your last git fetch and git push. In this case you need to repeat your steps and rebase my_feature_branch one more time.
git fetch
git rebase feature/my_feature_branch   git merge origin/master
git push origin feature/my_feature_branch
you did not fetch the remote changes before the rebase or someone pushed new changes (while you were rebasing and trying to push


Changed but not updated
==>変更したがインデックスに追加もコミットもしていない場合