Gitまとめ
いつも呪文のように唱えていたgit
のコマンドだけど、ようやく学ぶことができたのでメモ。
言葉の定義
- レポジトリ
Gitがファイルの履歴を保存している場所 - インデックス
リポジトリに保存されている情報とワークツリー(作業している場所)との差(変更箇所)を記録する場所 - ワークツリー
リポジトリの内容をファイルとして展開する場所
コマンド一覧
コマンド | 内容 |
---|---|
git init |
レポジトリを作成する |
git add |
コミット対象として登録する-u :変更したファイル全てをインデックに登録-A :全てのファイルをインデックスに登録 |
git commit |
インデックスの履歴をレポジトリに登録 |
git commit --amend |
直前のコミット漏れしたファイルを後で追加 |
git commit --amend -m |
直前コミットのコメント内容を``に変更 |
git revert |
``というコミットの取り消し |
git rebase -i HEAD~~ |
過去のコミットをまとめたり、修正したりする。 左記はHEADから2つ前まで。コミットをまとめるときは、 エディタが開いたら2つ目の pick をsquash に変更。コミットを修正するときは pick をedit に変更する詳細 |
git rebase |
``ブランチに現在いるブランチで行った全コミットを適応 |
git rebase |
base ブランチに`ブランチで行った全コミットを適応<br>( git checkout && git rebase `と同じ意味) |
git rm --cached -r . |
git init 直後の、git add を全て取り消し |
git rm --cached -r |
git init 直後の、git add のfname というファイルのみ取り消し |
git reset --mixed HEAD |
2回目以降にてgit add した内容を取り消し |
git reset --mixed HEAD |
2回目以降にてgit add したfname というファイルのみ取り消し |
git stash |
変更内容の退避。インデックス以下の変更全てが退避される。 |
git stash save "コメント" |
コメントを付けて変更内容を退避。 |
git stash apply |
退避した内容をステージング前の状態として取り出す。 取り出しても stash リストから削除しない--index をつけるとステージング後の状態として取り出す |
git stash pop |
基本apply と同じだが、取り出したらstash リストから削除する |
git stash clear |
stash リストを全て削除 |
git stash show |
退避した内容の詳細を見る |
git status |
ワークツリーの状態を表示する |
git diff |
ワークツリーとインデックスの差分を表示する |
git diff --cached |
インデックスとレポジトリの差分を表示する |
git diff HEAD |
ワークツリーとレポジトリ差分を比較する |
git log |
履歴を表示する |
git log --graph |
ブランチやマージの歴史を、ログ出力とともにアスキーグラフで表示する |
git branch |
ブランチの一覧を表示する-r をつけるとリモート追跡ブランチを表示 |
git branch |
`という新しいブランチを作る<br> -d`をつけるとブランチを削除する |
git branch -m |
ブランチ名変更(を へ) |
git checkout |
``ブランチに切り替える |
git checkout -b |
``ブランチを新しく作って、ブランチを切り替える |
git checkout -b / |
ブランチが、 リポジトリの``ブランチを追跡するように設定 |
git merge |
``ブランチを現在のブランチにマージ。 |
git push : |
変更履歴を送る |
git push --delete |
リポジトリの ブランチを削除 |
git clone |
レポジトリを複製する |
git remote add |
リモートレポジトリに別名をつける |
git remote -v |
レポジトリの別名を一覧表示する |
git remote rename |
リモートレポジトリの別名を変更したい |
git fetch |
他レポジトリの変更履歴を取込む 変更反映は merge |
git pull |
別名 の``というブランチを現在のブランチに取り込む |
git tag |
タグ一覧を表示する-n をつけてコメント表示 |
git tag |
現在のHEADが差しているコミットに``という軽量タグをつける |
git tag -a |
注釈付きタグをつける。-am でタグ名とコメント追加を一緒に行う |
git tag -a |
昔のコミットにタグを付ける。check sum はgit log --pretty=oneline で確認できる |
git tag -d |
タグの削除 |
git push |
に``というタグ名でpush |
Git ローカルレポジトリへのcommit
、リモートレポジトリへのpush
上に書いたコマンド一覧だけだと、後で見たときに『結局どういうふうに使うんだっけ?😅』となりそうなので、大まかな流れと実際に試した例を載せておく。
git init
で空レポジトリを作成git init
したディレクトリで、必要なファイル作成やコピーを行うgit add
で2.で更新したファイル群をワークツリーからインデックスへ追加git commit
でインデックスの内容をローカルレポジトリへ追加git remote
でリモートレポジトリに別名をつけてgit push
時の入力手間軽減git push
でローカルレポジトリの内容をリモートレポジトリへ反映
$ git init Initialized empty Git repository in /home/goruchan/git/hoge/.git/ $ git branch -m main <--デフォルトブランチ名をmainに設定 $ git branch <--レポジトリが空なのでbranchは出てこない $ ls -la total 12 drwxr-xr-x 3 goruchan goruchan 4096 Dec 27 22:11 . drwxr-xr-x 3 goruchan goruchan 4096 Dec 27 22:10 .. drwxr-xr-x 7 goruchan goruchan 4096 Dec 27 22:13 .git<--レポジトリ $ touch readme.md $ git add readme.md <---リポジトリに履歴にとして追加 $ git status On branch main No commits yet $ git branch $ git commit -m "add readme.md" [main (root-commit) 0e4504d] add readme.md 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 readme.md $ git branch * main $ git branch develop <--developブランチ作成 $ git checkout develop <--developブランチへ切り替え Switched to branch 'develop' $ touch hoge.md $ git add -A $ git commit -m 'add hoge.md' [develop 4260a4d] add hoge.md 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 hoge.md $ git checkout main <--mainブランチへ切り替え Switched to branch 'main' $ git branch develop * main $ git merge develop <--developブランチをmainブランチへ取り込む Updating 4a14ed8..4260a4d Fast-forward hoge.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 hoge.md $ ls hoge.md readme.md $ git branch -d develop <--developブランチの削除 Deleted branch develop (was 4260a4d). $ git remote add origin git@github.com:goruchanchan/gitPractice.git <--originをリポジトリパスとして設定(この場合、Github上のレポジトリ) $ git push -u origin main main Branch 'main' set up to track remote branch 'main' from 'origin'.
あと、大雑把なワークフローのイメージをまとめてみた。全体的な流れを大雑把に理解して、あとは今後のプラクティスで定着させていこう😀
fetch
についてもう少し細かく書くと、リモートレポジトリからのfetch
でやっているのは、リモートレポジトリの最新状況をローカル内に引っ張ってくるところまでで、現在作業しているレポジトリに対してのマージは実施しない。参考
また、コミットの取り消しについては、こちらの内容が参考になった。
競合時の解決方法
git fetch
git merge
- 競合の修正
- 後はいつもの手順(
add
→commit
→push
)
$ git push origin tutorial3:tutorial3 error: failed to push some refs to 'github.com:goruchanchan/gitPractice.git' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. $ git fetch remote: Enumerating objects: 3, done. remote: Counting objects: 100% (3/3), done. remote: Compressing objects: 100% (1/1), done. remote: Total 2 (delta 1), reused 2 (delta 1), pack-reused 0 Unpacking objects: 100% (2/2), 299 bytes | 299.00 KiB/s, done. From github.com:goruchanchan/gitPractice f59c3b9..6ba99fe tutorial3 -> origin/tutorial3 $ git merge origin/tutorial3 Auto-merging test.txt CONFLICT (content): Merge conflict in test.txt Automatic merge failed; fix conflicts and then commit the result. $ vim test.txt $ git add . $ git commit [tutorial3 c65231e] Merge remote-tracking branch 'origin/tutorial3' into tutorial3 $ git push Enumerating objects: 8, done. Counting objects: 100% (8/8), done. Compressing objects: 100% (3/3), done. Writing objects: 100% (4/4), 629 bytes | 629.00 KiB/s, done. Total 4 (delta 1), reused 0 (delta 0), pack-reused 0 remote: Resolving deltas: 100% (1/1), completed with 1 local object. To github.com:goruchanchan/gitPractice.git 6ba99fe..c65231e tutorial3 -> tutorial3
競合時のイベントシーケンスはここの内容がとてもわかりやすいので、記載しておく。
同じところにチームで機能開発している場合のワークフローもあったので、参考として載せておく。
Git用のエリアスの設定
大きく2つのやり方でGit用のエイリアスを設定できる。
コマンドで追加
$ git config --global alias.br branch $ git config --global alias.ci commit
.gitconfig
ファイルに直接記入
コマンド追加を実行したときには、結局.gitconfig
に追加してくれているだけっぽいので、直接そのファイルに書き込んでしまっても設定できる。[alias]
部分にエイリアスを設定してあげれば良い。ちなみにbr
とst
は上のコマンドで追加したままのもの。
# This is Git's per-user configuration file.
[user]
# Please adapt and uncomment the following lines:
name = goruchan
email = xxx@xxx.xxx.xxx
[color]
ui = auto
[core]
editor = vim
[alias]
br = branch
st = status
last = log -1 HEAD