前回からの続きですが、このページだけで完結しています。
目的一覧は「目次」から、扱ったコマンドの一部を「まとめ」で表にしています。
使用した環境
WSL2 - Ubuntu 20.04 LTS
git version 2.35.1
追跡
ファイルの移動・リネーム
git mv ファイルパス 新しいパス
追跡中のファイルを移動したり名前を変えたりするときには、Gitを通して新しいパスで引き続き追跡してもらいます。
$ git mv topic.txt topic1.txt
$ git status
On branch main
Your branch is up to date with 'origin/main'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: topic.txt -> topic1.txt
ファイルの削除
git rm ファイルパス
ファイルを削除して追跡対象から外します。
$ git rm main.txt rm 'main.txt' $ git status On branch main Your branch is up to date with 'origin/main'. Changes to be committed: (use "git restore --staged <file>..." to unstage) deleted: main.txt
※ステージに追加されているファイルは削除できません。
すぐ↓のオプションを参照。
オプション
「-r」ディレクトリの削除。
「-f」ステージされているものも強制的に削除。
追跡対象から外す
git rm --cached ファイルパス
ファイルを削除せず、追跡対象から外します。
この方法は追跡していた対象を外すだけなので、「git status」をすると未追跡のファイルがあると出てしまいます。
そもそも追跡対象として捉えられないようにするには別の方法を取ります。
「.gitignore」というファイルを作成し、リポジトリのあるディレクトリ内に置きます。
「.gitignore」の中に無視させたいファイルやディレクトリのパスを書くと対象としては捉えられなくなります。
.gitignore
#で始まる行はコメント。 sample.html test.txt #practice~のファイルすべて practice* #ディレクトリまるごと testdir/ #「!」のついたものは無視されない。 !practice.py
コミットの統合
コミットの統合には「merge」と「rebase」の2つがありますが、イメージを図にすると下のようになります。
merge
git merge ブランチ名
現在のブランチと指定したブランチを統合します。
$ git branch
* main
topic
$ git merge topic
Updating 1420a77..9be1830
Fast-forward
topic.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 topic.txt
コンフリクトを解消するには
- ファイルを編集する
- git add
- git commit
この順番でコンフリクトを解消します。
実際にやってみます。
$ git merge topic Auto-merging index.html CONFLICT (content): Merge conflict in index.html Automatic merge failed; fix conflicts and then commit the result.
私の環境(Visual Studio Code)では、ファイルが次のように表示されました。
現在のブランチと統合しようとしているブランチが同じ行を編集しているため、コンフリクトが起きています。
ファイルを編集しましょう。
※もしもmergeを中止したい場合、オプション「--abort」をつけます。
「git merge --abort」
「Accept Current Change(現在のブランチの変更を取り入れる)」
「Accept Incoming Change(もう片方のブランチの変更を取り入れる)」
「Accept Both Changes(両方取り入れる)」
のどれかをクリックします。
※「Compare Changes」は変更を並べて表示する。
もし上記のような項目がない場合、不要な行(<<<HEAD、====、>>> topicなど)を削除します。
今回は両方の変更を取り入れることにしました。
ファイルを保存します。
ステージに追加し、コミットを行います。
$ git add index.html $ git commit -m 'mergeコミット' [main 136beea] mergeコミット
rebase
git rebase ブランチ名
現在のブランチの親として指定したブランチと統合します。
push済みのコミットの「rebase」は要注意!
$ git branch
* main
topic
$ git rebase topic
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
error: could not apply 33aa9d1... in main
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 33aa9d1... in main
上記はコンフリクトしていますが、解消はmergeの時とほとんど同じです。
- ファイル編集
- git add
- git rebase --continue
途中の段階でやめるときは「git rebase --abort」。
$ git add index.html $ git rebase --continue [detached HEAD 595fe8d] in main(rebaseしました) 1 file changed, 1 insertion(+) Successfully rebased and updated refs/heads/main.
複数のコミットの変更(コミットメッセージ、ファイル編集)や統合は、「git rebase -i」を使います。
詳しくは「Git - 歴史の書き換え」を参照してください。
やり直し
ファイル単位のやり直し
変更したファイルを元に戻します。
git restore ファイルパス
ファイルの内容を特定コミットから反映させます。
git restore --source=コミットID等 ファイルパス
$ git restore --source=532330056 index.html $ git restore --source=topic index2.html
ファイルをステージから下ろします。
git restore --staged ファイルパス
git reset HEAD ファイルパス
$ git reset HEAD index.html
Unstaged changes after reset:
M index.html
コミット単位のやり直し
「restore」は主にファイル単位のやり直しでした。
「reset」はコミット単位のやり直しです。
実行すると特定のコミットまでリセットすることができます。
git reset 戻したい箇所
戻したい箇所に当てはまるのは、コミットID、ブランチ名、HEADを基準とした記述法、などです。
「HEAD」は現在の位置ですが、「HEAD~」は現在位置のひとつ前、「HEAD~~」はふたつ前、といった記述の仕方になります。
あとは戻す際の規模に応じてオプションをつけます。
--soft
特定コミットまでさかのぼります。さかのぼった所以降のコミットが消えます。
ステージの状態とワークツリーはそのままです。
--mixed
さかのぼった所以降のコミットに合わせて、ステージの状態も戻ります。
オプションを省略したときのデフォルトの動作です。
--hard
特定コミットまでさかのぼり、ステージと、ワークツリーもそのときの状態まで戻ります。
ファイルなども消えるので注意が必要です。
$ git reset 53233
Unstaged changes after reset:
M index.html
上記はオプションを省略したので「--mixed」が適用されています。
soft・mixed・hardの違いは、下記ページがわかりやすかったです。
git reset 3種類をどこよりもわかりやすい図解で解説!
誤ってリセットしたときの対処法
もし間違ってリセットしてしまったときにはコミットが遡れなくなります。
$ git reset --hard 8ca5d68f5bd942 HEAD is now at 8ca5d68 start $ git log commit 8ca5d68f5bd9422b6f79878aff57a69ca2f4008a (HEAD -> main, origin/main) Author: fujinov <98008144+fujinov@users.noreply.github.com> Date: Fri Feb 4 11:14:05 2022 +0900 start
上記では最初のコミットに戻ったため、コミット履歴とファイルが消えてしまいました。
こんなときには、「reflog」コマンドを使います。
HEADの移動履歴です。
$ git reflog
8ca5d68 (HEAD -> main, origin/main) HEAD@{0}: reset: moving to 8ca5d68f5bd942
d6599b4 HEAD@{1}: checkout: moving from topic to main
5323300 (topic) HEAD@{2}: checkout: moving from main to topic
d6599b4 HEAD@{3}: reset: moving to d6599b499a91f67cb16c
HEAD@{0}というのが現在のリセットしてしまった状態です。
一つ前のHEADの状態がHEAD@{1}がです。ここに戻れば解決するので、resetコマンドで指定します。
$ git reset --hard HEAD@{1}
HEAD is now at d6599b4 add .gitignore
$ git log
commit d6599b499a91f67cb16c4cfc2b443e7128176031 (HEAD -> main)
Author: fujinov <98008144+fujinov@users.noreply.github.com>
Date: Fri Feb 4 19:51:25 2022 +0900
add .gitignore
commit f27a79e5ed3f3248f8086eaf6f9e8da0fab480f2
Author: fujinov <98008144+fujinov@users.noreply.github.com>
Date: Fri Feb 4 12:25:24 2022 +0900
topicブランチをリベース
無事元に戻すことができました。
一時避難
ワークツリーの変更を避難させる
git stash [save]
[save]は省略可能です。
実行するとワークツリーの変更とステージの状態が一時保存され、ワークツリーが未変更の状態に戻ります。
$ git stash
Saved working directory and index state WIP on main: d6599b4 add .gitignore
$ git status
On branch main
nothing to commit, working tree clean
ステータスが「working tree clean」の状態になっていますね。
避難したリストを表示
git stash list
$ git stash list stash@{0}: WIP on main: d6599b4 add .gitignore stash@{1}: WIP on topic: 5323300 in topic
避難した作業を復元
git stash apply [stash@{番号}]
stash@~を省略した場合、最新の作業を復元させます。
※復元した作業はリストに残ったままです。
ステージの状態も合わせて復元するには、「--index」をつけます。
$ git stash apply --index
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: index.html
git stash pop [stash@{番号}]
復元とリストからの削除を同時に行います。
stash@~を省略した場合、最新の作業が実行されます。
避難した作業を削除
git stash drop [stash@{番号}]
stash@~を省略した場合、最新の作業を削除します。
$ git stash list
stash@{0}: WIP on main: d6599b4 add .gitignore
stash@{1}: WIP on main: d6599b4 add .gitignore
stash@{2}: WIP on topic: 5323300 in topic
$ git stash drop stash@{1}
Dropped stash@{1} (e956c1a7b2610d63e3c26df8099781ab5947e055)
$ git stash list
stash@{0}: WIP on main: d6599b4 add .gitignore
stash@{1}: WIP on topic: 5323300 in topic
git stash clear
すべての一時避難を削除します。
タグ
タグ一覧
git tag
$ git tag
ver1.0
タグの作成
git tag [-a] タグ名 [コミットID]
コミットIDを省略すると、現在(HEADの位置)のコミットにタグが付きます。
「-a」をつけるとコメントで注釈を付けることができます。
$ git tag -a ver1.1 -m '機能追加'
$ git tag
ver1.0
ver1.1
タグの削除
git tag -d タグ名
$ git tag -d ver1.0
Deleted tag 'ver1.0' (was 5323300)
タグの詳細表示
git show タグ名
コメント注釈があれば表示し、紐付いているコミットと直前のコミットの差分を表示します。
$ git show ver1.0
commit 53233005625701a0ff4b3506216ab446fa75afaa (tag: ver1.0, topic)
Author: fujinov <98008144+fujinov@users.noreply.github.com>
Date: Fri Feb 4 15:24:52 2022 +0900
in topic
diff --git a/index.html b/index.html
index 862db29..610411e 100644
--- a/index.html
+++ b/index.html
@@ -1,2 +1,2 @@
<h1>Sample</h1>
-<p></p>
\ No newline at end of file
+<p>topicブランチ</p>
リモートのタグ
git push リモート名 タグ名
タグをリモートに送ります。
すべてのタグを送るには、タグ名の代わりに「--tags」をつけます。
$ git push origin --tags
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 190 bytes | 190.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
To /home/user/backup
* [new tag] ver1.0 -> ver1.0
* [new tag] ver1.1 -> ver1.1
git push --delete リモート名 タグ名
リモートのタグを削除します。
$ git push --delete origin 1.0
To /home/user/backup
- [deleted] 1.0
git ls-remote --tags
リモートにつけられているタグを確認します。
$ git ls-remote --tags
From /home/user/backup
53233005625701a0ff4b3506216ab446fa75afaa refs/tags/ver1.0
7fe17730c7c1f87362fdb9eac136f14af99be5a2 refs/tags/ver1.1
d6599b499a91f67cb16c4cfc2b443e7128176031 refs/tags/ver1.1^{}
まとめ
このページで使用したコマンド一覧
※「git」コマンド略。
コマンド | 機能 |
---|---|
mv ファイルパス 新しいパス | 移動・リネーム |
rm ファイルパス | 削除 |
rm --cached ファイルパス | 追跡対象から外す |
merge ブランチ名 | マージ |
rebase ブランチ名 | リベース |
restore ファイルパス | ファイルのやり直し |
restore --sourse=コミットID ファイルパス | コミットから反映 |
restore --staged ファイルパス | ステージから下ろす |
reset コミットID [--soft, --mixed, --hard] | リセット |
reflog | HEADの履歴 |
stash | ワークツリーの変更を避難 |
stash list | 避難したリスト |
stash apply [stash番号] | 避難した作業を復元 |
stash drop [stash番号] | リストから削除 |
stash pop [stash番号] | 作業の復元とリストから削除 |
stash clear | リストをクリア |
tag | タグ一覧 |
tag [-a] タグ名 | タグの作成 |
tag -d タグ名 | タグの削除 |
tag show タグ名 | 詳細表示 |
push リモート名 タグ名 | タグをリモートに送る |
push --delete リモート名 タグ名 | リモートのタグを削除 |
ls-remote --tags | リモートのタグ確認 |
参考にしたページ
おすすめ書籍
前回の記事
はじめてコミットするまで
このページが少しでもお役に立てたのなら幸いです。