Gitコマンド入門::rebase(-i,drop,その4:ミス発見)「第二十回」

4 min read読了の目安(約4200字

みなさん、こんにちは! さあ、drop 処理では、いきなり難解複雑な迷路にはまってしまい、これから、どう収集していけば良いのか迷走中ですね。また、そもそもの理解度、経験値が少ないため、学習するポイントも、ズレてきた感じです。><;;また、コマンド操作でも、前回、前々回と私が意図した動作とは違ってしまっていましたから、もう一度、その辺りの見直しと復習も兼ねて、引き続き、rebase コマンドの学習をして行きたいと思います。

次回の記事はこちらから!

https://zenn.dev/shiozumi/articles/47c5464f2ec25c

git本家本元の情報はこちらから!

https://git-scm.com/book/ja/v2

前回でのコマンド操作で、ミスを発見!

前回 Aを、dropした時の操作で、その後、README.mdファイルのマージを求められて、結果、1stと Bのマージとなってしまいましたが、その原因は、git commit --amend でした。正しくは、git commit -m "コメント" ですね。

又、その原因は、dropした直後の処理で、HEADの位置を完全に勘違いしてしまいましたね。
HEADの位置は、Bだと思っていたら、1stだったんですよね~ ><;;

ハッシュ値 コメント README.md 補足事項
c0f998d 1st # rebase 実際には、HEAD がここでした!
0fa830d A # A drop削除
f8b5ccd B # B 私は、HEADの位置が、ここだと思い込んでしまった。
2d138a2 C # C -
cb468d1 D # D -

こちらの表に記載したとおりで、Aをdropしたら、次の処理に進んで、HEADが,Bになると思ってしまいましたが、実際は、HEADは、1stのままでしたね。

ということで、drop直後は、以下のようになってます。

ハッシュ値 コメント README.md 補足事項
c0f998d 1st # rebase HEAD
f8b5ccd B # B -
2d138a2 C # C -
cb468d1 D # D -
git rebase -i --root

// drop 直後の、README.md のコンフィクト!

Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
error: could not apply f8b5ccd... B
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply f8b5ccd... B
$ git log --oneline
c0f998d (HEAD) 1st

現状の、README.md ファイルの状態を確認

Working Tree Staging Area Repogitory 補足事項
cat README.md git diff git diff HEAD コマンドで再確認!

Working Treeの、README.mdを確認!

$ cat README.md
<<<<<<< HEAD
# rebase
=======
# B
>>>>>>> f8b5ccd... B

Working Tree では、マージコンフィクトの差分状態になっています。

Staging Areaと、Working treeの差分を確認!

$ git diff
diff --cc README.md
index 8c0227d,399d883..0000000
--- a/README.md
+++ b/README.md
@@@ -1,1 -1,1 +1,5 @@@
++<<<<<<< HEAD
+ # rebase
++=======
+ # B
++>>>>>>> f8b5ccd... B

Staging Area は、どうやら空っぽ?・・・ですね。
git restore README.md で、ステージングエリアから(インデックス)ワーキングツリー(作業ツリー)に、README.mdを、コピーしようとすると、エラーになってしまいました。

$ git restore README.md
error: path 'README.md' is unmerged
// 恐らく、Staging Area は、空っぽの状態!

$ git restore README.md --source=HEAD --staged
// 試しに、HEADからStagingへコピー

git restore README.md
// さらに、Stagingから、Worktreeへコピー

$ cat README.md
# rebase
// 問題なく、取り出せましたね。

Repogitoryと、Working treeの差分を確認!

$ git diff HEAD
diff --git a/README.md b/README.md
index 8c0227d..f46e27c 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,5 @@
+<<<<<<< HEAD
 # rebase
+=======
+# B
+>>>>>>> f8b5ccd... B

差分表示も分かりずらいので、git restore --source=HEAD --worktree、して、HEAD位置のリポジトリーから取得してしまいましょう!

git restore --source=HEAD --worktree

$ git restore --source=HEAD --worktree
$ cat README.md

# rebase
// README.md の中身が、# rebase でした。
// HEADが、1stを指しているので、当然の結果となりましたね。

現状の、README.md ファイルの状態のまとめ!

Working Tree Staging Area Repogitory HEADの位置
コンフィクト状態 空っぽ # rebase 1st

add,commit では、Bが対象となる!

ハッシュ値 コメント README.md 補足事項
c0f998d 1st # rebase HEADの位置
f8b5ccd B # B ここの修正を求められている
2d138a2 C # C -
cb468d1 D # D -

Bが、既に存在しているので、commit -m "" だと追加のイメージになってしまうので、勘違いしてしまい Bを修正するには、--amend のオプションを選択してしまいました。ただ、実際には、これだと直前のコミット、現在のHEAD位置の修正となり、つまり、1stのコミットを書き換えてしまっていたんですよね。><;;

本日のまとめ!

  1. drop した直後のHEADの位置は、その前のコミット1stになる。[1]
  2. その後、README.mdを編集して、add,commitを実行すると、Bの上書きとなる![2]

次回の課題!

  1. Bの内容を、"# B" と、前と同じ内容にすれば、その後、git rebase --continueで完了となるが、違う内容にすると、今度は、BとCで、マージコンフィクトになる!
  2. git rebase --skip コマンドを行うと、そもそも、Bもdropしたのと同じ動作になる。

それでは、今回はここまで、お疲れ様でした!

https://zenn.dev/shiozumi/articles/4c1f2260f886ad
https://twitter.com/esmile2013
脚注
  1. rebase -i の時は、git log , git status で、マメに確認しましょう! ↩︎

  2. そもそも、Aをdropするのに、Bの内容の修正を求められるのか? しかも同じ内容で構わないに・・・まだまだ、初心者には、理解できない動作がありますね。(苦笑) ↩︎