忍者ブログ
物理学者(ポスドク)による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

git pullしたら以下のワーニングっぽいものが出た

hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint: git config pull.rebase false # merge
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.

詳しくはここ

■ 参考 : Git 2.27 での git pull 時の warning について


以下のコマンドを走らせておいた
git config --global pull.rebase false







PR
今回初めてgitlabでmerge requestを出したのでそのときに調べたメモ

■ 過去記事 : Git Labでマージリクエスト(プルリクエスト)をするまで


コマンドメモ
# コードを修正する
# 新規ブランチを作成する(-bをつけると作成して移動もしてくれる)
% git checkout -b dev-hoge

# 今いるところを確認
% git branch

# いつものように編集内容を追加
% git add a.txt
% git add b.txt

# コメントを付けてcommit
% git commit -m "Added text file for bar"

# git push origin dev-hoge

この後の作業は、gilabのページで行う

「create merge request」というボタンを押すと、merge requestができるようになる
どんな修正なのかコメントを書く
誰に承認して欲しいかなども選べる
承認されたら、自動的にbranchを削除をチェックしておくと良さそう





コマンドラインからもmerge requestもできるらしいが、それは使ったら追記する





サーバーを再起動したら、急にgit logの日本語コメントが文字化けして表示されなくなった

?????

とか

<E3><E3><E3><E3><E3><E3><E3>

とかそんな感じ

たぶん、文字エンコードの話だろうと思って
echo $LANGとしてみるも、きちんとUTF-8が設定されている

その設定はきちんと ~/.zshrc の上でやってるので合ってそう


ぐぐってみると一番上に出てきた
localedef -f UTF-8 -i ja_JP ja_JP

をやってみるとうまくいった。要sudo








branch一覧をみる
git branch -a
masterブランチに戻る
git checkout master

hogeというbranchを作成してそのbranchに移動する
git checkout -b hoge

fooというbranchを元に、hogeというbranchを作成するとき
git checkout -b hoge origin/foo


hogeというbranchを本家のリポジトリに登録する
git push -u origin hoge

hogeというローカルブランチを削除する
git branch -d hoge

hogeというリモートブランチを削除する
ただ、これをしても他のユーザーの環境では表示が消えないらしい、どうしても消したいときは
git fetch -p
git push --delete origin hoge







■ 参考 : 3.5 Git のブランチ機能 - リモートブランチ

に面白いことが書いてあったのでメモ
“origin” は特別なものではない
Git の “master” ブランチがその他のブランチと何ら変わらないものであるのと同様に、 “origin” もその他のサーバーと何ら変わりはありません。 “master” ブランチがよく使われている理由は、ただ単に git init がデフォルトで作るブランチ名がそうだからというだけのことでした。 同様に “origin” も、git clone を実行するときのデフォルトのリモート名です。 たとえば git clone -o booyah などと実行すると、デフォルトのリモートブランチは booyah/master になります。

へぇ〜







ln -s /home/foo/hoge.txt .

みたいな感じで、fooさんが作ったhoge.txtを間借りして使ってた
ただ、hoge.txtは頻繁に更新されるし、安定して動くversionを自分のリポジトリに追加しておくと
あとでトラブったときに復旧が楽

で、このhoge.txtをgitに追加しようとすると、シンボリックリンクのまま追加されてしまう
自分がやってほしいのはリンク先まで見に行ってその内容をgitにアップしてほしいのだが・・・
そういうオプションがあると思って調べてみたがなさそう


■ 参考 : symbolic link - シンボリックリンクされたフォルダにgitコミットファイルを作成するにはどうすればよいですか


■ 参考 : version control - Gitはシンボリックリンクをどのように処理しますか?

gitの代わりにGitBSLRというコマンドをインストールして使うとかファイルの場所をgit内に移すとかが提案されてる


シンボリックリンクじゃなくて、ハードリンクを貼れば解決する?
と思って
ln /home/foo/hoge.txt .
としてみたけど、なぜかオリジナルのhoge.txtが更新されても手元にhoge.txtは更新されない・・・
ハードリンクは別のアカウントが作ったファイルだと機能しないのか?
それとも何か勘違いしてるのかも

(未解決)







git update-index --assume-unchanged hoge.txt

■ 参考 : 既に git 管理しているファイルをあえて無視したい








