通过研究 Git 对象来思考 `git rebase` 的工作原理

读了一篇被传言在多分巷上被SVN脑的人写的文章后,
“嗯?Git保存的不也是快照而不是变更集吗?”
“额,其实SVN也是以保存快照为基础的SCM啊!”
“可能真正不同的是分支的概念吧。”
因此,我得到了许多不同的见解。

所以我认为在”git rebase -i”中的” squash”就是简单地删除中间不必要的提交。然后解释说可以重新排序提交,但我最终还是弄不明白,最终变得“rebase我不懂”,只能放弃。

I’m sorry, but the provided text “の” is a Japanese hiragana character and does not have a direct translation or equivalent in Chinese. Could you please provide a different sentence or context for me to paraphrase in Chinese?

这样做就无法解释如何重新排序提交的顺序,最终只能放弃理解”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")
}

我和同事发生了冲突,感到很不舒服,所以决定重新制作样品。

如果能够从Git对象理解rebase,我认为会很不错,所以我会努力的。

广告
将在 10 秒后关闭
bannerAds