目的別Gitまとめ2

Tips

前回からの続きですが、このページだけで完結しています。

目的一覧は「目次」から、扱ったコマンドの一部を「まとめ」で表にしています。

使用した環境
WSL2 - Ubuntu 20.04 LTS
git version 2.35.1

 Androidアプリを作成しました。
 感情用のメモ帳です。

スポンサーリンク
スポンサーリンク

追跡

ファイルの移動・リネーム

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は枝分かれしたコミット履歴がひとつにまとまり、rebaseはコミット履歴が一本につながる。

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

コンフリクトを解消するには

  1. ファイルを編集する
  2. git add
  3. 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)では、ファイルが次のように表示されました。

index.htmlファイルの画面。

現在のブランチと統合しようとしているブランチが同じ行を編集しているため、コンフリクトが起きています。

ファイルを編集しましょう。

※もしも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の時とほとんど同じです。

  1. ファイル編集
  2. git add
  3. 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]
リセット
reflogHEADの履歴
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リモートのタグ確認

参考にしたページ

おすすめ書籍

前回の記事

はじめてコミットするまで

このページが少しでもお役に立てたのなら幸いです。

タイトルとURLをコピーしました