gitわからなすぎ問題
gitって初心者殺しだよなって思ったのでこれを期に一から学び直す。
こういう抽象的、概念的な技術は触って失敗することで覚えるべき。
git init
これは後述のgit cloneしてくれば.gitディレクトリごとごっそり持ってくることになるので不要だが念のため。
最初に作成したプロジェクトをpushするときにそのディレクトリ以下のファイルを事前にgitの管理下に置くためのコマンド。
# git_testディレクトリを作成
vagrant@ubuntu-xenial:~/project$ mkdir git_test
# ディレクトリを確認
vagrant@ubuntu-xenial:~/project$ ls -la
total 12
drwxrwxr-x 3 vagrant vagrant 4096 Aug 20 08:37 .
drwxr-xr-x 13 vagrant vagrant 4096 Aug 20 08:37 ..
drwxrwxr-x 2 vagrant vagrant 4096 Aug 20 08:37 git_test
# git_testディレクトリに降りる
vagrant@ubuntu-xenial:~/project$ cd git_test/
# 何もないことを確認
vagrant@ubuntu-xenial:~/project/git_test$ ls -la
total 8
drwxrwxr-x 2 vagrant vagrant 4096 Aug 20 08:37 .
drwxrwxr-x 3 vagrant vagrant 4096 Aug 20 08:37 ..
# git_testディレクトリ以下をgitの管理下に置く
vagrant@ubuntu-xenial:~/project/git_test$ git init
Initialized empty Git repository in /home/vagrant/project/git_test/.git/
# .git以下のディレクトリ構成
vagrant@ubuntu-xenial:~/project/git_test$ cat .git/
branches/ config description HEAD hooks/ info/ objects/ refs/
# プロジェクト領域の設定を確認(初期設定値)
vagrant@ubuntu-xenial:~/project/git_test$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
git config
これはgitでpushしたりする(後述)ときに誰のコミットなのかを事前に登録しておく手順。
だいたいプロジェクトでuser.nameは「名前.苗字」みたいにしてねとかルールがあるはずだからさらっとやっておく。
git config --list
現在のgitの設定をリスト形式で表示するオプションが--list。
vagrant@ubuntu-xenial:~$ git config --list
user.email=dammy@gmail.com
user.name=taaaak # aが4つ
git config --global 設定値
複数のリモートリポジトリで同じconfig設定を適用する場合、--globalオプションを利用する。
# マシンでgitを使用する際の名前を設定する(上書き)
vagrant@ubuntu-xenial:~$ git config --global user.name "taaaaak" # aが5つ
# 再度設定を表示
vagrant@ubuntu-xenial:~$ git config --list
user.email=dammy@gmail.com
user.name=taaaaak # 変わった
# .gitconfigファイルに設定を反映される(ここがグローバル領域)
vagrant@ubuntu-xenial:~$ cat ~/.gitconfig
[user]
email = dammy@gmail.com
name = taaaaak
git config 設定値
個別でconfig設定を適用する場合、そのプロジェクトのルートディレクトリでオプションをつけずにコマンドを実行する。
# プロジェクトルートまで降りる
vagrant@ubuntu-xenial:~$ cd tmp/project/ajaxapi/
# 設定を表示
vagrant@ubuntu-xenial:~/tmp/project/ajaxapi$ git config --list
user.email=dammy@gmail.com
user.name=taaaaak
core.editor=vim -f
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.url=git@github.com:taaaaak/ajaxapi.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
# このプロジェクトを使用する際の名前を設定する
vagrant@ubuntu-xenial:~/tmp/project/ajaxapi$ git config user.name "Taaaak"
vagrant@ubuntu-xenial:~/tmp/project/ajaxapi$ git config --list
user.email=dammy@gmail.com
user.name=taaaaak
core.editor=vim -f
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.url=git@github.com:taaaaak/ajaxapi.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
user.name=taaaak # 追加される
# グローバル領域は変化なし
vagrant@ubuntu-xenial:~/tmp/project/ajaxapi$ cat ~/.gitconfig
[user]
email = dammy@gmail.com
name = taaaaak # 変化なし
# ローカル領域?プロジェクト領域?にtaaaakが追加される
vagrant@ubuntu-xenial:~/tmp/project/ajaxapi$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
[remote "origin"]
url = git@github.com:taaaaak/ajaxapi.git
fetch = +refs/heads/*:refs/remotes/origin/*
[user]
name = taaaak
git clone URL(※URLの部分は適宜自分の環境に読み替えること)
リモートリポジトリのプロジェクトファイルをごっそりローカルリポジトリにクローン(コピー)するコマンド。
上述のgit initするとできる.gitディレクトリや.gitignoreファイルなどgitでプロジェクト管理するために必要なものも入ってるはずなのでこれをやれば優しい世界になる。
# リモートリポジトリから現在のディレクトリにクローンする
vagrant@ubuntu-xenial:~/project$ git clone git@github.com:taaaaak/ajaxapi.git
Cloning into 'ajaxapi'...
remote: Counting objects: 93, done.
remote: Compressing objects: 100% (78/78), done.
remote: Total 93 (delta 2), reused 93 (delta 2), pack-reused 0
Receiving objects: 100% (93/93), 22.88 KiB | 0 bytes/s, done.
Resolving deltas: 100% (2/2), done.
Checking connectivity... done.
vagrant@ubuntu-xenial:~/project$ ls -la
total 16
drwxrwxr-x 4 vagrant vagrant 4096 Aug 20 16:52 .
drwxr-xr-x 13 vagrant vagrant 4096 Aug 20 16:27 ..
drwxrwxr-x 13 vagrant vagrant 4096 Aug 20 16:52 ajaxapi # 作成された
drwxrwxr-x 3 vagrant vagrant 4096 Aug 20 09:27 git_test
git add
ワーキングツリーからステージング領域に変更点を上げるためのコマンド。
本来はここに積み上げられた変更点をまとめてコミットするための領域だが、addとcommitを同時にやることも多い(後述)。
git add -A
変更点のみワーキングツリーからステージングエリアにのせるオプション。
git add .
はカレントディレクトリ以下全て、-Aは変更点のみ。
vagrant@ubuntu-xenial:~/project/git_test$ vi a.txt
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt
aaa
vagrant@ubuntu-xenial:~/project/git_test$ git add -A
git commit
ステージングエリアに溜まった変更を機能単位でローカルリポジトリにコミットするためのコマンド。
git commit -m "コメント"
コミットの際にあらかじめコメントを書いておくためのオプション。
これがない場合、nanoやvimが開き、エディタ上でコメントしないといけない。
正直慣れていたとしても面倒なのでコメントはcommitのタイミングで書いておくのがいい。
vagrant@ubuntu-xenial:~/project/git_test$ git commit -m "a.txtを作成(1:aaa)"
[master (root-commit) 3e924c2] a.txtを作成(1:aaa)
1 file changed, 1 insertion(+)
create mode 100644 a.txt
git commit --amend
前回のコミットに変更点を追加するときに使うコマンド。
コミットハッシュは変わる。
コメントを変更しない場合は、--no-editを使う。
git remote add
git initしたあとに行うコマンド(add, commitした後にやってもいい)。
これでローカルリポジトリとリモートリポジトリの紐付けを行う。
originはURLの別名で、git pushなどリモートリポジトリへの変更をするようなコマンドを実行するときにこの別名を使って実行できるようになる。
これから楽をするためのエイリアスみたいなやつ。
git remote add origin リモートリポジトリ名
リモートリポジトリはhttp://~でもgit@~でもどちらでもOK。
vagrant@ubuntu-xenial:~/project/git_test$ git remote add origin git@github.com:taaaaak/git_test.git
git push
ローカルリポジトリのコミットをリモートリポジトリに反映させるコマンド。
git push -u origin ブランチ名
-uオプションはupstream(上流ブランチ)を指定するもので、以降は何も指定しなければリモートのmasterブランチにpushされる。
vagrant@ubuntu-xenial:~/project/git_test$ git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 235 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:taaaaak/git_test.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
git checkout
git checkout branch名
ブランチを切り替えるためのコマンド。
git checkout file名
ファイル名を指定した場合はHEADと同じ状態に戻すコマンド。
git checkout .
でワーキングツリーを最後のコミットの状態に戻す。
git checkout -b branch名
チーム開発においてmasterブランチで作業することはタブーのため、自分用の作業ブランチを切るときに使う。
本当はgit branch buranch名で作業ブランチを作成できるが、-bオプションで作成したブランチに移動するまで一度にやってくれる。
派生元を指定する場合は最後に派生元を追加する。
git checkout -b ticket/branch_2 origin/ticket/branch_1
vagrant@ubuntu-xenial:~/project/git_test$ git checkout -b ticket/001
Switched to a new branch 'ticket/001'
git branch
ブランチの操作をするためのコマンド。
ブランチを作ったり、削除したり、一覧表示したりできる。
git branch -a
git branchは現在のローカルブランチを全て一覧表示するコマンドだが、-aオプションでリモートの追跡をするローカルブランチも含めて一覧表示するためのコマンド。
追跡ブランチはremotes/origin/masterのように先頭ディレクトリにremotesが入ってる。
vagrant@ubuntu-xenial:~/project/git_test$ git branch -a
master
* ticket/001
remotes/origin/master
git branch -d branch名
リモートリポジトリにpush済みのローカルブランチを削除するためのコマンド。
このコマンドを実行するには、master等のブランチに移動しておく必要がある。
push等反映されていない場合、強制削除するには-dの代わりに-Dオプションを実行する。
# リモートに変更点をマージしたのでいらないから消す
vagrant@ubuntu-xenial:~/project/git_test$ git branch -d ticket/001
Deleted branch ticket/001 (was 99c6f3f).
vagrant@ubuntu-xenial:~/project/git_test$ git branch -a
* master
# なくなった
remotes/origin/master
remotes/origin/ticket/001
git branch -dr 追跡ブランチ名
上記で残った追跡ブランチを削除するためのコマンド。
vagrant@ubuntu-xenial:~/project/git_test$ git branch -dr origin/ticket/001
Deleted remote-tracking branch origin/ticket/001 (was 99c6f3f).
vagrant@ubuntu-xenial:~/project/git_test$ git branch -a
* master
remotes/origin/master
# なくなった
git pull
リモートの最新ブランチをfetchしてmergeするコマンド。
fetchは追跡ブランチをリモートの最新と同期すること。
mergeはそれを現在のブランチに反映(差分更新)させること。
ほかのブランチには反映させない。
vagrant@ubuntu-xenial:~/project/git_test$ vi a.txt
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt
aaa
bbb
# addをせずに直接ローカルリポジトリに変更点をコミットするには-aオプションをつける
vagrant@ubuntu-xenial:~/project/git_test$ git commit -am "add record 'bbb' in 2line to a.txt"
[ticket/001 99c6f3f] add record 'bbb' in 2line to a.txt
1 file changed, 1 insertion(+)
# github-flowにしたがってリモートのticket/001にpush
vagrant@ubuntu-xenial:~/project/git_test$ git push origin ticket/001
Counting objects: 3, done.
Writing objects: 100% (3/3), 261 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:taaaaak/git_test.git
* [new branch] ticket/001 -> ticket/001
# リモートリポジトリのmasterブランチにticket/001の変更をマージ(プルリクエスト)
※GitHub上での作業
# ローカルのmasterに移動
vagrant@ubuntu-xenial:~/project/git_test$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt
aaa
# 上流ブランチ(リモートのmaster)から変更をpull
vagrant@ubuntu-xenial:~/project/git_test$ git pull
remote: Counting objects: 1, done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (1/1), done.
From github.com:taaaaak/git_test
3e924c2..ba2b172 master -> origin/master
Updating 3e924c2..ba2b172
Fast-forward
a.txt | 1 +
1 file changed, 1 insertion(+)
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt
aaa
bbb # mergeされた
vagrant@ubuntu-xenial:~/project/git_test$ git branch -a
* master
ticket/001
remotes/origin/master
remotes/origin/ticket/001 # fetchした
git status
現在のワークツリー、ステージングの状態を表示するコマンド。
# ワークツリー上で作業中のときのステータス
vagrant@ubuntu-xenial:~/project/git_test$ git status
On branch ticket/001
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: a.txt
no changes added to commit (use "git add" and/or "git commit -a")
vagrant@ubuntu-xenial:~/project/git_test$ git add -A
# ステージング領域に変更点が積まれたときのステータス
vagrant@ubuntu-xenial:~/project/git_test$ git status
On branch ticket/001
Changes to be committed: # コミット対象に指定されていて、コミット待ちだよって意味
(use "git reset HEAD <file>..." to unstage)
modified: a.txt
# コミット後のステータス
vagrant@ubuntu-xenial:~/project/git_test$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
git log
現在のブランチの変更履歴を表示するコマンド。
vagrant@ubuntu-xenial:~/project/git_test$ git log
commit ba2b1720e218f82afe2645635836bf7b9ad08bdd
Merge: 3e924c2 99c6f3f
Author: taaaaak <dammy@gmail.com>
Date: Mon Aug 20 09:23:26 2018 +0900
Merge pull request #1 from taaaaak/ticket/001
add record 'bbb' in 2line to a.txt
commit 99c6f3f27aebad184620e35874f80a60d4780864
Author: taaaaak <dammy@gmail.com>
Date: Mon Aug 20 09:15:14 2018 +0900
add record 'bbb' in 2line to a.txt
commit 3e924c2fb1438461a8eaaa1ea7ced35c82b7d999
Author: taaaaak <dammy@gmail.com>
Date: Mon Aug 20 08:54:07 2018 +0900
a.txtを作成(1:aaa)
git log --one-line
コミット履歴が1行ごとに表示される。
git log --graph --all --format="%x09%an%x09%h %d %s"
git logをtigみたいにするワンライナー
git diff
変更箇所を表示させるコマンド。
ワーキングツリーにしかなければオプションなしで変更点が表示される。
git diff HEAD^..HEAD
コミット済みの最新のコミットの変更点とその一つ前の変更点を比較するコマンド。
一つ前は"^"だが、2つ以上前のコミットと比較する場合、"~2"みたいに書く。
比較演算子?".."を基準に右が最新、左が比較元で覚える(本質はdiffなのでどちらでもいいが)。
".."ではなく、" "(半角スペース)で区切ってもいい。
# 現在のブランチと一つ前の差分を確認
vagrant@ubuntu-xenial:~/project/git_test$ git diff HEAD^..HEAD
diff --git a/a.txt b/a.txt
index 72943a1..dbee026 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1,2 @@
aaa
+bbb
vagrant@ubuntu-xenial:~/project/git_test$ git checkout -b ticket/002
Switched to a new branch 'ticket/002'
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt
aaa
bbb
# 3行目にcccdddを追加
vagrant@ubuntu-xenial:~/project/git_test$ vi a.txt
# 未コミットの現在のブランチの差分を確認
vagrant@ubuntu-xenial:~/project/git_test$ git diff
diff --git a/a.txt b/a.txt
index dbee026..1802a74 100644
--- a/a.txt
+++ b/a.txt
@@ -1,2 +1,3 @@
aaa
bbb
+cccddd
# ブランチ同士で差分をとる(masterをちょっと進めた)
vagrant@ubuntu-xenial:~/project/git_test$ git diff ticket/002 master
diff --git a/a.txt b/a.txt
index 45240d3..20536af 100644
--- a/a.txt
+++ b/a.txt
@@ -1,3 +1,3 @@
aaa
bbb
-fffggg # masterの進めた差分
+cccddd # 今回進めたticket/002の差分
# コミット済みの場合何も表示されない
vagrant@ubuntu-xenial:~/project/git_test$ git diff
git merge
指定したブランチを今いるブランチにマージ(合体)させるためのコマンド。
変更点でコンフリクトがなければ自動的にマージしてくれる。
github-flowではこのコマンドは不要。
git merge branch名
# masterブランチに移動
vagrant@ubuntu-xenial:~/project/git_test$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
# ticket/002をmasterにマージ
vagrant@ubuntu-xenial:~/project/git_test$ git merge ticket/002
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt # コンフリクト(衝突)した
Automatic merge failed; fix conflicts and then commit the result.
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt
aaa
bbb
<<<<<<< HEAD
cccddd
=======
fffggg
>>>>>>> ticket/002
# 両方を利用してcccdddfffgggにした
vagrant@ubuntu-xenial:~/project/git_test$ vi a.txt
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt
aaa
bbb
cccdddfffggg
# 衝突を修正したらaddしろと言われる
vagrant@ubuntu-xenial:~/project/git_test$ git merge ticket/002
error: merge is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.
vagrant@ubuntu-xenial:~/project/git_test$ git add -A
# 当然commitしろと言われる
vagrant@ubuntu-xenial:~/project/git_test$ git merge ticket/002
fatal: You have not concluded your merge (MERGE_HEAD exists).
Please, commit your changes before you merge.
vagrant@ubuntu-xenial:~/project/git_test$ git commit -m "コンフリクトを解消"
[master 7c83e5b] コンフリクトを解消
# ようやくマージできた
vagrant@ubuntu-xenial:~/project/git_test$ git merge ticket/002
Already up-to-date.
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt
aaa
bbb
cccdddfffggg
eeeee
git merge --no--ff branch名
--no-ff
はnon fast-fowardの略。
枝分かれしない場合のマージはマージしない(わかりづらいかw)。
枝分かれする場合のマージのみマージする。
git merge --ff-only branch名
--ff-only
はfast-foward onlyの略。
枝分かれする場合のマージはマージしない。
枝分かれしない場合のマージのみマージする。
マージ元ブランチの霊圧が消えるからエンジニアからは嫌われる。
git revert
コミットを指定して打ち消しコミットを実行するコマンド。
後述のresetがコミットをなかったものにするのに対してこっちは打ち消しコミットを作るのでコミット履歴が残る。
リモートリポジトリにコミットが残ってしまっている場合はこっちをするのが無難。
同じ要領でresetして強制pushすると嫌な顔をされる。
git reset
commitをなかったことにするコマンド。
revertは元に戻す(=履歴は残る)が、こちらは残らない。
ローカルでいくらやっても問題ないけど、リモートにpush済みのコミットに対してこれやると「クソが!」って思われる。
意地悪をしたい先輩がいたらやってもいい。
もし戻したくなったらgit reflogする(後述)。
git reset (--mixed) HEAD^
一つ前のコミットの変更をワーキングツリーまで戻すコマンド。
--mixed
はデフォなのでなくてもいい。
# ひとまずコミット
vagrant@ubuntu-xenial:~/project/git_test$ git commit -am "reset用"
[master efb52b5] reset用
1 file changed, 1 insertion(+)
# ワーキングツリーまで変更を戻す
vagrant@ubuntu-xenial:~/project/git_test$ git reset --mixed HEAD^
Unstaged changes after reset:
M a.txt
# 確認してみる
vagrant@ubuntu-xenial:~/project/git_test$ git status
On branch master
Your branch is up-to-date with 'origin/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: a.txt
no changes added to commit (use "git add" and/or "git commit -a")
git reset --soft HEAD^
ステージングエリアまで変更を戻すコマンド。
# もう一回コミット
agrant@ubuntu-xenial:~/project/git_test$ git add -A
vagrant@ubuntu-xenial:~/project/git_test$ git commit -m "reset用2"
[master e54a719] reset用2
1 file changed, 1 insertion(+)
# ステージングエリアまで戻す
vagrant@ubuntu-xenial:~/project/git_test$ git reset --soft HEAD^
# 確認してみる
vagrant@ubuntu-xenial:~/project/git_test$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: a.txt
git reset --hard HEAD^
現在のブランチを一つ前のコミットまで戻すコマンド。
変更点もリセットされるので修正中の場合注意して行うこと。
# もう一回コミット
vagrant@ubuntu-xenial:~/project/git_test$ git commit -m "reset用3"
[master ac60662] reset用3
1 file changed, 1 insertion(+)
# 一個前のコミットまで戻す
vagrant@ubuntu-xenial:~/project/git_test$ git reset --hard HEAD^
HEAD is now at 7c83e5b コンフリクトを解消
vagrant@ubuntu-xenial:~/project/git_test$ git status
On branch master
Your branch is up-to-date with 'origin/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: a.txt
no changes added to commit (use "git add" and/or "git commit -a")
vagrant@ubuntu-xenial:~/project/git_test$ git commit -a --amend --no-edit
[master b945782] コンフリクトを解消
Date: Mon Aug 20 17:48:26 2018 +0900
vagrant@ubuntu-xenial:~/project/git_test$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
(use "git pull" to merge the remote branch into yours)
nothing to commit, working directory clean
git rebase
ブランチを違うブランチに付け替えるコマンド。
分岐した兄弟ブランチ同士で変更を統合させたり不要なブランチを取りこんだりするときに使う。
git rebase -i
対話的にリベースするコマンド。
git rebase --continue
リベース作業を確定させるオプション。
git reflog
今までの変更履歴を全て表示させるコマンド。
git resetで削除したコミットを復活させることもできる。
vagrant@ubuntu-xenial:~/project/git_test$ git reflog
7c83e5b HEAD@{0}: checkout: moving from ticket/003 to master
7c83e5b HEAD@{1}: checkout: moving from master to ticket/003
7c83e5b HEAD@{2}: checkout: moving from a to master
7c83e5b HEAD@{3}: checkout: moving from master to a
7c83e5b HEAD@{4}: checkout: moving from ticket/002 to master
aa6eb6b HEAD@{5}: checkout: moving from master to ticket/002
7c83e5b HEAD@{6}: commit (merge): コンフリクトを解消
060d820 HEAD@{7}: checkout: moving from ticket/002 to master
aa6eb6b HEAD@{8}: commit: add record 3:eeefff to a.txt
ba2b172 HEAD@{9}: checkout: moving from master to ticket/002
060d820 HEAD@{10}: commit: add record 3:cccddd to a.txt
f3fb39c HEAD@{11}: commit: add record 3:ccc to a.txt
ba2b172 HEAD@{12}: checkout: moving from ticket/003 to master
ba2b172 HEAD@{13}: checkout: moving from ticket/002 to ticket/003
ba2b172 HEAD@{14}: checkout: moving from master to ticket/002
ba2b172 HEAD@{15}: pull: Fast-forward
3e924c2 HEAD@{16}: checkout: moving from ticket/001 to master
99c6f3f HEAD@{17}: commit: add record 'bbb' in 2line to a.txt
3e924c2 HEAD@{18}: checkout: moving from master to ticket/001
3e924c2 HEAD@{19}: commit (initial): a.txtを作成(1:aaa)
git blame ファイル名
ファイルの変更履歴を行単位で確認できる。
ここでコミットハッシュ値を取得してからgit show
すると幸せになれる。
git show コミットハッシュ
ローカルリポジトリのコミット情報を取得するためのコマンド。
何も指定しなければ、直近のコミット情報を取得する。
vagrant@ubuntu-xenial:~/project/git_test$ git show
commit 7c83e5b38f2d22463d5cebabc23866d556f400ce
Merge: 060d820 aa6eb6b
Author: taaaaak <dammy@gmail.com>
Date: Mon Aug 20 17:48:26 2018 +0900
コンフリクトを解消
diff --cc a.txt
index 20536af,45240d3..cac8aec
--- a/a.txt
+++ b/a.txt
@@@ -1,3 -1,3 +1,3 @@@
aaa
bbb
- cccddd
-fffggg
++cccdddfffggg
git remote show コミットハッシュ
リモートリポジトリの情報を取得するためのコマンド。
vagrant@ubuntu-xenial:~/project/git_test$ git remote show
origin
vagrant@ubuntu-xenial:~/project/git_test$ git remote show origin
* remote origin
Fetch URL: git@github.com:taaaaak/git_test.git
Push URL: git@github.com:taaaaak/git_test.git
HEAD branch: master
Remote branches:
master tracked
ticket/002 tracked
Local branches configured for 'git pull':
master merges with remote master
ticket/002 merges with remote ticket/002
Local refs configured for 'git push':
master pushes to master (up to date)
ticket/002 pushes to ticket/002 (up to date)
git fetch
リモートリポジトリのブランチをローカルリポジトリと同期してくれる。
どのディレクトリでやっても同じ。
git fetch --prune
リモートリポジトリで削除されたブランチをfetchしたら(同一の)ローカルブランチを消してくれる。
git管理下のファイルやファイル内の名前から該当の文字列を検索して表示してくれる。
むっちゃ使う。
git show-branch
編集中
vagrant@ubuntu-xenial:~/project/git_test$ git show-branch
* [master] コンフリクトを解消
! [ticket/002] add record 3:eeefff to a.txt
! [ticket/003] コンフリクトを解消
! [ticket/004] a.txtを作成(1:aaa)
----
- [master] コンフリクトを解消
- [ticket/003] コンフリクトを解消
*++ [ticket/002] add record 3:eeefff to a.txt
* + [master^] add record 3:cccddd to a.txt
* + [master~2] add record 3:ccc to a.txt
--- [master~3] Merge pull request #1 from taaaaak/ticket/001
*++ [master~3^2] add record 'bbb' in 2line to a.txt
*+++ [ticket/004] a.txtを作成(1:aaa)
次やる
tigの使い方
参考にした
qiita.com