- 投稿日:2019-05-26T22:40:37+09:00
git
git基本設定初期のディレクトり Hello - hello.rb $git init 実行 ※gitは隠しファイル(ls -aで見れる) Hello - hello.rb - .git - HEAD - config(設定ファイル) - などなどディレクトリ$ ls -C .git COMMIT_EDITMSG ORIG_HEAD hooks logs rr-cache HEAD config index objects MERGE_RR description info refs - objects 変更した履歴? - HEAD 最新の状態基本コマンドgit add git status git commit -m "コミットメッセージ" git checkout git reset git log git log --pretty=oneline(commit の名前だけ見れる) git log --pretty=oneline --max-count=2 git log --pretty=oneline --since='5 minutes ago' git log --pretty=oneline --until='5 minutes ago'(編集時間でソート) git log --pretty=oneline --author=<your name>(編集者でソート) git log --pretty=oneline --allgitconfigの設定[alias] co = checkout ci = commit st = status br = branch hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short type = cat-file -t dump = cat-file -p戻るgit checkout <hash> git checkot master(これで戻れる。。。。) hash値にgcした時のブランチを見ると。。。。 $ git branch * (HEAD detached at ef8ce92) masteraddの取り消し$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: hello.rb(緑) addから外す $ git reset HEAD hello.rb $ git status On branch master 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) modified: hello.rb(赤)revertcommit 2b8bec385230a923f6d1866a61b5fa5919967969 (HEAD -> master) Author: Awtanabe <panser098@gmail.com> Date: Sun May 26 22:24:31 2019 +0900 Revert "for revert" This reverts commit df9de155eedb95f08f083578d874d97a9918e6be. commit df9de155eedb95f08f083578d874d97a9918e6be Author: Awtanabe <panser098@gmail.com> Date: Sun May 26 22:24:16 2019 +0900 for revert ※revertした履歴も残る!! 共同開発して勝手に消されたら困るもんね。コミットの編集git commit --amend -m "Add an author/email comment"ファイルの場所を変更git mv hello.rb lib git つけるんだ git をつけないと... $ git status On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: hello.rb Untracked files: (use "git add <file>..." to include in what will be committed) lib/ hello.rbがdeleteされて libのデレクトダケができる ちゃんとやると $ git mv hello.rb lib/ watanabeakifumi-no-MacBook-Air:hello watanabeakifumi$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: hello.rb -> lib/hello.rbRaketaskの実行Rakefile(ファイル名) #!/usr/bin/ruby -wKU task :default => :run task :run do require './lib/hello' end $ rake → helloworld rake で実行すると、defaultのtaskが実行されるのかブランチ作成git branch <ブランチ名>rebaseとコンプリくと$ git rebase <含みたいブランチ> 1 コンフリクト発生 2 >>>で検索する 3 解消する 4 git add -A 5 git rebase --continue 修正終わったら ※一つづつ解決するコンフリクトの解消コンフリクト発生 $ git merge master Auto-merging lib/hello.rb CONFLICT (content): Merge conflict in lib/hello.rb Automatic merge failed; fix conflicts and then commit the result.リモートブランチ$ git remote -v $ git branch -a(リモートブランチ一覧) $ git remote add shared ../hello.git(リモートに追加)Todofetch pull bare
- 投稿日:2019-05-26T17:51:06+09:00
git rebase -i のサンプル実行メモ(reword, edit, squash, drop)
はじめに
- この前、チーム内でgitの解説的な時間があり、その時に
git rebase -i
の使い方をライブプログラミング的に聞いた。今までよく分からなかったので、調べるのが面倒であまり使っていなかったのだが、この機会に色々触ってみたので、サンプルコマンドの結果をまとめたメモ
- 解説は無し
- ★が事後コメント
- 利用の機会がありそうな reword, edit, squash, drop が対象
初期状態(準備)
- テキストファイルを適当に6個([a..f].txt)作成する
- それぞれのファイルの作成に対してcommitするがb,cのみコミットをまとめておく
% tig 16cc549 2019-05-26 15:39 kuredev o [master] add f.txt 3e55df3 2019-05-26 15:39 kuredev o add e.txt 16734b1 2019-05-26 15:38 kuredev o add d.txt 00f95df 2019-05-26 15:38 kuredev o add b.txt and c.txt ae36142 2019-05-26 15:37 kuredev o add a.txt
reword
add a.txt
のコミットメッセージを修正する% git rebase -i HEAD~5 1 reword ae36142 add a.txt ★rewordに修正 2 pick 00f95df add b.txt and c.txt 3 pick 16734b1 add d.txt 4 pick 3e55df3 add e.txt 5 pick 16cc549 add f.txt :wq ★保存 1 add a.txt by git rebase -i ★修正 2 3 # Please enter the commit message for your changes. Lines starting ...(省略) :wq ★保存 %tig f749d8b 2019-05-26 15:39 kuredev o [master] add f.txt bc1b2da 2019-05-26 15:39 kuredev o add e.txt cb4bf08 2019-05-26 15:38 kuredev o add d.txt 1b3df3a 2019-05-26 15:38 kuredev o add b.txt and c.txt d7cf3d2 2019-05-26 15:37 kuredev o add a.txt by git rebase -i ★修正された。
あと、それ以後のコミットIDがすべて更新された。edit
コミットを分割してみる
事前に
add b.txt and c.txt
が2つのファイルをまとめたコミットとしてあったので、これを2つのコミットに分けてみる初期状態
%tig f749d8b 2019-05-26 15:39 kuredev o [master] add f.txt bc1b2da 2019-05-26 15:39 kuredev o add e.txt cb4bf08 2019-05-26 15:38 kuredev o add d.txt 1b3df3a 2019-05-26 15:38 kuredev o add b.txt and c.txt ★これを分割してみる d7cf3d2 2019-05-26 15:37 kuredev o add a.txt by git rebase -irebase -i
% git rebase -i HEAD~5 1 pick d7cf3d2 add a.txt by git rebase -i 2 edit 1b3df3a add b.txt and c.txt ★ 3 pick cb4bf08 add d.txt 4 pick bc1b2da add e.txt 5 pick f749d8b add f.txt :wq ★保存 ★この時点でログを見るとadd b.txt and c.txtのコミットまでで止まっている(という表現が正しいか不明) % tig 1b3df3a 2019-05-26 15:38 kuredev o [HEAD] add b.txt and c.txt d7cf3d2 2019-05-26 15:37 kuredev o add a.txt by git rebase -i ★ファイルの実体もある kure@ubuntu ~/test-repo % ls a.txt b.txt c.txtコミット再作成
★コミットを1つ取り消す % git reset HEAD^ % tig d7cf3d2 2019-05-26 15:37 kuredev o [HEAD] add a.txt by git rebase -i ★実体(ワーキングツリー)はある kure@ubuntu ~/test-repo % ls a.txt b.txt c.txt ★add/commitし直す kure@ubuntu ~/test-repo % git add b.txt kure@ubuntu ~/test-repo % git commit -m "b.txt" [detached HEAD a59668d] b.txt 1 file changed, 2 insertions(+) create mode 100644 b.txt kure@ubuntu ~/test-repo % git add c.txt kure@ubuntu ~/test-repo % git commit -m "c.txt" [detached HEAD a3bc22b] c.txt 1 file changed, 2 insertions(+) create mode 100644 c.txt ★ rebase kure@ubuntu ~/test-repo % git rebase --continue確認
★ 確認:コミットが別れた! kure@ubuntu ~/test-repo % tig 7123fe0 2019-05-26 15:39 kuredev o [master] add f.txt 0cbbe5b 2019-05-26 15:39 kuredev o add e.txt 1ad7908 2019-05-26 15:38 kuredev o add d.txt a3bc22b 2019-05-26 16:05 kuredev o c.txt a59668d 2019-05-26 16:05 kuredev o b.txt d7cf3d2 2019-05-26 15:37 kuredev o add a.txt by git rebase -iコミットの内容を書き換える
初期状態
kure@ubuntu ~/test-repo % tig 166a2f9 2019-05-26 15:39 kuredev o [master] add f.txt cbe6fa0 2019-05-26 15:39 kuredev o add e.txt 29bed98 2019-05-26 15:38 kuredev o add d.txt a3bc22b 2019-05-26 16:05 kuredev o c.txt a59668d 2019-05-26 16:05 kuredev o b.txt ★このコミットの内容を書き換える ★Typoしてる kure@ubuntu ~/test-repo % cat b.txt crategit rebase -i
kure@ubuntu ~/test-repo % git rebase -i d7cf3d2~1 1 pick d7cf3d2 add a.txt by git rebase -i 2 edit a59668d b.txt ★ 3 pick a3bc22b c.txt 4 pick 29bed98 add d.txt 5 pick cbe6fa0 add e.txt 6 pick 166a2f9 add f.txt kure@ubuntu ~/test-repo % vim b.txt kure@ubuntu ~/test-repo % cat b.txt create kure@ubuntu ~/test-repo % ★add/commitし直す kure@ubuntu ~/test-repo % git add b.txt kure@ubuntu ~/test-repo % git commit --amend [detached HEAD 6c86aaf] b.txt Date: Sun May 26 16:05:05 2019 +0900 1 file changed, 2 insertions(+) create mode 100644 b.txt ★rebase kure@ubuntu ~/test-repo % git rebase --continue確認
%tig 7f9a0bd 2019-05-26 15:39 kuredev o [master] add f.txt 1a2c3f5 2019-05-26 15:39 kuredev o add e.txt 7251eeb 2019-05-26 15:38 kuredev o add d.txt da4ddb6 2019-05-26 16:05 kuredev o c.txt 6c86aaf 2019-05-26 16:05 kuredev o b.txt kure@ubuntu ~/test-repo % git show 6c86aaf b.txt diff --git a/b.txt b/b.txt new file mode 100644 index 0000000..0cbdfe6 --- /dev/null +++ b/b.txt @@ -0,0 +1,2 @@ +create ★ + ★内容書き換わった!squash
- 指定したコミットを一つ前のコミットにまとめる
- b.txt と c.txt の作成のコミットを一つのコミットとしてみる
- c.txt に対して squashする
初期状態
★初期状態 kure@ubuntu ~/test-repo % tig 7f9a0bd 2019-05-26 15:39 kuredev o [master] add f.txt 1a2c3f5 2019-05-26 15:39 kuredev o add e.txt 7251eeb 2019-05-26 15:38 kuredev o add d.txt da4ddb6 2019-05-26 16:05 kuredev o c.txt 6c86aaf 2019-05-26 16:05 kuredev o b.txt
rebase -i
★ rebase -i kure@ubuntu ~/test-repo % git rebase -i HEAD~5 1 pick d7cf3d2 add a.txt by git rebase -i 2 pick 6c86aaf b.txt 3 s da4ddb6 c.txt ★ squash 4 pick 7251eeb add d.txt 5 pick 1a2c3f5 add e.txt 6 pick 7f9a0bd add f.txt 2 # This is the 1st commit message: 3 4 b.txt 5 6 # This is the commit message #2: 7 8 # c.txt ★コミットメッセージの編集:今回はコメントアウトする確認
% tig 64d01fa 2019-05-26 15:39 kuredev o [master] add f.txt e398f2e 2019-05-26 15:39 kuredev o add e.txt b267e94 2019-05-26 15:38 kuredev o add d.txt 3cc9b19 2019-05-26 16:05 kuredev o b.txt d7cf3d2 2019-05-26 15:37 kuredev o add a.txt by git rebase -i ★c.txt が消えた。 ★一つのコミットにまとめられてる。 kure@ubuntu ~/test-repo % git show 3cc9b19 commit 3cc9b190ad7a390e4473b7e2360dd8afcc4d3640 Author: kuredev <rapuntuleru2@gmail.com> Date: Sun May 26 16:05:05 2019 +0900 b.txt diff --git a/b.txt b/b.txt new file mode 100644 index 0000000..0cbdfe6 --- /dev/null +++ b/b.txt @@ -0,0 +1,2 @@ +create + diff --git a/c.txt b/c.txt new file mode 100644 index 0000000..0cbdfe6 --- /dev/null +++ b/c.txt @@ -0,0 +1,2 @@ +create +drop
初期状態
★初期状態 add e.txt のコミットを消す kure@ubuntu ~/test-repo % tig 64d01fa 2019-05-26 15:39 kuredev o [master] add f.txt e398f2e 2019-05-26 15:39 kuredev o add e.txt b267e94 2019-05-26 15:38 kuredev o add d.txt 3cc9b19 2019-05-26 16:05 kuredev o b.txt
rebase -i
kure@ubuntu ~/test-repo % git rebase -i HEAD~4 Successfully rebased and updated refs/heads/master. 1 pick 3cc9b19 b.txt 2 pick b267e94 add d.txt 3 d e398f2e add e.txt ★ 4 pick 64d01fa add f.txt
確認
★コミットが消えた。 kure@ubuntu ~/test-repo % tig 5059dfc 2019-05-26 15:39 kuredev o [master] add f.txt b267e94 2019-05-26 15:38 kuredev o add d.txt 3cc9b19 2019-05-26 16:05 kuredev o b.txt d7cf3d2 2019-05-26 15:37 kuredev o add a.txt by git rebase -i ★ eもなくなった。 kure@ubuntu ~/test-repo % ls a.txt b.txt c.txt d.txt f.txt参考
gitのコミットの歴史を改変する(git rebase) 1 / 2 · けんごのお屋敷 http://tkengo.github.io/blog/2013/05/16/git-rebase-reference/
[git]特定のコミットの内容を修正する - dackdive's blog https://dackdive.hateblo.jp/entry/2014/09/21/122200
- 投稿日:2019-05-26T00:55:41+09:00
【Xcode10】不要なリモートファイルを作らない.gitignore作成タイミング
Xcode
ではプロジェクトを作るときに、一緒にGit
のリポジトリ
を作ることができます。プロジェクトフォルダの場所を指定する以下の画面で、「Create Git repository on my Mac」
にチェックを入れれば、Git
のローカルリポジトリ
を作ってくれます。
不要なファイルができてしまうケース
この状態で
Xcode
からリモートリポジトリ
を追加すると、*.xcodeproj
等の不要なフォルダやファイルができてしまいます。
*.xcodeprojフォルダ
の中にはxcuserdata
も含まれていますね。
不要なファイルができる原因
最初に
Git
のローカルリポジトリ
が作られた時点で、不要なファイルもバージョン管理下に置かれるのが原因です。そのままリモートリポジトリ
を作ると、当然これらのファイルもPush
されてしまいます。不要なファイルの追跡をやめるには、
.gitignore
ファイルを作成すればOKです。また、バージョン管理下から外すには、git rm --cashed
等のコマンドを使えば可能です。しかし、できれば最初から、不要なファイルはバージョン管理下に置かないようにしたいものです。
不要なリモートファイルを作らない手順
プロジェクトフォルダを指定する際、
「Create Git repository on my Mac」
にはチェックを入れないようにします。
バージョン管理を始める前に、.gitignore
ファイルを作ります。以下の例ではgibo
を使っていますが、既存のファイルをコピーしてもいいですし、エディタで自作しても構いません。
Xcode
のメニューから、[Souce Control]
-[Create Git Repositories...]
でローカルリポジトリ
を作ります。
Create
をクリックすると、ローカルリポジトリ
が作られます。この時点でバージョン管理を始めますが、すでに.gitignore
ファイルがあるため、不要ファイルがバージョン管理下に置かれることはありません。
左側のナビゲーターペイン
をSource Control Navigator
に切り替えて、Remotes
の右クリックメニューから[Create "プロジェクト名" Remote...]
でリモートリポジトリ
を作ります。
リモートリポジトリ
の名前を指定し、Create
で作成します。
不要なファイルがないリモートリポジトリ
ができました。
このように、Git
を使う前に.gitignore
ファイルを作っておくことで、不要なファイルをバージョン管理下に置かず、リモートリポジトリ
にもPush
させないようにすることができます。
- 投稿日:2019-05-26T00:39:41+09:00
Git 基本的なコマンド
Gitについて、事前に知っておくべきこと
- 現在のプロジェクトファイルがある「Working Directory」。
- Commitした、ソースコードを保存する「Repository」。
- 「Working Directory」と「Repository」間のバッファarea「Staging Area」。
- 「HEAD」は現在のブランチの最新のコミットを意味する。
- 既定のリモートリポジトリは、「origin」。
基本的なコマンド
git --version //現在のgitのバージョンを確認 git clone {url} //リモートリポジトリからクローンする git status //Localの変更を確認Log
git log //Commit Logを参照 git log --oneline //Commit LogのCommit IDを表示 git log --decorate //Commit LogのHEADを明示 git log --graph //Commit Logを縦グラフで表示Checkout
git checkout [branch] //ブランチを変更 git checkout -b [branch] //ブランチを作成&変更 git checkout -b [branch_B] [branch_A] //branch_Aから、branch_Bを作成&変更Add
git add //ファイルをadd git add [file]//ファイルをadd git commit -m “[comment]” //Commit messageを同時に指定Commit
git commit //ファイルをCommit git commit -m “[comment]” //Commit messageを同時に指定Push
git push //Repositoryで変更を反映 git push [repository] [branch] //リモートリポジトリに変更を反映Fetch
git fetch //Remote Repositoryの最新データを取ってくるPull
git pull //Remote Repositoryの変更インポートしてリモートブランチを更新Reset
git reset --soft HEAD^ //commitをcancelして、ファイルは「staged status」で、Working Directoryに保存 $ git reset --mixed HEAD^ //commitをcancelして、ファイルは「unstaged status」で、Working Directoryに保存 $ git reset HEAD^ //commitをcancelして、ファイルは「unstaged status」で、Working Directoryに保存 $ git reset HEAD~2 //最後の二つのcommitをcancel $ git reset --hard HEAD^ //commitをcancelして、ファイルは「unstaged status」で、Working Directoryから削除Revert
git revert [commit id] //commit idのcommitをcancelRebase
git rebase [branch] //branchにrebaseする git rebase --abort //直前のgit rebaseの編集を中止 git rebase --continue //rebaseを続けるMerge
$ git merge [branch] //現在のbranchを指定したbranchとMerge