- 投稿日:2019-07-10T22:55:33+09:00
Gitについて
【Gitについて】
ファイルのバージョン管理を行うツールの1つ
Gitで管理することで、自動で「編集者」「編集日時」が保存される為、ファイルが「いつ」 「誰によって」 「どこに修正があったのか」 がすぐに把握できる事が出来る
このGitを使用することによって、変更履歴をさかのぼってコードを元の状態に戻す事もでき、複数人での共同開発が可能となる
【Gitの基本的な用語】
・リポジトリ
→Gitで管理する対象になるディレクトリやファイルの事をさす・ローカルリポジトリ
→自身のPC内にあるリポジトリ・リモートリポジトリ
→リモートのサーバー内にて、管理や共有する為のリポジトリ(GitHubなど)・ワークツリー
→リポジトリ配下のファイルを編集して自動的に保存される場所(コミット対象ではない、できない)・インデックス
→編集したファイルをコミットする前の仮確定して置いておく場所(コミット対象)・コミット
→リポジトリに編集内容を記録する事【Git基本コマンド】
git init
→ローカルリポジトリを作成するコマンド
git add
→ワークツリーにあるファイルをインデックスに移動させるコマンド
git add .
ファイル全て
git add ファイル名
指定ファイルのみ
git reset
→インデックスに追加したファイルをワークツリーに戻すコマンド
git commit(git commit -m”メッセージ”)
→ローカルリポジトリの変更内容を保存。コミットメッセージを入力
git log
→コミットログを確認するコマンド
git status
→ワークツリーとインデックスにあるファイルの状態を確認するコマンド
git branch
→ローカルリポジトリにあるブランチの一覧と現在選択中のブランチを確認・ブランチのリスト表示
git branch
・ブランチの新規作成git branch ブランチ名
・ブランチの削除git branch -d ブランチ名
git checkout ブランチ名
→ブランチの切り替えコマンド
→ワークツリーのファイルの状態を元に戻す
git addした状態(インデックスに移動した状態)では戻せない
git checkout -b ブランチ名
→ブランチの作成とチェックアウトを同時に行うコマンド
git clone URL
→リモートリポジトリをローカルリポジトリにクローンする
- 投稿日:2019-07-10T17:18:42+09:00
Git Ignoreを作成して、要らないファイルを管理させない
Git管理で、必要なファイルを纏めて管理外にするには、~/.gitignoreを作成して置くのは良いでしょう。
~/.gitignoreputs 'code with syntax' # Folder view configuration files .DS_Store Desktop.ini # Thumbnail cache files ._* Thumbs.db # Files that might appear on external disks .Spotlight-V100 .Trashes # Compiled Python files *.pyc # Compiled C++ files *.out # Application specific files venv node_modules .sass-cache
- 投稿日:2019-07-10T10:21:58+09:00
今までMacのGitで経験した環境トラブル集
今までMacのGitで経験した環境トラブル集
職場に新メンバーが加わった時とかに、Gitで色々なトラブルが起きました。
今回は、私が遭遇したトラブルをまとめてみました。
随時更新していこうと思います。リモートリポジトリのパスワード関係
リモートリポジトリのパスワード入力を間違えていた。
基本的なことなのですが、入力を間違ているというパターンが意外とあります。
間違って入力したパスワードを、MacのKeyChainが記憶してしまっていた。
上記の件と関係するのですが、間違って入力したリモートリポジトリのパスワードを、KeyChainがキャッシュしてしまい、パスワード入力ができなくなってしまうというパターンがありました。
これは、KeyChainのキャッシュを削除すれば、パスワード入力ができるようになります。
プロキシ関係
Proxy配下のGitを作業していると、何かとトラブルが起きます。
Bashの環境変数に,
http_proxy
,https_proxy
,no_proxy
の設定ができていなかった。コンソールで
export
コマンドを実行して満足して、.bashrc
にちゃんと追加できていなかったというパターンです。
基本的なことですが、意外とこれをやる人が多いです。
.bashrc
か.bash_profile
に環境変数http_proxy
,https_proxy
,no_proxy
を設定しましょう。
.bashrc
に設定すれば、自動で.bash_profile
にも読み込まれますので、.bashrc
に書けば十分です。
https_proxy
のスキームを勘違いしてhttps://
にしていた。
http_proxy
とhttps_proxy
は基本的には同じ値を入れることになるのですが、それを勘違いして、https_proxy
の方だけURLの先頭をhttps://
に変更している人がいました。プロキシのURLにユーザー名・パスワードを追加するのを忘れていた。
認証プロキシの場合、プロキシに対するユーザー名とパスワードを設定する必要があります。そのため、環境変数の値はこんな風になります。
http://(ユーザー名):(パスワード)@(ホスト):(ポート)
git config --global
にhttp.proxy
,https.proxy
の設定ができていなかった。どうやら環境変数だけでは不足で、
git config --global
にも設定が必要のようです。
git config --local
でhttp.proxy
,https.proxy
の設定を上書きしていた。
git config --local
を使えば、リポジトリ毎にGitの設定ができますが、この設定はgit config --global
よりも優先されるため、ここにhttp.proxy
,https.proxy
を間違った値で設定すると、うまく接続できなくなります。Gitのバージョンが古くて
no_proxy
に対応していなかった。同一LAN内のリモートリポジトリに接続する場合、プロキシの設定が邪魔をします。
そのため、no_proxy
で、プロキシ設定から除外したいドメインを指定する必要があります。Gitのバージョンが古くて、この
no_proxy
に対応していなかったということがありました。
no_proxy
の値にスペースが混入していた。export no_proxy=localhost, 127.0.0.1のようにスペースが入ってしまっていたパターンがありました。
export no_proxy=localhost,127.0.0.1のようにスペースをなくす必要があります。
メインシェルをZshに変えた際に、Zshの環境変数に,
http_proxy
,https_proxy
,no_proxy
を設定することを忘れていた。環境変数というのはどうやらシェル毎に持っているものらしく、シェルがBashではないなら、
.bashrc
の設定は継承されないようです。Zshの場合は
.zshrc
に設定します。私は.zshrc
から.bashrc
を呼ぶようにしました。
- 投稿日:2019-07-10T09:07:50+09:00
コンフリクトの発生原因について(merge)
rubyでコードを書く時みなさん基本的には作業用ブランチを作成して、主にそこでコード書く。完了したらcommitして、masterブランチにmergeする。
しかし初学者にありがちなmergeをしたら、(master|MERGEING)になってそこからgitコマンドが使えなくなった経験はございませんか??
そんな初学者向けに陥りやすい原因と解決策について一つのやり方(正しいかは別)として参考程度に考えていただけたらなともいます。コンフリクトとは
相反する意見、態度、要求などが存在し、互いに譲らずに緊張状態が生じること。 対立、軋轢。プログラミング(ruby)に関しては主に現場ではgit cloneした時なんかに生じるエラーになるかと思われます。しかし、今回はbranch作成してmasterブランチでのmergeに起きるエラーについてかいていきます。
発生原因
基本的にはコンフリクトは「衝突」のような意味合いもあるので、mergeする際の衝突をイメージできるかと思います。
では、mergeの衝突を具体例を持って説明したいと思います。1、1つのmergeしてないブランチを作成する
git checkout -b Test1
2、ここではREADME.mdファイルでのコンフリクトをさせるための文を書きます
ruby:README.md
'コンフリクト1を作成しました。'
3、保存が終わったらcommitまでしていきます。
git add -A
git commit -m Test1
git checkout master
4、mergeをせずに手順1にもどり同じことをする(TestとREADMEの数だけ変えています)
5、手順3まで終わったら今masterブランチにいる状態だと思います。ここでまず最初にコミットしたTest1をmergeします。
git merge Test1
ruby:README.md
'コンフリクト1を作成しました。'
空白だったとこに無事反映されています。6、では次に2つ目に作ったTest2をmergeします。
git merge Test2
すると次はエラーがでてしまいました。7、ここの文だけでもREADMEファイルに問題があるのは明白なのですが、一応ステータスの方でも確認をしておきましょう。
git status
赤文字で
modified
とかかれファイル名もREADME.md
と書かれてますね。8、次は問題のREADMEファイルをみてみましょう。
先ほど文が2個表示されていますが、なにやらいらないものがついてきちゃってますね。
HEAD ... 最後にmergeしたもの
Test2 ... 2個めにmergeしたものまとめ
このように1つ目のブランチを
merge
せずに2つ目のブランチ作成して作業するとこのように食い違いが起きるわけです。Test2
をmerge
しようとしてもブランチにはコンフリクト1を作成しました。
という文は含まれていないのですから、ここでコンフリクト
という現象が発生します。特に初心者のかたはmergeをうっかり忘れて次のブランチを作成していまい、コンフリクトが発生する(私も何回かやっていました。笑)ので落ち着いてgit log
等も確認しながら作業進めていきましょう!すこしでも初学者のかたの役にたてたらなと思います
また、何か間違っているところ、こうした方がいい等のご意見いただましたらよろしくお願いします。
- 投稿日:2019-07-10T00:35:31+09:00
GitでPushしたらfatal: The current branch ブランチ名 has no upstream branch.となった時の対応方法
- 環境
- macOS Mojave バージョン10.14.5
- git version 2.21.0
事象 : 新規ブランチを作ってプッシュしたら怒られた
# masterブランチの状態で $ git branch --contains=HEAD * master # branch-aブランチを新規作成して $ git checkout -b branch-a M fileName.md Switched to a new branch 'branch-a' # プッシュしたら怒られた $ git push fatal: The current branch branch-a has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin branch-a原因 : 上流ブランチがないから
ローカルで作成した
branch-a
の上流ブランチ(upstream branch)はorigin/branch-a
となってほしかったのだが、branch-a
にそもそも上流ブランチがないために怒られた。
上流ブランチの意味はGit で「追跡ブランチ」って言うのやめましょうにとてもわかり易く書いてあった。# branch-aの上流ブランチが・・・ない $ git branch -vv * branch-a 85c84de masterブランチ最後のコミットコメント master 85c84de [origin/master] masterブランチ最後のコミットコメント # --set-upstreamって何? $ git push --help # 省略 -u, --set-upstream For every branch that is up to date or successfully pushed, add upstream (tracking) reference, used by argument-less git-pull(1) and other commands. For more information, see branch.<name>.merge in git-config(1). # (頑張った訳:日本語が難しいので[]とか{}とかを区切れ目に使っている) # [最新の状態である]または[正常にプッシュされた]ブランチごとに、{引き数なしのgit-pull(1)や他のコマンドで使われる[上流ブランチ]}を追加します。 # 詳細については、git-config (1)にあるbranch.<name>.mergを参照してください。怒られた時に対応 : オプションを付けてプッシュと一緒に上流ブランチを追加する
$ git push --set-upstream origin branch-a Total 0 (delta 0), reused 0 (delta 0) remote: remote: Create a pull request for 'branch-a' on GitHub by visiting: remote: https://github.com/username/repository/pull/new/branch-a remote: To https://github.com/username/repository.git * [new branch] branch-a -> branch-a Branch 'branch-a' set up to track remote branch 'branch-a' from 'origin'. # branch-aの上流ブランチが・・・できた $ git branch -vv * branch-a 85c84de [origin/branch-a] masterブランチ最後のコミットコメント master 85c84de [origin/master] masterブランチ最後のコミットコメントブランチを作るときに対応
① ブランチを作る時に親ブランチを指定する
git pushとブランチの追跡 - Qiita
この方法は結果が「なんだかよくわからない状態」になってしまった・・・# この方法は新規ブランチ専用の上流ブランチを作成できるわけではなかった $ git checkout -b branch-b origin/branch-b fatal: 'origin/branch-b' is not a commit and a branch 'branch-b' cannot be created from it # masterの上流ブランチであるorigin/masterを親ブランチに指定すると $ git checkout -b branch-b origin/master M fileName.md Branch 'branch-b' set up to track remote branch 'master' from 'origin'. Switched to a new branch 'branch-b' # 新規ブランチの上流ブランチは当然origin/masterとなり $ git branch -vv branch-a 85c84de [origin/branch-a] masterブランチ最後のコミットコメント * branch-b 85c84de [origin/master] masterブランチ最後のコミットコメント master 85c84de [origin/master] masterブランチ最後のコミットコメント # プッシュすると怒られて、選択肢を3つ提示される $ git push fatal: The upstream branch of your current branch does not match the name of your current branch. To push to the upstream branch on the remote, use git push origin HEAD:master To push to the branch of the same name on the remote, use git push origin HEAD To choose either option permanently, see push.default in 'git help config'. # 「リモート上の同じ名前のブランチにプッシュする」をやると $ git push origin HEAD Total 0 (delta 0), reused 0 (delta 0) remote: remote: Create a pull request for 'branch-b' on GitHub by visiting: remote: https://github.com/username/repository/pull/new/branch-b remote: To https://github.com/username/repository.git * [new branch] HEAD -> branch-b # 上流ブランチはorigin/masterのままだけど $ git branch -vv branch-a 85c84de [origin/branch-a] masterブランチ最後のコミットコメント * branch-b 85c84de [origin/master] masterブランチ最後のコミットコメント master 85c84de [origin/master] masterブランチ最後のコミットコメント # リモートブランチとしてはbranch-bができる $ git branch -r origin/HEAD -> origin/master origin/branch-a origin/branch-b origin/master # リモートの情報をもっと見るとよくわからない状態になっていた $ git remote show origin | grep -5 pull Remote branches: branch-a tracked branch-b tracked master tracked Local branches configured for 'git pull': branch-a merges with remote branch-a branch-b merges with remote master master merges with remote master Local refs configured for 'git push': branch-a pushes to branch-a (up to date)② .gitconfigにローカルブランチと同じ名前の上流ブランチを使うように設定する
gitのpush.defaultに関するノウハウ - Qiita
# .gitconfigにcurrentを指定すれば $ git config --global push.default current $ cat ~/.gitconfig | grep -A 2 push [push] default = current # 新規にブランチを作成して $ git checkout -b branch-c M fileName.md Switched to a new branch 'branch-c' # 上流ブランチはなくても $ git branch -vv branch-a 85c84de [origin/branch-a] masterブランチ最後のコミットコメント branch-b 85c84de [origin/master] masterブランチ最後のコミットコメント * branch-c 85c84de masterブランチ最後のコミットコメント master 85c84de [origin/master] masterブランチ最後のコミットコメント # リモートブランチに同じ名前のブランチがなくても $ git branch -r origin/HEAD -> origin/master origin/branch-a origin/branch-b origin/master # プッシュできる! $ git push Total 0 (delta 0), reused 0 (delta 0) remote: remote: Create a pull request for 'branch-c' on GitHub by visiting: remote: https://github.com/username/repository/pull/new/branch-c remote: To https://github.com/username/repository.git * [new branch] branch-c -> branch-c # プッシュ後も上流ブランチはないけど $ git branch -vv branch-a 85c84de [origin/branch-a] masterブランチ最後のコミットコメント branch-b 85c84de [origin/master] masterブランチ最後のコミットコメント * branch-c 85c84de masterブランチ最後のコミットコメント master 85c84de [origin/master] masterブランチ最後のコミットコメント # リモートブランチはちゃんとできる $ git branch -r origin/HEAD -> origin/master origin/branch-a origin/branch-b origin/branch-c origin/master