リポジトリをcloneしようとしたら、次のようなエラーが出た
error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
元のgitのversionはgit version 1.8.5.2
かなり古いマシーンだったので、ひとまずportでgitをアップデートすることにした
ググった感じ、それが解決方法っぽかったし

■ 参考 : Git error:1407742E

■ 参考 : GitHub への push/pull/clone が突然「error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version」エラーで使えなくなった件






(追記)

gitを個別にアップデートしようとしたが、エラーが出て最後までいかない
めんどくさくなったので
sudo /opt /opt_backup
としてから、gitをインストールしなおすことにした

インストールするソフト自体は多くないのですぐできるやろ・・・








まずはホスト側(sshして接続するサーバー)で作業をする

ディレクトリを作って、空っぽのリモートリポジトリを作る
複数人で共有するときのでsharedをつける
% mkdir hoge
% cd hoge
% git init --bare --shared





次にクライアント側(手元のマシン)で作業をする
適宜、
somewhere_server をサーバーのアドレスに
hoge を↑で作ったリポジトリのパスに置き換える
git clone somewhere_server:hoge

あとはなんかファイルを作って、git add, git commit -m "", git pushすればOK

簡単だな
これで計算機同士の設定共有やソースコードの共有が捗るはず














■ 過去記事 : 【git】ひとつ前の状態に戻りたい git reset --soft HEAD^

と少し関係がある
git reset --soft HEAD^
で一つ前のコミットをする直前に戻ったとして、その中で
git rm hoge.c
としていた場合、この操作を取り消してコミットを分割とかしたいのにそもそも
git checkout hoge.c
ができない・・・・


そういうときは
git reset HEAD hoge.c
git checkout hoge.c
でOK





git reset --soft HEAD^
で今、修正している他のソースコードはそのままにしてコミットだけを取り消すことができる

例えばhoge.cを修正して
git add hoge.c
git commit -m "Added hoge.c"
という状態で
git reset --soft HEAD^
すると、
hoge.cがまだcommitされていない状態に戻る


--softの代わりに、--hard もあるけどそちらはhoge.cの修正が完全になかったことになるので、
おそらくそちらを使いたい人はあまりいないはず









git status
とすると、configureで生成したファイルがワッサーーーと並ぶので、一番肝心の修正したファイルリストが隠れてしまう
そこで
git status | more
としていたが、
今度はcolorでなくなってしまう


ググったら解決方法が書いてあった

■ 参考 : git/git status|lessとかでカラー表示にならない件

git config --global color.branch always
git config --global color.diff always
git config --global color.interactive always
git config --global color.status always

でOK
このコマンドをどこでもいいので走らせると、~/gitconfigが書き換えられる

これらの設定が何かとコンフリクトして悪影響が出る場合は、以下のコマンドで元の設定に戻せる
git config --global color.branch auto
git config --global color.diff auto
git config --global color.interactive auto
git config --global color.status auto









それは・・・たぶん無理だ・・・


git add -p
で、1つのファイルを一度にコミットするんじゃなくて、1つのファイルの修正を分割してコミットすることができる

■ 参考 : Gitの便利な-pオプション四兄弟
git stash -p
も便利そう(絶対に使いこなせないけど)
これは今行った修正を更地に戻すけど、後でそこに復旧できるようにする
ファイルを最新の状態に戻すときは、git checkout hoge.c でOK


git log -pは割と使ってる、これはそのコミットでの修正点を具体的に見れる

あとここには書いてないけど
git log --stat
ってのも便利だと思う





(2016/10/27 追記)

git add hoge.c -p
は全然使わないだろうとか言ってたけど、かなり便利なことに気づいて活用している
表示された部分をaddしたいときはy、したくないときはn

ちなみにgitさんが提示してくるadd部分の範囲が広すぎる場合は
y/nの他に表示されているsを押すと、さらに細かい範囲を指定し直してくれる
それで良ければyを押せばいい




もらったメモにここで「git fetch origin hoge」をしてねと書いてあったがfetchって何?状態なので調べた

■ 参考 : Git 再入門 リモートリポジトリを使った作業

このページがとてつもなく分かりやすかった
自分みたいなアフォにわかるような文章を書いてくれて助かります・・・・


