Gitで古いバージョンを取得する話

テストが通らなかったのが通るようになったとか、
メッセージボックスに表示する内容を修正したとか、
そういうのをプッシュする前に確認する方法について。

という訳で、今回のネタ元はこちら。
新しいブランチを作成せずに古いバージョンを取得する方法

いつも通り、適当なリポジトリを作ります。
$ git init

次に、”aaa”, “bbb”, “ccc”の順番で行を追加します。
$ echo aaa >> readme.txt
$ git add readme.txt
$ git commit -m "初回コミット"
$ echo bbbb >> readme.txt
$ git commit -a -m "bbbを追加"
$ echo ccc >> readme.txt
$ git commit -a -m "cccを追加"

もう、お気付きですね。
“bbb”と打ったつもりが”bbbb”でコミットされてしまいました。
$ cat readme.txt
aaa
bbbb
ccc

では、修正してコミットしましょう。
まずは、適当なエディタを使って修正します。
$ cat readme.txt
aaa
bbb
ccc

次に、これをコミットします。
$ git commit -a -m "入力ミスを修正"

そして、プッシュする前に修正内容を確認しましょう。
1つ目の方法は、git showです。

まずは、git help showを使って、使い方を確認します。
$ git show [options] <object>...

問題は、この<object>ですね。
ここには何を入れたら良いでしょう。

まずは、何も入れずに実行してみます。
$ git show
commit d2015e9046af41d2b21457989859c14cb83e4c29
Author: techno-cat
Date: Tue Apr 30 21:05:30 2013 +0900

入力ミスを修正

diff --git a/readme.txt b/readme.txt
index aa921fd..1802a74 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,3 @@
aaa
-bbbb
+bbb
ccc

これでも、確認できますね。
ちなみに、最新の一つ前はこれで表示できます。
$ git show HEAD^

これだと、どうなるでしょう?
$ git show HEAD^^..HEAD

<object>..<object>のように指定すると、
表示範囲を指定できます。
注意点としては、Gitで範囲指定すると最初は含まず、最後は含む点です。
つまり、HEAD^^..HEADを指定すると、
1つ前から最新までの計2つのコミットが表示されます。

さらに、HEADHEAD^の他に、ハッシュを使うこともできます。
例えば、先ほどgit showで表示した内容に含まれていた、
commit d2015e9046af41d2b21457989859c14cb83e4c29
が、このコミットのハッシュであり、コミットの名前に相当します。

ちなみに、このハッシュを使ってコミットを指定する際は、
すべてを入力する必要はありません。
具体的には、こういうことです。
$ git show d201
commit d2015e9046af41d2b21457989859c14cb83e4c29
(git showと同じ)

ですが、これだと修正内容を見ることしか出来ません。
次の方法は、任意のコミットを最新とするブランチを作って、
修正内容を確認します。

まずは、git checkoutのおさらいです。

$ git checkout -b <new_branch> [<start point>]

-bは、新しいブランチを作ると同時に、
そのブランチに切り替えを行うオプションです。
次に、[<start point>]ですが、
ここに任意のコミットを指定することで、そのコミットを最新とするブランチが作れます。
もし、このブランチに新しいコミットをした場合は、
このコミットから枝分かれするので、このコミットを始点とするブランチとも言えます。
なので、”start point”と表記されている訳ですね。(*1)

では、さっそくmasterの1つ前を指定して、ブランチを作ってみます。
$ git checkout -b temp HEAD^
Switched to a new branch 'temp'
$ cat readme.txt
aaa
bbbb
ccc

この通り、一つ前の状態に戻りました。
この時点で、git showを実行すると、
このブランチにおける最新のコミット情報が表示されます。

ここでのポイントは、最新のコミットを指すのに使って来たHEADが、
masterブランチとtempブランチで異なるコミットを指している点です。

そして、このtempブランチに切り替えたとしても、
以下の方法で、”bbbb”を”bbb”に修正したコミットを見ることができます。
$ git show d201

これで、なんとなくHEADの役割が理解できたと思います。

実行してみないと分からないような、メッセージボックスの誤字修正等は、
この方法でプッシュする前に確認できると思います。

次に、ブランチを作ることなく、
masterブランチのHEADの位置を1つ前に移動させます。
$ git checkout master
Switched to branch 'master'
$ git checkout HEAD^
Note: checking out 'HEAD^'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

git checkout -b new_branch_name

HEAD is now at 21d2081... cccを追加

いろいろメッセージが表示されますが、
最後に、HEADの位置が変更されたことが表示されていると思います。

$ cat readme.txt
aaa
bbbb
ccc

これで、ブランチを作ることなく変更を確認することができました。
最後は、HEADの位置を変更する前に戻します。

まず、現在どのブランチにいるのかを確認します。
$ git branch
* (no branch)
master
temp

masterブランチに戻す必要があるので、以下のコマンドを実行します。
$ git checkout master
Previous HEAD position was 21d2081... cccを追加
Switched to branch 'master'
$ cat readme.txt
aaa
bbb
ccc

そして、先ほど作ったtempブランチを削除します。
$ git branch -d temp

おしまい。

(*1) ここは、自分の理解に基づいてでっちあげています。。。

Leave a Comment