git reset --歴史を戻る
歴史操作を覚えるために、歴史を戻って、fix-Bというトピックブランチを作る
1. feature-Aブランチを分岐する前に戻る
リポジトリのHEAD、ステージ、現在のワーキングツリーを指定した状態まで戻すには、git reset --hardコマンドを利用します。このコマンドに戻りたい場所のハッシュを与える。
ハッシュはgit logで調べる
各コミットの先頭に表示されている16進数の文字列が、各コミットのハッシュの一部です。
$ git log
commit bc5b961854bad3868dd5598e10ef6012429f6fa4 (HEAD -> master)
Merge: 119ff05 cdc162e
Author: okuyama <130431374+okuyama-code@users.noreply.github.com>
Date: Tue Aug 8 11:15:31 2023 +0900
Merge branch 'feature-A'
commit cdc162ee0bf3666c6af8b0a28a6fe2b241973203 (feature-A)
Author: okuyama <130431374+okuyama-code@users.noreply.github.com>
Date: Mon Aug 7 19:34:00 2023 +0900
Add feature-A
commit 119ff05db3dc4b42d564a2a35efd248c35b61b35
Author: okuyama <130431374+okuyama-code@users.noreply.github.com>
Date: Mon Aug 7 19:14:07 2023 +0900
Add index
commit 3ffd1885c17135206d3c27a5bc186f35948a1fdb
Author: okuyama <130431374+okuyama-code@users.noreply.github.com>
Date: Mon Aug 7 13:02:38 2023 +0900
first commit
今回はfeature-Aを分岐させる前の状態に戻りたいのでAdd indexのところまで戻る
commit 119ff05db3dc4b42d564a2a35efd248c35b61b35
Author: okuyama <130431374+okuyama-code@users.noreply.github.com>
Date: Mon Aug 7 19:14:07 2023 +0900
Add index
// ハッシュ = 119ff05db3dc4b42d564a2a35efd248c35b61b35
この部分。
$ git reset --hard 119ff05db3dc4b42d564a2a35efd248c35b61b35
HEAD is now at 119ff05 Add index
feature-Aを分岐させる前の状態に戻ることができました。
2. fix-Bブランチを作成する
$ git checkout -b fix-B
Switched to a new branch 'fix-B'
README.mdに一文追加
# Git チュートリアル
- fix-B //追加箇所
### 3.feature-Aブランチをマージした後の状態に進む
git logコマンドだけでは、その状態からの過去のログしか確認できない。ですが、git reflogコマンドを利用すると現在のリポジトリで行われた作業ログを確認できる。
$ git reflog
6312633 (HEAD -> fix-B) HEAD@{0}: commit: Fix B
119ff05 (master) HEAD@{1}: checkout: moving from master to fix-B
119ff05 (master) HEAD@{2}: reset: moving to 119ff05db3dc4b42d564a2a35efd248c35b61b35
bc5b961 HEAD@{3}: merge feature-A: Merge made by the 'ort' strategy.
119ff05 (master) HEAD@{4}: checkout: moving from feature-A to master
cdc162e (feature-A) HEAD@{5}: checkout: moving from master to feature-A
119ff05 (master) HEAD@{6}: checkout: moving from feature-A to master
cdc162e (feature-A) HEAD@{7}: commit: Add feature-A
119ff05 (master) HEAD@{8}: checkout: moving from master to feature-A
119ff05 (master) HEAD@{9}: commit: Add index
3ffd188 HEAD@{10}: commit (initial): first commit
Gitの操作を誤ってしまった場合でも、たいていはこのgit reflogコマンドを利用して元の状態を復元できる。
$ git checkout master
Switched to branch 'master'
feature-Aブランチをマージした後の状態は上から4番目でハッシュが「bc5b961」となっている。
過去の歴史の状態を復元するときに利用した**git reset --hard (ハッシュ)**を実行
$ git reset --hard bc5b961
HEAD is now at bc5b961 Merge branch 'feature-A'
コンフリクト(競合)の解消
$ git merge --no-ff fix-B
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
README.mdファイルをマージしようとしたときに、feature-Aで変更した部分と今回マージしようとしたfix-Bで変更した部分が衝突したことを表す。
コンフリクト部分を解消する。
解消した結果をコミットする。
$ git add README.md
$ git commit -m "Fix conflict"
[master 72c778e] Fix conflict
git commit --amend コミットメッセージを修正
git log --graphでコミットログも修正されていることが確認できる。
git rebase -i 歴史を押しつぶして改変
コミット履歴を操作するための対話的なコマンドです。"rebase"は、既存のコミット履歴を再構築し、新しいコミットを作成するための操作を行うためのコマンドです。-iオプションは「対話的」モードを指定し、コミットのリストを表示し、それらに対して操作を行うためのエディタを開きます。スペルミスなどを発見し、修正コミットをするときによく利用するテクニック。
feature-Cブランチを作成する
git checkout -b feature-C
README.mdに一行書き加える
# Git チュートリアル
- feature-A
- fix-B
- feature-C //追加文
git commit -amコマンドを利用する。
$ git commit -am "Add feature-C"
[feature-C 1955aa6] Add feature-C
1 file changed, 1 insertion(+)
git commit -am "Add feature-C"は、Gitバージョン管理システムにおいて、変更内容を新しいコミットとして記録するためのコマンドです。このコマンドは、変更内容をステージングエリアに追加してからコミットするためのショートカットです。
具体的には、次のようなステップが含まれます:
まず、git addコマンドを使用して変更内容をステージングエリアに追加します。-aオプションは、変更内容をすべて(既存のトラッキングされているファイルの変更)ステージングエリアに追加することを意味します。
次に、ステージングエリアに追加された変更内容を新しいコミットとして記録します。-mオプションを使用して、コミットメッセージを指定します。上記の例では、コミットメッセージは "Add feature-C" となります。
このコマンドを使うことで、変更内容を素早くコミットとして記録することができます。ただし、注意点として、git commit -amは新しいファイルの追加をステージングエリアに追加するのには適していません。新しいファイルを含める場合は、git addコマンドを個別に使用してステージングエリアに追加する必要があります。
また、このコマンドは変更内容をステージングエリアに追加してからコミットする操作を一括で行うため、コミットメッセージを事前に指定することが必要です。コミットメッセージは変更内容の概要をわかりやすく記述するためのものであり、他の開発者がコミット履歴を理解しやすくするために重要です。
README.mdを修正する
修正後の差分を確認 qでぬける
$ git diff
diff --git a/README.md b/README.md
index b2afdea..d0514af 100644
--- a/README.md
+++ b/README.md
@@ -2,4 +2,4 @@
- feature-A
- fix-B
-- feature-C
+- feature-C //修正確認
これをコミット
$ git commit -am "Fix typo"
[feature-C 02d3e53] Fix typo
1 file changed, 2 insertions(+), 1 deletion(-)
歴史を改ざんする
"Fix typo"をひとつ前のコミットと統合して、一つの新たなコミットととして都合の良い歴史に改ざんする。
git rebase -i HEAD~2
直近の2つのコミットを対話的に再構築するためのコマンドです。HEAD~2は、最新のコミットを基準にして2つ前のコミットを指します。したがって、このコマンドを実行すると、最新のコミットとその1つ前のコミットに対して対話的なリベース操作が行われます。
pick 1955aa6 Add feature-C
pick 02d3e53 Fix typo
↓ pickをfixupに書き換える
pick 1955aa6 Add feature-C
fixup 02d3e53 Fix typo
保存して抜けると
$ git rebase -i HEAD~2
Successfully rebased and updated refs/heads/feature-C.
"Fix typo"の内容を一つ前の"Add feature-C"に加え、それを新たなコミットとして書き換えたことになる。
Fix typoという歴史がなかったことにしてAdd feature-Cの歴史を改ざんしたことになる。
masterブランチにマージする
okuyama@okuyama MINGW64 ~/dev/git-tutorial (feature-C)
$ git checkout master
Switched to branch 'master'
$ git merge --no-ff feature-C
Merge made by the 'ort' strategy.
README.md | 2 ++
1 file changed, 2 insertions(+)
masterブランチにfeature-Cが統合されました。順調に開発が進んでいます。