- 投稿日:2019-05-29T17:41:23+09:00
Git リモートとのやりとり 自分用メモ
リモートからの情報取得
リモートの表示
git remote
対応するURLを表示
git remote -v
fetch用、push用で2つ出てくるリモート詳細情報を表示
git remote show <リモート名>
git remote show origin
リモートリポジトリの追加
最初のリモートリポジトリを作るのと同じ動き
リモートリポジトリは複数登録できる
git remote add <リモートリポジトリ名> <リモートリポジトリURL>
このコマンドの本質は、URLにエイリアスをつけること。Gitコマンドの中で、リモートリポジトリ名でURLにアクセスできるようにしているだけリモートからの情報取得(フェッチ、プル)
「他人が加えた変更をローカルに持ってくる」という場面
フェッチ("取り出す")
リモートリポジトリからローカルリポジトリに情報を持ってくる
自分の手元(ワークツリー)に持ってくるわけ ではない
ローカルリポジトリremotes/<リモート名>/<ブランチ名>
という場所に保存される
git fetch <リモートリポジトリ名>
例:リモートリポジトリだけに変更を加えるため、GitHubからhome.indexというファイルを追加してみる。
git fetch origin
で、リモートリポジトリの情報をローカルリポジトリのremotes/origin/masterに保存するこの時点では、ローカルリポジトリ/masterには何の変更もない。
ただremotes/origin/masterという所定の場所にリモートリポジトリの情報を持ってきただけ。内容を確認するには、ブランチを切り替える必要がある。
git checkout origin/master
lsしてみると、GitHub上で追加したファイルが表示されている。いったんローカルリポジトリに戻る(
git checkout master
)
フェッチしてきた情報をワークツリーに、反映させるにはマージ(統合)を行う必要がある
git merge origin/master
「ローカルリポジトリに保存した、originリモートのmasterブランチ情報を、現在いるブランチ(この場合はローカルのmaster)に統合する」
(リモートリポジトリから直接持ってきているわけではなくフェッチによってローカルリポジトリに保存した情報を使うため、
git merge origin master
ではなく、git merge origin/master
となる。)
lsしてみると、GitHub上で追加したファイルがmasterにも反映されている。フェッチとマージを一気にやりたいときは、プル
git pull <リモート名> <ブランチ名>
※git pull origin master
については、git pull
と省略できる
git fetch origin master
+git merge origin/master
= git pull origin master
= 「指定したリモートリポジトリからローカルリポジトリに情報を持ってきて、現在いるブランチをその情報で上書きする」???フェッチとプルの使い分け
プルの注意点
ローカルの統合先は、あくまでも現在自分がいるブランチ**(同じ名前のブランチ、とかではない)
慣れるまでは、フェッチ + マージ がよい。
リモート名の変更・削除
変更
git remote <旧リモート名> <新リモート名>
git remote rename tutorial new_tutorial
削除
git remote rm <リモート名>
rm => "remove"
リモートリポジトリそのものが削除されるわけではない
(GitHubには表示されている)
- 投稿日:2019-05-29T16:49:30+09:00
Git 操作取り消しメモ 自分用メモ
ファイルへの変更を取り消し
git add、git commitなどをしておらず、単純にファイルへの変更を取り消したい場合
= ローカルリポジトリの状態を、ステージの情報と同じにする
git checkout ファイル名
git checkout ディレクトリ名
git checkout .
全ファイルについての変更を取り消すステージに追加した(git add)変更を取り消し
= 最新のコミットを参照して、ステージの内容を上書きしている
git reset HEAD ファイル名 or ディレクトリ名 or .
*git checkout --
と違い、ローカルリポジトリには影響しない。
ローカルリポジトリの変更も取り消したい場合は、git reset HEAD後に、git checkout --
するコミットをやり直す
誤ったコミットをしてしまった場合。
正しい変更を加えた状態でgit add .
後
git commit --amend
= 最新のコミットを、現在のステージの状態で上書きするPushしてからこれやると大変なことになる。
(Pushの内容を直したい場合は、普通にgit commit
してPushする???)
- 投稿日:2019-05-29T12:34:02+09:00
gitで「新規ファイル」「削除ファイル」のみをaddする
はじめに
git add -u .
とやると、「更新ファイル」のみadd
してくれますが、
「新規ファイル」「削除ファイル」のみと言うオプションは用意されていません。(たぶん)やりたいときは、シェル芸で行きましょう。
git status -s(--short)
が便利です。
http://sohtaro.com/blog/2017/05/28/git-status-short/削除ファイルのみadd
git status | grep deleted | awk '{print $2}' | xargs git addまたは
git status -s | grep ' D ' | awk '{print $2}' | xargs git add追加ファイルのみadd
git status -s | grep '?? ' | awk '{print $2}' | xargs git add追加ファイルの場合は普通に
git status
とやるとファイル別のgrep
がしづらいので、
git status -s
が必須ですねー。では、シェル芸で素敵なgitライフを!
- 投稿日:2019-05-29T10:09:07+09:00
windows git diff 変更差分が全範囲になる(おかしい)
文字コードの違いで、ファイルを編集したときにgit diffがファイル全体にかかってしまう現象がある。コマンドで修正参考記事
コマンドgit config --global core.autoCRLF false
- 投稿日:2019-05-29T10:09:07+09:00
windows git diff 変更差分が全範囲になる(文字コード)
文字コードの違いで、ファイルを編集したときにgit diffがファイル全体にかかってしまう現象がある。git bashでコマンドを入力して修正参考記事
コマンドgit config --global core.autoCRLF false
- 投稿日:2019-05-29T10:09:07+09:00
windows git diff 変更差分が全範囲になる
文字コードの違いで、ファイルを編集したときにgit diffがファイル全体にかかってしまう現象がある。コマンドで修正参考記事
コマンドgit config --global core.autoCRLF false
- 投稿日:2019-05-29T08:13:49+09:00
【目的別】Github手順書【初心者向け】
当記事の目的
以下の悩みを解決
- GitHubのコマンドが書いてあるページはたくさんあるけど、現状に合わせてどう組み合わせて使ったらいいか分からない
- はじめてGitHub触るけどぶっちゃけ何から手を付けたらいいか分からない
前提条件
- 構成管理システムの概念的な話は一切触れません
- GitHubのコマンドをインストール済みで、Linux上でGitHubにアクセスすることを想定
- fetchとは何か、mergeとは何か、ローカルリポジトリとは?originとは?みたいな話は別のまとめを見てください。気が向いたら参考ページ張ります
- 筆者がGitHubに慣れていくにつれ加筆されていきます
Windows環境の人は、インストールについてはそれなりに手間なので、【Windows】Gitの環境構築を参考にしてください。Linux環境の人はデフォルトでインストールされていることがほとんどですが、なければ
sudo apt-get install git
してください。インデックスを見ながら、自分に合った目的をお探しください
GitHubコマンド手順
case1 : 開発チームに入ったぞ!早速ローカルのフォルダにリモートのソースコードをクローンしてこよう!
手順
Clone or downloadをクリックし、表示されたURLを控える(
https://github.com/自分のリポジトリ.git
とする)ローカルリポジトリを作成したいフォルダに移動
$ git clone https://github.com/自分のリポジトリ.git -b branch_name local_folder_name
- branch_nameは、リモートのどのブランチをクローンするか指定
- local_folder_nameは、作成するローカルリポジトリの名称(デフォルトは
リモートURL-ブランチ名
)ユーザID、パスワード入力を求められるため、GitHubにログインする際のユーザ名とパスワードを入力する
詰まりそうな点
- 社内でエンタープライズのGitを利用している場合や、セキュリティ意識の高い方で2段階認証設定をしている場合は、GitHubホームページ上でアクセストークンを発行して、PWの代わりに使う必要がある。参考:Githubの2段階認証を実施してgitコマンドが使えないときにやったこと
case2 : ブランチを分けてカスタマイズをするぞ!まずはブランチを分けよう!
手順
- gitクローンされた、ローカルリポジトリ下にいることを確認
$ git branch
でブランチの状態を確認shun@shun-VirtualBox:~/xxx/yyy$ git branch * original_branch_name
$ git checkout -b new_branch_name original_branch_name
で新ブランチ作成
- new_branch_nameは、作成する新しいブランチの名称
- original_branch_nameは、基にするローカルのブランチ名称
- リモートからチェックアウトする場合は
$ git checkout -b branch_name origin/branch_name
- origin/branch_nameがリモート、branch_nameがローカル
$ git branch
でブランチの状態を確認shun@shun-VirtualBox:~/xxx/yyy$ git branch original_branch_name * new_branch_namecase3 : カスタマイズが終わったから、分岐したローカルブランチに対してコミットしよう!
- gitクローンされた、ローカルリポジトリ下にいることを確認
$ git status
でチェックアウトしてからの変更情報を確認
deleted: moved_file.py
は、消去されたファイル(実際にはファイル移動)modified: changed_file.py
は、変更が加えられたファイルdeleted: deleted_file.py
は、消去されたファイルnew_file.py
は、新規で作成されたファイルnew_folder/moved_file.py
は、新規で作成されたファイル(実際にはファイル移動)shun@shun-VirtualBox:~/xxx/yyy$ git status ブランチ new_branch_name Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: moved_file.py deleted: deleted_file.py modified: changed_file.py 追跡されていないファイル: (use "git add <file>..." to include in what will be committed) new_folder/moved_file.py new_file.py no changes added to commit (use "git add" and/or "git commit -a")
- この状態を想定して、まずはaddしていく
$ git add moved_file.py
$ git add deleted_file.py
$ git add changed_file.py
$ git add new_folder/moved_file.py
$ git add new_file.py
$ git status
でaddした後の状態を確認
- それぞれがrenamed, modified, deleted, new fileとしてコミット予定の発射台に乗っていることを確認する
shun@shun-VirtualBox:~/xxx/yyy$ git status ブランチ new_branch_name コミット予定の変更点: (use "git reset HEAD <file>..." to unstage) renamed: moved_file.py -> new_folder/moved_file.py modified: changed_file.py deleted: deleted_file.py new file: new_file.py Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) 追跡されていないファイル: (use "git add <file>..." to include in what will be committed) no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -m 'message'
でコミットを実行
- messageは任意のコミットメッセージを入力
詰まりそうな点
- 間違えてaddして、取り消したい場合は
$ git reset HEAD added_file
を実行。$ git reset HEAD
までは固定。renameの場合は、変更前のファイルと変更後のファイルに対して両方resetする必要がある- 一括でadd取り消したい場合は
$ git reset HEAD
- commit時にメッセージは必須で、-m以降を入力しないとvimが開いてしまう
case4 : ローカルのブランチにコミットしたぞ!リモートブランチにも反映しよう!
手順
$ git push origin new_branch_name
- originは固定値
- new_branch_nameはリモートに反映させたいブランチ名称
- new_branch_nameがリモートにない場合は、新規に作られる
詰まりそうな点
- リモートに同一名称のブランチがない場合は、new_branch_nameが新規作成される
case5 : ローカルのブランチを、リモートのブランチの状態に合わせたい!
ローカルで色々更新したんだけど、やり直したい場合を想定。同一名称のリモートブランチに別のマージが入っている場合は、以下のやり方ではなく素直
$ git pull origin develop
でプルをする。手順
$ git fetch origin
- [new branch]となっているブランチは、ローカルには無いけどリモートに存在するブランチ
- original_branch_nameは、ローカルにもリモートにも存在するブランチ
shun@shun-VirtualBox:~/xxx/yyy$ git fetch origin remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (1/1), done. From https://github.com/自分のリポジトリ * [new branch] new_branch -> origin/new_branch c5996a4..47d6cc0 original_branch_name -> origin/original_branch_name
$ git reset --hard origin/original_branch_name
git reset --hard origin/
までは固定、original_branch_nameは、合わせたいブランチ名称- fetchしてきたリモートのブランチを、ローカルの同一名称ブランチに反映させますよ!という命令
$ git checkout original_branch_name
で、reset後のブランチに移動する$ git clean -df .
で余分なファイルを削除する
- ここまでの命令では、あくまで更新情報/新規作成情報のみをリモートから取得できるが、不要ファイルの削除をしてあげる必要がある
- ここまで実行することで、リモートブランチと全く同じ状態になる
詰まりそうな点
- fetchって何?と思う人は、リモートリポジトリとローカルリポジトリの中間層があると思えばよい。そこを「origin」と呼んでおり、リモートをoriginに反映させる処理をfetchと呼ぶ。originを使ってローカルリポジトリをどうするかが、reset以降のコマンド【入門者向け】Gitのfetchコマンドについて図を用いて解説
case6 : 1つ1つaddするのめんどくさいから一括でaddしたい!
手順
$ git add -u
- トラッキング(バージョン管理)されているファイルについて、すべてaddされる
- つまり、「削除されたファイル」、「変更されたファイル」はaddされ、「新規作成されたファイル」はaddされない
$ git add -A
- トラッキング(バージョン管理)されていないファイルも含めて、すべてaddされる
- つまり、「削除されたファイル」、「変更されたファイル」、「新規作成されたファイル」がaddされる
$ git add .
- カレントディレクトリ以下に対して、
$git add -A
を実行するcase7 : プルリクも承認されたし、不要ブランチを削除するぞ!
手順
まずはローカルのブランチから削除していく
% git branch
- まずは現在のブランチの状態を確認
- developにマージが完了しており、updateDevelopを削除したいとする
shun@shun-VirtualBox:~/workspace/global$ git branch develop * updateDevelop
$ git checkout develop
- このままでは削除できないので、developブランチに移動する
マージが完了している場合
$ git branch --delete updateDevelop
- 不要ブランチを削除する
マージが完了していないが削除したい場合
$ git branch -D updateDevelop
- 不要ブランチを
マージをせずに
削除する- ※これまで反映したcommitは削除されるので注意
次にリモートブランチを削除する
% git branch --remote
- まずは現在のリモートのブランチの状態を確認
- ローカルでは削除したupdateDevelopが残っている
shun@shun-VirtualBox:~/workspace/global$ git branch --remote origin/HEAD -> origin/master origin/develop origin/updateDevelop
$ git push --delete origin updateDevelop
- 不要ブランチを削除する
もしくは以下のコマンドでも可能
$ git push origin :updateDevelop
最終的なブランチの状態を確認する
$ git branch --all
shun@shun-VirtualBox:~/workspace/global$ git branch --all* develop remotes/origin/HEAD -> origin/master remotes/origin/develop remotes/origin/developcase8 : 親ブランチにされたコミットを、今の作業ブランチに反映させたい!
手順
developブランチで作業している際に、masterブランチにコミットが入りました。そんな時はrebaseを使います。
ブランチの状態は以下の通りで、origin/maseterにコミットが加えられている
shun@shun-VirtualBox:~/workspace/global$ git branch -a master* develop remotes/origin/HEAD -> origin/master remotes/origin/master remotes/origin/develop
$ git checkout -b master origin/master
- まずはローカルに、masterブランチをcheckoutします
$ git pull origin
- リモートmasterブランチへの反映を、ローカルのmasterブランチにも行います
$ git checkout develop
- 元々作業していたdevelopブランチに移動します
$ git rebase master
- masterブランチへのコミットを、現在の作業ブランチに反映ささせます
現時点のブランチの状態は以下の通りで、ローカルのmasterとdevelopは同じ状態
shun@shun-VirtualBox:~/workspace/global$ git branch -a master develop* remotes/origin/HEAD -> origin/master remotes/origin/master remotes/origin/developリモートにも反映させる場合は、プッシュをしてあげればOK
$ git push origin develop
case9 : リモートブランチに反映された内容をローカルの同名ブランチにも反映させたい!
手順
現在のブランチの構成は以下の状態とし、リモートのdevelopに反映されたコミットをローカルdevelopにも反映させたいとします
shun@shun-VirtualBox:~/workspace/global$ git branch -a master develop* remotes/origin/HEAD -> origin/master remotes/origin/master remotes/origin/develop一発で反映させたい場合は、以下のコマンド
$ git pull origin develop
- origin(追跡ブランチ)に、リモートのdevelopを反映させる(フェッチ)
- また、originからローカルのdevelopブランチに統合する(マージ)
上記の手順を別コマンドで行うと以下のようになる
$ git fetch origin develop
- origin(追跡ブランチ)に、リモートのdevelopを反映させる
$ git merge FETCH_HEAD
- originのFETCH_HEADからローカルのdevelopブランチに統合する
続く
- 投稿日:2019-05-29T00:29:06+09:00
♪どつぼにはまってどっぴんしゃん
まったく進まなくなってしまった...
- GitHubの二段階認証が有効な環境でSourceTreeを使うにアクセストークンを発行し、それをソースツリーに入れればOKと書いてあったのでやってみた。でもダメ
- 昨日は疲れて寝てしまい落としてしまったし
- でも仕方ない。明日改めてがんばろう
今日の気持ち
- GOの勉強のはずなのにどんどん違う方向に進んでいる
- 参った、ホント参った
- でも諦めない。また明日