git remote
で、登録されているリモートリポジトリが一覧になる
詳細が知りたいときは
git remote show [リモートリポジトリ名]
おそらく .git/configに書いてある情報と同じだと思う

fetchはリモートリポジトリから最新情報をローカルリポジトリに持ってくるコマンド
ワーキングツリーには反映されないので、現在編集中のファイルが変更されることはない
ここがおそらくgit pullした場合との一番の違いか
ここで、修正したログがどういう風に扱われるのかが少しわからない・・・


リモートリポジトリなので、そもそも手元のmasterとはまったく別のbranchとしてgit fetchは落としてくる(これが一番の違い)
リモートリポジトリを手元に落としてきたあとで、git mergeまでやってコンフリクトが起こる可能性があるのがgit pull
な〜るほど〜〜〜

git のコンフリクトとか恐ろしくて手をつけたくないわ・・・
git fecth
git fecth [リモートリポジトリ名]
git fecth [リモートリポジトリ名] [branch名]
という使い方がある
git fetch --all
ですべてのリモートブランチをfetchする




■ 参考 : git pullは、fetchしてmergeするのと同じなのか?
実は git pull はC言語で実装されていません。git-pull.shというシェルスクリプトです。
へぇ〜
結論

git pullに、何も引数を付けずに実行した場合、git fetchしてgit mergeするのと同義であると確認できました。

伝説は本当でした。
だそうだ










git add -u

今までは、
git status | head -30
git add hoge
git add foo
...
としてたのがほんとアフォだった・・・・







そんなやつおる〜?(私です)


% git checkout hogehoge
Note: checking out 'hogehoge'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

git checkout -b

HEAD is now at hogehoge... foo
伏せ字ばっかりで申し訳ないですが、こんな感じで過去のコミットに遡ることができる
hogehogeというのはgitのコミットに割り当てられたID
fooはコミットメッセージ

こういう最新のHEADから切り離された状態をdetauched HEADというらしい


ここから、最新の状態に戻るためには
git checkout master
でOKらしい

危うくタイムマシーンに乗れないところだった・・・・・








まだgit pushしていない場合は簡単に書き換えられた
% git commit --amend -m "fixed xxx bug, refs #10"
git pushしてたらたぶん大変・・・・


■ 参考
git/コミットログを修正する方法









調べてみたらMacのキーチェーンを使う方法があるらしい

git config --global credential.helper osxkeychain
とコマンドを打つ

globalにしたくない(特定のgit repositoryでのみ有効にしたい)ときは、--globalオプションを外しておく


■ 参考
GitリポジトリにHTTPSでアクセスするときにパスワード入力を不要にする





■ 参考リンク
git clone 使い方

$ git clone --depth 1 "repository URL"
ただし、この方法でcloneしてきたリポジトリからは新たにpushすることはできないらしい
最新versionのみを配布するときはこのコマンドを使う?





gitの記事が増えてきたので、gitというカテゴリを作りましたー











完全に自分用のコマンドのメモ



■ 参考リンク

【Git】基本コマンド
だいたい必要なコマンドは↑のページにまとめられている





他にも
$git log --graph --stat
 もしくは
$ git log --graph
もかなり便利なコマンドだと思う

■ 参考
美しき git log --graph のエイリアス



これに関連して、こういうのもある
$git log --oneline



■ 参考 :共有レポジトリにPushしてしまったコミットをやり直す



■ 参考 :[Git] git repository size を削減する






(2018/04/19 追記)

便利そうなサイトがあったのでメモしておく

■ 参考 : 今日からはじめるGitHub 〜 初心者がGitをインストールして、プルリクできるようになるまでを解説







残念ながら、この問題はまだ解決していません

色々とどん詰まりで、解決できそうにないのでひとまずメモとしてまとめておく




例えば意図せず大容量のファイル(hoge.txt)をコミットしてしまったとする
すぐにそれは間違いだと気づいて
$ git rm hoge.txt
とするも時既に遅し
.git以下にきちんと履歴として残っている


gitでは基本的に過去のコミットを消すことはできない
なぜなら、そういうことをすると他の開発者の手元で整合性が取れないことになるから

そこで1つ考えられるのが
$ git revert
というコマンド
これで消したいコミットを打ち消すようなコミットをしてくれる


