Gitで編集したファイルや新しいファイルを一時退避したり保存したりなかったことにしたり

タイトル長くてすみません。
内容も長いです。
ターミナルのGitコマンドでトラッキング(管理対象)されていないファイルを削除するやり方のメモ
トラッキング対象のファイルの編集をなかったことにする方法もついでにメモ(削除、保存)

出てくるGitコマンド


  • init
  • status
  • add
  • commit
  • diff
  • checkout
  • stash( -u)
  • clean

前準備


まず、適当なフォルダを作って、それをgitのリポジトリにします。

1
2
3
4
$ mkdir test
$ cd test
$ git init
Initialized empty Git repository in /Users/nakano/projects/test/.git/

適当なファイルを作って、それをコミットします

1
2
3
4
5
6
7
8
9
10
11
12
$ touch index.html
$ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.html
nothing added to commit but untracked files present (use "git add" to track)

このままではトラッキング対象でもないです。
addしてステージ環境にあげて、コミットしてトラッキング対象にします。

1
2
3
4
5
$ git add index.html
$ git commit -m 'Add index.html'
[master (root-commit) 18e59b5] Add index.html
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 index.html

その後にindex.htmlのファイルを編集すると、Untracked files:ではなく、modifiedになります。

index.htmlファイルの内容

1
2
3
4
5
6
7
8
<html lang="ja">
<head>
<meta charset="urf-8">
<title>Git用てすとHTML</title>
</head>
<body>
<p>テスト用のHTMLです。</p>
</body>

差分を見ると…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ git status
On branch 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: index.html
no changes added to commit (use "git add" and/or "git commit -a")
$ git diff
diff --git a/index.html b/index.html
index e69de29..351eefc 100644
--- a/index.html
+++ b/index.html
@@ -0,0 +1,8 @@
+<html lang="ja">
+<head>
+ <meta charset="urf-8">
+ <title>Git用てすとHTML</title>
+</head>
+<body>
+ <p>テスト用のHTMLです。</p>
+</body>


一時退避する(stash)


この状態で、一時保存する場合はstashを使うと便利です。

1
2
3
4
5
6
7
8
$ git stash
Saved working directory and index state WIP on master: 18e59b5 Add index.html
HEAD is now at 18e59b5 Add index.html
$ git status
On branch master
nothing to commit, working directory clean
$ git diff
$

保存されている一覧を見るときにはstash listを使うと見れます。
その一覧から一番最近保存した差分を取り出すにはstash popを使います
(もちろん指定することもできますが、割愛します)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git stash list
stash@{0}: WIP on master: 18e59b5 Add index.html
$ git stash pop
On branch 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: index.html
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (2b6252afe29320a91400011c2b80db8b431d44b5)
$ git stash list
$

stashの中からは削除されて、再度modifiedとして表示されました。
ファイルの内容も戻っているかと思います。

ただし、トラッキングされているファイルのみしかstashされません。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ touch index.txt
$ git status
On branch 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: index.html
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.txt
no changes added to commit (use "git add" and/or "git commit -a")
$ git stash
Saved working directory and index state WIP on master: 18e59b5 Add index.html
HEAD is now at 18e59b5 Add index.html
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.txt
nothing added to commit but untracked files present (use "git add" to track)

トラッキングされていないファイルも含めるには、-uオプションをつけると良いです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ git stash pop
On branch 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: index.html
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.txt
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (d8ce320bbab1565741ac31934c14957903969760)
$ git stash -u
Saved working directory and index state WIP on master: 18e59b5 Add index.html
HEAD is now at 18e59b5 Add index.html
$ git status
On branch master
nothing to commit, working directory clean

全て保存されました!


トラッキングしている編集した内容をなかったことにする(checkout)


ファイルを前のコミットの状態(Add index.htmlのところ)に戻す場合はcheckoutを使います。

1
2
3
4
$ git checkout .
$ git status
On branch master
nothing to commit, working directory clean

これでなにも表示されなくなりました。
でも、これだとあとで元に戻したいときに戻せなくなります。ご注意ください。
(私はそれで卒論を消したことがあります泣)


トラッキングされてないファイルをなかったことにする(clean)


トラッキングされてないファイルを新しく作ります。

1
2
3
4
5
6
7
8
9
$ touch index.txt
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.txt
nothing added to commit but untracked files present (use "git add" to track)

この状態ではUntracked files:です。
この状態でindex.txtをいくら編集してcheckoutをしても内容は消されません

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ echo 'てすと' > index.txt
$ cat index.txt
てすと
$ git checkout .
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.txt
nothing added to commit but untracked files present (use "git add" to track)
$ cat index.txt
てすと

こいつを消すには、cleanを使います。
そのままでは使えないので、オプションを指定します。

1
2
$ git clean
fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean

オプション一覧

  • -n : 削除対象のファイルを確認する
  • -f : 実際に削除する

他にもありますが、今回は割愛します。

1
2
3
4
5
6
7
$ git clean -n
Would remove index.txt
$ git clean -f
Removing index.txt
$ git status
On branch master
nothing to commit, working directory clean

これで削除されました。
ブランチ移動する際とかに作業内容をなかったことにしたりするときにお使いください。
(個人的にはstash -uがオススメです。使いすぎるとカオスになりますが)


参考URL