关于git merge和git rebase的区别

首先

我是DMM WEBCAMP Advent Calendar 2023第9天的指导者@72_mikan。
为了理解git,我想谈谈这次关于git merge和rebase的内容。

流动 (liú

    • git mergeについて

 

    • git rebaseについて

 

    git mergeとgit rebase

关于git merge的内容

由於閱讀這篇文章的人中可能有些人從未分支過程式碼,所以我想先解釋一下如何分支。分支指的是在開發過程中創建的任務拆分。
通過分支,我們可以同時進行並行開發,而分支之間互不干擾。
舉個例子,假設我們從主分支(main branch)創建了task1分支和task2分支(分支創建也可以稱作分割分支)。
(在主分支的狀態下,分別存在index-1.html和index-2.html文件。)
從那之後,切換到task1分支並編輯index-1.html,即使我們切換回主分支或task2分支,index-1.html的編輯內容將不會反映在主分支或task2分支上。
反之,在task2分支編輯index-2.html,也不會影響到主分支或task1分支。
通過這種方式,我們可以在task1分支上進行功能添加等操作,在task2分支上進行錯誤修正等操作,實現同時並發的工作。

branch.png
# ブランチ作成コマンド
git branch ブランチ名

# ブランチ切り替え
git checkout ブランチ名
fastfoward.png

假设我们从主分支创建了一个名为task1的分支,并在task1分支上进行开发。当我们想要将task1的工作内容合并到主分支时,可以进行合并操作,这样主分支就可以将task1的内容合并进去了。

合并的步骤如下所示。

# mainブランチにいるとします。
git merge task1

另外,合并的类型有三种。我想要分别进行解释。

首先,第一部分是“Fast Forward”。Fast Forward 是指根据上述 merge 的说明,将要合并的分支(在此指主分支)前进到指定位置(在此指任务1分支的位置)。

automerge.png

当main分支试图合并task分支时,如果从位置A分叉出了两个分支,其中一个分支有B次提交,另一个分支有C次提交,Auto Merge会创建一个新的D次提交,并将主分支移动到D次提交,以将task分支合并到主分支。这是一种经常想象得到的合并过程。

conflict.png
こんにちは!

从A提交创建分支,task分支上有B次提交,main分支上有C次提交。
在task分支中按以下方式编辑了文件。

こんにちは!
conflictを解消しよう!!

假设在主分支上,我们对文件进行如下编辑。

こんにちは!
コンフリクトを解消しよう!!
image.png

为什么会发生这种情况?
这是因为在主分支和任务分支中对同一部分进行了编辑。这次我认为在每个分支的file.txt的第二行进行了不同的编辑。由于git无法确定在每个分支上进行了相同的编辑,无法确定应优先采用哪个分支的编辑内容,从而导致冲突的发生。

接下来,我想解释一下解决冲突的方法。

我认为文件.txt中的内容如下:

こんにちは!
<<<<<<< HEAD
コンフリクトを解消しよう!!
=======
conflictを解消しよう!!
>>>>>>> task

当发生冲突时,主要分支(已合并的分支)将在HEAD部分显示,并且任务分支(已合并的分支)将被输出。
由于无法判断哪个分支优先,因此本次将编辑为优先采用已合并的任务分支。

こんにちは!
conflictを解消しよう!!

执行以下命令后,冲突将得以解决。

git add file.txt
git commit -m 'conflictの解消'

以上是关于冲突的解释。

关于git rebase

merge1.png
merge2.png
rebase.png

以下是rebase命令的选项:

# mainブランチにいる状態と仮定します
git checkout task # taskブランチに切り替えます

git rebase main # taskブランチでrebaseコマンドを使います

git checkout main # mainブランチに切り替え

git merge task # 前に進んでいるtaskブランチをmainブランチで取り込みtaskブランチと同じコミットに移動

通过这样做,可以将提交记录合并成一列。

git merge和git rebase有什么区别?

最后,rebase和merge的区别在于能否将提交整理得更加清晰。merge的情况下,由于会创建新的提交,提交历史就会变得分散;而在rebase的情况下,可以将提交历史整理成一条线。

merge1.png

假设主分支和任务分支已经被推送,如果在这里使用任务分支进行rebase,那么D提交的父分支将成为C提交。
然而,在推送时,D提交的父提交是A提交,因此此时远程仓库和本地仓库的提交历史将变得混乱。

在使用rebase时,请确保在尚未将分支推送到git之前进行操作。

最后

您觉得如何呢?如果有任何引起您兴趣的问题,请留下评论或其他反馈。

广告
将在 10 秒后关闭
bannerAds