しかし今回自分がやりたいのはそうではなくて、大容量のファイルを過去のコミットから完全に削除したい
過去のあるコミットの、さらに1部分だけを取り出して修正するのはいろいろと大変
最悪リポジトリの整合性を破壊してしまいかねない危険なことなのには重々注意しておくこと
なので
バックアップを取るなり、branchを切るなり、別のディレクトリでgit cloneして作業するなりするべし





■ 参考になりそうなページ

git最強のオプション filter-branch


[Git] git repository size を削減する


Maintaining a Git Repository


gitリポジトリを軽くしよう!


最強のオプション: filter-branch

特に上から2番目が一番自分がやりたいことを体現してくれていそうな記事





まずは3番目の記事から シェルスクリプト git_find_big.sh というのを落としてくる
$ chmod +x git_find_big.sh
$ ./git_find_big.sh
で一番ファイルサイズが大きいものを探す
左端の列がファイルサイズ(おそらく単位はキロバイト)

これをコミットログの中から探し出して、完全に亡き者にする
$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch hoge.txt" --prune-empty -- --all
上記スクリプトを参考にしてhoge.txtの部分を消したいファイルを置き換える
$ git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
$ /bin/rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --aggressive --prune=now
で、削除したかった hoge.txt がリポジトリからなくなるはず
最初に表示されたファイルサイズ程度(もしくはそれ以上)の容量が減っているはず



と、ここまではいいのだが
上記のコマンドを走らせる前後でコミットログを見比べると、コミットのハッシュが書き変わっている・・・
$ git log
で一番上に出てくる英数字の並びのこと

