关于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分支上進行錯誤修正等操作,實現同時並發的工作。
# ブランチ作成コマンド
git branch ブランチ名
# ブランチ切り替え
git checkout ブランチ名
假设我们从主分支创建了一个名为task1的分支,并在task1分支上进行开发。当我们想要将task1的工作内容合并到主分支时,可以进行合并操作,这样主分支就可以将task1的内容合并进去了。
合并的步骤如下所示。
# mainブランチにいるとします。
git merge task1
另外,合并的类型有三种。我想要分别进行解释。
首先,第一部分是“Fast Forward”。Fast Forward 是指根据上述 merge 的说明,将要合并的分支(在此指主分支)前进到指定位置(在此指任务1分支的位置)。
当main分支试图合并task分支时,如果从位置A分叉出了两个分支,其中一个分支有B次提交,另一个分支有C次提交,Auto Merge会创建一个新的D次提交,并将主分支移动到D次提交,以将task分支合并到主分支。这是一种经常想象得到的合并过程。
こんにちは!
从A提交创建分支,task分支上有B次提交,main分支上有C次提交。
在task分支中按以下方式编辑了文件。
こんにちは!
conflictを解消しよう!!
假设在主分支上,我们对文件进行如下编辑。
こんにちは!
コンフリクトを解消しよう!!
为什么会发生这种情况?
这是因为在主分支和任务分支中对同一部分进行了编辑。这次我认为在每个分支的file.txt的第二行进行了不同的编辑。由于git无法确定在每个分支上进行了相同的编辑,无法确定应优先采用哪个分支的编辑内容,从而导致冲突的发生。
接下来,我想解释一下解决冲突的方法。
我认为文件.txt中的内容如下:
こんにちは!
<<<<<<< HEAD
コンフリクトを解消しよう!!
=======
conflictを解消しよう!!
>>>>>>> task
当发生冲突时,主要分支(已合并的分支)将在HEAD部分显示,并且任务分支(已合并的分支)将被输出。
由于无法判断哪个分支优先,因此本次将编辑为优先采用已合并的任务分支。
こんにちは!
conflictを解消しよう!!
执行以下命令后,冲突将得以解决。
git add file.txt
git commit -m 'conflictの解消'
以上是关于冲突的解释。
关于git rebase
以下是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的情况下,可以将提交历史整理成一条线。
假设主分支和任务分支已经被推送,如果在这里使用任务分支进行rebase,那么D提交的父分支将成为C提交。
然而,在推送时,D提交的父提交是A提交,因此此时远程仓库和本地仓库的提交历史将变得混乱。
在使用rebase时,请确保在尚未将分支推送到git之前进行操作。
最后
您觉得如何呢?如果有任何引起您兴趣的问题,请留下评论或其他反馈。