Gitのコマンド操作よくわからなくて、なんだか怖い。Gitでよく出るコマンドやトラブった時に役立つ情報を知りたいなぁ….
Gitの操作はエンジニアになったばかりだと、なかなか覚えられなくて苦労しますよね….
コマンド操作が苦手で、コマンドではなくてSorceTreeやGithub Desktopなどを活用して避けている方もいるでしょう。
ただ、いざそれらが使えない現場に出くわした時に、Gitコマンドが使えないと恥ずかしいですよね。
今回は、頻出のGitコマンド、トラブった時の対処法などを解説します。
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
頻出のGitコマンド
git clone
git cloneでリポジトリをコピーしましょう。
% git clone {リポジトリのURL}
例①http
% git clone https://github.com/githubユーザー名/test_app.git
例②ssh
% git clone git@github.com:githubユーザー名/test_app.git
名称を変更してgit cloneすることもできます。
% git clone https://github.com/testuser/test_app.git 変更したいアプリ名
例)
% git clone https://github.com/testuser/test_app.git blogs
test_appではなく、blogsの名前でgit cloneできます。
git branch系
git branch
まずは、自分が今いるブランチをgit branchで確認しましょう。
% git branch
// 現在いるブランチに*がつく。
* feature_test
main
git branch -a
ローカルブランチとリモートブランチ全て表示します。
% git branch -a
feature_test1
feature_test2
* main
remotes/origin/HEAD -> origin/main
remotes/origin/main
git branch ブランチ名
ブランチを新規作成するけど、チェックアウトしません。
% git branch feature_test3
(git branchで今いるブランチを確認)
% git branch
feature_test1
feature_test2
feature_test3
* main
git branch -d ブランチ名
ブランチを削除します。※git branch -D ブランチ名で強制削除
% git branch -d feature_test3
Deleted branch feature_test3 (was 12fe7df).
% git branch
feature_test1
feature_test2
* main
git branch -m 変更前のブランチ名 変更後のブランチ名
ブランチ名を変更します。
% git branch
feature_test1
feature_test2
* main
git branch -m feature_test2 feature_test4
% git branch
feature_test1
feature_test4
* main
git checkout系
git checkout ブランチ名
ブランチ名にチェックアウトします。以下では、mainブランチからfeature_test1ブランチに切り替わっていることが確認できますね。
% git checkout feature_test1
Switched to branch 'feature_test1'
% git branch
* feature_test1
feature_test4
main
git checkout -b ブランチ名
ブランチ名を新規作成し、かつブランチにチェックアウトします。
以下では、feature_test1ブランチにいる状況から、コマンドを実行してブランチを新規作成、さらにチェックアウトできています。
% git branch
* feature_test1
feature_test4
main
% git checkout -b feature_test2
Switched to a new branch 'feature_test2'
% git branch
feature_test1
* feature_test2
feature_test4
main
git status系
git status
変更されたファイルを出力します。
※git commitされる前のファイルが対象
% git status
On branch main
Your branch is up to date with 'origin/main'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: src/App.vue
no changes added to commit (use "git add" and/or "git commit -a")
git status -s
git statusをコンパクトにして出力します。
※変更されたファイル名のみ出力してくれます。
% git status -s
M src/App.vue
git add系
git add .
変更したファイルを全てステージに追加します。
% git status -s
?? public/sample.html
?? public/test.html
% git add .
% git status -s
A public/sample.html
A public/test.html
git add ファイル名
特定のファイル名をステージに追加します。
% git status -s
?? public/sample.html
?? public/test.html
% git add public/sample.html
% git status -s
A public/sample.html
?? public/test.html
複数の特定ファイルを追加したい場合は、以下のようにします。
git add ファイル名 ファイル名 ファイル名....
git commit系
git commit
エディタを開いて、コミットメッセージを入力しコミットします。
git commitを実行すると、エディタが開くので、コミットメッセージを入力するために、インサートモードにします。(iを押す。)
コミットメッセージを入力します。(ここではファイルの追加としました。)
escキーを押し、:wqで保存すればコミット実行です。
ファイルの追加
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Committer: kamoto <kamototakahiro@kamototakahironoMacBook-Air.local>
#
# On branch main
# Your branch is up to date with 'origin/main'.
#
# Changes to be committed:
# new file: public/sample.html
# new file: public/test.html
#
~
~
~
~
~
~
~
~
~
~
-- INSERT --
git commit -m “コミットメッセージ”
commitとコミットメッセージを同時に行います。上記のようにエディタを開く必要もないです。
% git commit -m "ファイルの追加"
git push系
git push origin ローカルブランチ
push系のコマンドで、Githubにあるリモートブランチにソースをアップできます。
前提として、ローカルブランチを作成→コミットまで行いましょう。
% git branch
* main
% git checkout -b feature_push
Switched to a new branch 'feature_push'
% git branch
* feature_push
main
(ファイルを適当に変更します。今回はindex.htmlを変更してみました。)
% git status -s
M public/index.html
% git add .
% git commit -m "プッシュテスト"
[feature_push 3ae42b5] プッシュテスト
git config --global user.name "Your Name"
git config --global user.email you@example.com
After doing this, you may fix the identity used for this commit with:
git commit --amend --reset-author
1 file changed, 1 insertion(+), 1 deletion(-)
(コミットまで行いました。)
これまでの復習でブランチ作成→コミットまで行いましたので、プッシュしてリモートブランチにアップしましょう。
% git branch
* feature_push
main
% git push origin feature_push
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 4 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 406 bytes | 135.00 KiB/s, done.
Total 4 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
remote:
remote: Create a pull request for 'feature_push' on GitHub by visiting:
remote: https://github.com/〇〇/pull/new/feature_push
remote:
To
* [new branch] feature_push -> feature_push
プッシュに成功しました。
Githubを確認すると、新たにfeature_pushリモートブランチが作成されてソースが反映されています。
mainブランチにプッシュなら、git push origin mainになります。
git push -d origin リモートブランチ名
リモートブランチを削除するコマンドです。
% git push -d origin feature_push
To ××.git
- [deleted] feature_push
git pull系
git pull origin main
mainブランチの内容を取り込む
(mainブランチにチェックアウトする)
% git branch
* main
% git pull origin main
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (1/1), 657 bytes | 328.00 KiB/s, done.
From 〇〇
* branch main -> FETCH_HEAD
d11c4f0..7dad3fe main -> origin/main
Updating d11c4f0..7dad3fe
Fast-forward
public/index.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
プルできて、mainブランチを最新にできました。
git stash系
git stash list
スタッシュしたリストを表示します。
% git stash list
stash@{0}: On main: スタッシュテスト
git stash push -m メッセージ
メッセージ付きでスタッシュができます。
% git status -s
?? test.html
% git add .
% git stash push -m "スタッシュテスト"
Saved working directory and index state On main: スタッシュテスト
% git stash list
stash@{0}: On main: スタッシュテスト
スタッシュテストという名前でスタッシュができました。
git stash apply stash名(stash@{0}となっている方)
スタッシュを適用し、スタッシュリストも残しておく
% git stash push -m "スタッシュリスト"
Saved working directory and index state On main: スタッシュリスト
% git stash list
stash@{0}: On main: スタッシュリスト
% git stash apply stash@{0}
On branch main
Your branch is up to date with 'origin/main'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: test.html
% git stash list
stash@{0}: On main: スタッシュリスト←スタッシュリストも残っている。
git log系
git log
過去のコミット履歴を表示します。
% git log
commit 7dad3fef879d30f3307a9c1a88b8e8e6c295483c (HEAD -> main, origin/main)
Merge: d11c4f0 3ae42b5
Author: <64408070+@users.noreply.github.com>
Date: Sat Feb 5 13:18:30 2022 +0900
Merge pull request #1 from /feature_push
プッシュテスト
git log -p ファイルのパス
特定ファイルのコミットの履歴が見れます。誰がいつそのファイルを変更したのか、コミット番号もわかります。
以下では、public/index.htmlにあるファイルの変更履歴を確認しています。
% git log -p public/index.html
commit 3ae42b505b66cd964d28607c83eb333c2fc831bd (feature_push)
Author: <.local>
Date: Sat Feb 5 13:06:22 2022 +0900
プッシュテスト
diff --git a/public/index.html b/public/index.html
index 3e5a139..72ee142 100644
--- a/public/index.html
:
もっとコンパクトに表示させるなら、以下も有効です。
git log –word-diff -p ファイルのパス名
実務でGitコマンドを使う流れ
実務でGitを操作する流れは、
①git cloneする
②mainブランチを最新にする
③mainブランチから開発ブランチを切る
④開発ブランチで作業する
⑤変更したファイルをステージングに上げる
⑥コミットする
⑦リモートブランチにプッシュする
⑧プルリクする
⑨プルリクが承認されてマージされる
⑩mainブランチにチェックアウト
→②から同様の作業
プルリク以外はすでに開設済みなので、ぜひ活用してみてくださいね!
Git操作で役立つ操作&トラブル集
ここからは、実務でよくあるGit操作で困ることを解決していきます。
開発ブランチに最新のmainブランチを取り込む
mainブランチからfeature_topブランチを作成して、そっちで作業してたけど、開発している間にmainブランチはどんどん新しくなります。自分がmainと同じファイルを編集していた場合、mainにマージした時に、せっかくmainのソースが正しいのに、それを上書きしてしまったりする可能性があるので、プルリクする前にmainブランチの内容を取り込むようにしましょう。
※以下の作業を行う前に、開発ブランチ(feature_top)でコミットするか、
まだコミットしたくない場合はスタッシュして退避しておきましょう。
①開発ブランチでコミットかスタッシュして、変更したソースを保存しておく
②mainブランチにチェックアウト
% git checkout main
③mainブランチを最新にする
% git pull origin main
④開発ブランチにチェックアウト
% git checkout feature_top
⑤開発ブランチにmainをマージ
% git merge main
⑥リモートブランチにプッシュする
% git push origin feature_top
直前のコミットを取り消す
直前のコミット間違えた!って時に、コミット取り消せます。
% git reset --soft HEAD^
開発ブランチでやるはずがmainブランチで作業していた
本来、feature_topなどブランチを作成して作業するはずが、気づいたらmainブランチで作業していた…
って時は、焦らずに、スタッシュする→ブランチを作成する→新しいブランチにスタッシュを反映する→作業するでOKです。
% git branch
feature_push
* main
% git status -s
AM test.html
(mainブランチで作業していたのでmainブランチでスタッシュ)
% git stash push -m "mainで作業しちゃったorz"
Saved working directory and index state On main: mainで作業しちゃったorz
(ブランチを新規作成)
% git checkout -b feature_top
Switched to a new branch 'feature_top'
% git branch
feature_push
* feature_top
main
(スタッシュリストを表示)
% git stash list
stash@{0}: On main: mainで作業しちゃったorz
stash@{1}: On main: スタッシュリスト
(スタッシュを適用して、そのスタッシュは削除)
% git stash pop stash@{0}
On branch feature_top
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: test.html
Dropped stash@{0} (14a6fb19b3ec884b631fd18ca9ea35fd10c7d4be)
新しく作ったブランチで、反映された!
リモートブランチに切り替えて作業する
A君!Cさんのサポートのために、Cさんのリモートブランチにチェックアウトして作業してくれないかな?
他の開発メンバーの機能を手伝う場面の時に使えます。
例えば、Cさんがfeature_postsというリモートブランチ名で、機能作成していたとすると、以下のようにチェックアウトできて、作業できます。
% git checkout -b ブランチ名 origin/リモートブランチ名
% git checkout -b feature_posts origin/feature_posts
頻出のGitコマンドまとめ
実際に実務でよく使うGitコマンド中心に紹介しました。
Gitの操作は慣れないうとは戸惑いがちですが、コマンド覚えておくとかなり開発に便利です。
もちろん、Gitはコマンドからではなくソースツリーとかあるので直感的にも作業はできますが、コマンドでできる範囲は広いので、ぜひとも今回紹介した内容を活用してください。
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
コメント