そんなことはおかまいなしに
$ git push --all --force
としてみましたが、
remote: error: denying non-fast-forward refs/heads/master (you should pull first)
To https://xxxxxx
! [remote rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://xxxxxx'
のようなエラーが出てうまくいかない・・・・

と、ここで詰まってしまっている・・・
このあと色々と試してみたがどうにもうまくいかず・・・





今の自分の現状について、わかりやすい解説を見つけた
Gitリポジトリのディレクトリ構成を変更する

↓ 引用
ここでいくつか注意点を述べる。

上記コマンドは、現在のブランチの履歴のみを書き換える。
リポジトリ内に複数のブランチが存在していた場合、他のブランチとの整合性は失われる。(もちろんoriginとの整合性も失われる。)もはや古いブランチと履歴ツリーを共有することはできない。
正確に言うと、他のブランチが持つ書き換え前のコミットと、現在のブランチが持つ書き換え後のコミットは完全に別々のコミットとして扱われる。コミットのハッシュ値が以前と変わっていることに注目してほしい。
-allオプションをつければ、リポジトリ内の全てのブランチに対して変更を適用することができる。
-allオプションによって、同リポジトリ内のブランチの整合性は保たれる。しかしこの方法でも、外部のリポジトリ(要するにorigin)との整合性を失うことは避けられない。
要するにこの操作は、リポジトリ自体を新しく作り直して、古いリポジトリは破棄する方法であると考えるべきである。
↑引用おわり

もはや新しいリポジトリを作った方が早い気がしてきた・・・

おそらく1つ前のコミット程度であればすぐに修正できるが
1ヶ月以上前のコミットなので、そのコミットを完全に削除しても、それはもう現状復帰ではなく「リポジトリ自体を新しく作り直して、古いリポジトリは破棄する」ということなんだろう・・・

何か解決方法をご存知の方は教えてください








今まで
$ git log
しか使ったことなかった
$ git pull
したときに出てくるような+++とか---があるようなlogを表示させることができるのかな?
とふと気になったので調べてみた。

答えは下のリンク先にまとめられていた
Git の基本 - コミット履歴の閲覧


簡単にまとめると
# 直近の1エントリについてのdiffなどを表示させる
$ git -p -1

# 直近の1エントリについてのdiffなどを表示させる
$ git log --stat -1

# 今までのlogをそれぞれ1行で出力する
$ git log --pretty=oneline
とりあえずこんな感じ?
文章で書くのは難しいので、ひとまず試しに入力してみるとよく理解できると思う・・・









空のディレクトリに、空のファイル .gitkeep というのを置いておくのが流儀らしい
git はきちんとそのファイルを認識してくれるので大丈夫
touch .gitkeep
■ 参考
空のディレクトリをgitで管理するには.gitkeepを使う







warning: push.default is unset; its implicit value is changing in Git 2.0 from 'matching' to 'simple'.
(一部分しかエラーメッセージを残していなかった・・・)


解決方法は簡単で、
git config --global push.default simple
としておけばよい



■ 参考

git push時に表示されるwarning: `push.default is unset...`の意味と解決方法

















.gitignoreを活用しましょう
このファイルに書いたファイルは git add する対象にはなりません
つまりディレクトリを一括でgit addしたときしても.DS_Storeはアップロードされません

.gitignoreの書き方
*.o
*.hi
*.chi
*.chs.h
/***/.DS_Store
たぶんこんな感じでおーけー


このファイルは、
gitで同期しているディレクトリ自身に.gitignoreを置いてもいいですし、
ホームディレクトリに.gitignoreを一つ置いて、それをglobalな設定にしてしまうのもいいかもしれません

globalな設定にする場合は
git config --global core.excludesfile ~/.gitignore
■ 参考
グローバルな.gitignore を設定して、すべてのgitリポジトリで無視するファイルを設定する





自分はいつものごとく .gitignoreをDropboxにアップロードしておいて
ln -s /Users/hoge/Dropbox/setup/.gitignore ~/
としておきます






(2020/03/19 追記)

.gitignoreにファイルのPATHを書いたのに、なぜかまだ git statusで出現してくる・・・・

■ 参考 : .gitignoreにファイルを追加したのに無視されない

によると、一度git add とかでリポジトリに登録してしまったものは.gitignoreでは無視できないらしい

そういうときは
git rm --cached path/to/file
または
git rm path/to/file
--cachedありの場合はgit repositoryからは消え、ファイル自体は残るが、.gitignoreで無視される
--cachedなしの場合はgit repositoryから消え、ファイル自体も消える








(2020/10/28 追加)

.gitignore を使ってgit repository内の特定のファイルをgitに追加しないようにしたい

例えば hoge/foo/aaa.txt というファイルだとすると
/hoge/foo/aaa.txt

頭に/を付けて始めればOK










HOME |
プロフィール
HN:coffee
職業:物理屋(自称)
趣味:映画鑑賞、登山
出身:大阪府の南の田舎
自己紹介:
import MyProfile
import coffee_pote from TWITTER
import amazonのほしい物リスト from WISH_LIST

print "先月子供が産まれました!"

# 最終更新 2022/10/25
カウンター
カウンター カウンター
ブログ内検索
ツイートするボタン
リンク
相互リンク募集中です (Twitterにてお知らせください)

Demo scripts for gnuplot version 5
(gnuplotのさまざまなデモ画像と作り方がまとめられている、眺めているだけでできるようになった気分になれる)

gnuplotスクリプトの解説
(米澤進吾さんの個人ページ、gnuplotと言えばこのかた)

gnuplot のページ
(Takeno Lab、うちのブログがリンクされていたのでリンク返し)

Twitterから映画の評価が分かる & 映画の鑑賞記録が残せる coco
(映画の感想をまとめられるサイト、いつもお世話になっています)

Astronomy Picture of the Day Archive
(天文や宇宙関連の最新の話題について画像とともにNASAが説明しているページ)

今日のほしぞら
(任意の時刻の空で見える星を表示してくれる、国立天文台が管理している)

GNUPLOTとアニメーション
(応用の項目の「見せてあげよう!ラピュタの雷を!!」あたりからすごすぎる)

読書メーター
(読んだ本をリストできる便利なサイト)

flickr難民の写真置き場
(20XX年、flickrは有料化の炎に包まれた。あらゆるflickr無料ユーザーは絶滅したかに見えた。 しかし、tumblr移住民は死に絶えてはいなかった。)

教授でもできるMac OS X へのLaTeX, X11, gccのインストレーションと環境設定
(阪大の山中卓さんのwebページ、タイトルにセンスが溢れている、内容は超充実してる、特にTeX関連、学振DCとかPDの申請書類作成時にはお世話になっております)

英語論文執筆用の例文検索サービス
(とんでもないものを見つけてしまった・・・・ arXivに収録されている 811,761報の 英語論文から,例文を検索するための検索エンジン)


Template "simple02" by Emile*Emilie
忍者ブログ [PR]