LoginSignup
0
0

More than 5 years have passed since last update.

WIP: `git rebase` を Git Object から考察する

Last updated at Posted at 2017-02-01

多分巷で噂になっているであろうSVN脳の方が書いた記事を読んで、
「あれ? Git もチェンジセットの保存じゃなくてスナップショットの保存だよね?」とか
「え、むしろ SVN もスナップショットの保存をベースとした SCM だったんか!」とか
「多分何が本当に違うって、branch の概念なんだろうな」とか色々な気づきを得ることができたわけですが、

それで「git rebase -iにおけるsquashとは、途中の不要なコミットを単に削除することだ」と思ったりする。そうするとコミットの順番を並び替えたりできることの説明がつかず、結局「rebaseはわからん」と匙を投げることになる。

そうするとコミットの順番を並び替えたりできることの説明がつかず、結局「rebaseはわからん」と匙を投げることになる。

という部分に関しては完全に同意で、よくわかっていなかったので、せっかくなので学ぼうと思った。

サンプルを用意する

こんなコミットログの

$ git log --oneline -4 --reverse
0c7eac5 :tada: initialize sample code
3dbaf33 :+1: add new function A
57bb9d1 :+1: add new function B
4573e7d :+1: add new function C

こんな Diff の

takayukioda@peach$ git log --oneline -4 -p --reverse
0c7eac5 :tada: initialize sample code
diff --git a/rebase.go b/rebase.go
new file mode 100644
index 0000000..d4a6957
--- /dev/null
+++ b/rebase.go
@@ -0,0 +1,9 @@
+package main
+
+import (
+ "fmt"
+)
+
+func main() {
+ fmt.Println("Learn about `git rebase`")
+}
3dbaf33 :+1: add new function A
diff --git a/rebase.go b/rebase.go
index d4a6957..6c950cb 100644
--- a/rebase.go
+++ b/rebase.go
@@ -6,4 +6,9 @@ import (

 func main() {
        fmt.Println("Learn about `git rebase`")
+ A()
+}
+
+func A() {
+ fmt.Println("Commit A")
 }
57bb9d1 :+1: add new function B
diff --git a/rebase.go b/rebase.go
index 6c950cb..290eace 100644
--- a/rebase.go
+++ b/rebase.go
@@ -7,8 +7,13 @@ import (
 func main() {
        fmt.Println("Learn about `git rebase`")
        A()
+ B()
 }

 func A() {
        fmt.Println("Commit A")
 }
+
+func B() {
+ fmt.Println("Commit B")
+}
4573e7d :+1: add new function C
diff --git a/rebase.go b/rebase.go
index 290eace..62f2470 100644
--- a/rebase.go
+++ b/rebase.go
@@ -8,6 +8,7 @@ func main() {
        fmt.Println("Learn about `git rebase`")
        A()
        B()
+ C()
 }

 func A() {
@@ -17,3 +18,7 @@ func A() {
 func B() {
        fmt.Println("Commit B")
 }
+
+func C() {
+ fmt.Println("Commit C")
+}

最終的にはこんなファイルを用意してみた

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Learn about `git rebase`")
    A()
    B()
    C()
}

func A() {
    fmt.Println("Commit A")
}

func B() {
    fmt.Println("Commit B")
}

func C() {
    fmt.Println("Commit C")
}


フッツーにコンフリクト起きて「あっ」ってなったのでもう一回サンプル作り直してきます←

rebase を Git Object から理解できたら、結構イケるんじゃないかと思っているから頑張る

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0