Table des matières
git-rebase
git-merge
git-rebase 与 git-merge 的差异
使用 git-rebase 合併的优缺点
该用 git-rebase 或 git-merge?
git-merge 派
git-rebase 派
Maison outils de développement git Que font git-rebase et git-merge ? Quelle est la différence ?

Que font git-rebase et git-merge ? Quelle est la différence ?

Jul 15, 2022 am 10:36 AM
git github

À quoi servent git-rebase et git-merge ? Quelle est la différence entre git-rebase et git-merge ? L'article suivant vous présentera la différence entre git-rebase et git-merge. J'espère qu'il vous sera utile !

Que font git-rebase et git-merge ? Quelle est la différence ?

Utiliser Git pour le contrôle de version devrait être l'un des flux de travail que la plupart des ingénieurs rencontrent quotidiennement, mais ce que j'utilise n'est rien de plus que push, pull code>, merge, checkout ou log et d'autres commandes si vous allez plus en profondeur, vous ne pouvez pas comprendre cela pendant le processus. interview. Question : "Connaissez-vous la différence entre la fusion et le rebase dans Git ?" pushpullmergecheckoutlog 等几个指令,更深入一点就一问三不知了,在面试时被问到了这个问题:「你知道 Git 的 merge 和 rebase 有什麽不同吗?」

听完后我直接困惑,对我来说 rebase 就是用来整理 commit 的工具,居然还可以和 merge 做比较?【推荐学习:《Git教程》】

git-rebase

先来说说平常我会用 rebase 这个指令来干嘛,假如我新增了一个单元测试,然后 commit,这时候 log 就会多一条 commit 的纪录:

Que font git-rebase et git-merge ? Quelle est la différence ?

但是在 commit 完才发现,我少写了另一个测试案例,因此在补上之后,我又 commit 了一次:

Que font git-rebase et git-merge ? Quelle est la différence ?

这时记录中会多出另外一条 commit,不过对我来说,这两个 commit 在做的其实是同一件事,于是我在 push 到 remote 之前,就会想要先整理一下 commit,把这两条记录合并起来。

要把这两条记录合并起来有两个方法,第一个是 reset 到添加第一个测试案例之前,然后直接做一次 commit。第二个方法就是用 rebase 来处理!

首先让我们看看目前的 log:

Que font git-rebase et git-merge ? Quelle est la différence ?

我的目的是把 9dc67ff87af945 整理成一个,所以要调整的 commit  是从 init, 也就是  commit id为 7eb57cb 之后的所有 commit,搭配上 rebase 指令的话就是:

git rebase -i 7eb57cb
Copier après la connexion

输入完后就会跳到 vim 的编辑画面:

Que font git-rebase et git-merge ? Quelle est la différence ?

画面上会看到 7eb57cb 后的所有 commit(目前就只有  9dc67ff87af945 ),接着把 9dc67ffpick 改成 squash,表示把它与前一个 commit 做合并。先点一下 i 后开始用 vim 编辑内容:

Que font git-rebase et git-merge ? Quelle est la différence ?

编辑完后,可以点 esc 再输入 :wq 做保存,如果只是好奇进来玩看看,不想保存的话就输入 :q!。结束上面的流程后,再查看一次 log,会发现两条 commit 变成一笔了。保存完会跳到 commit message 的画面,这边可以让你输入合并后的 commit message,但我就不改了,一样直接保存:

Que font git-rebase et git-merge ? Quelle est la différence ?

结束上方的流程后,再查看一次 log,会发现两笔 commit 变成一笔了:

Que font git-rebase et git-merge ? Quelle est la différence ?

先 nice,上述的操作为 rebase 的 interactive mode,在 git rebase 后输入的 -i 其实就是 interactive 的缩写。

git-merge

大家应该对 merge 指令都非常熟悉,因为在做新功能的时候,通常都会拉一个分支出去,完成后再 merge

J'ai été immédiatement confus après l'avoir écouté, pour moi, le rebase est un outil utilisé pour organiser les commits. [Apprentissage recommandé : "Tutoriel Git"]

git-rebase

Que font git-rebase et git-merge ? Quelle est la différence ?Tout d'abord, parlons de ce que j'utilise habituellement avec la commande rebase. Si j'ajoute un nouveau test unitaire, alors commit, puis log code> aura. un autre enregistrement de <code>commit : 🎜Que font git-rebase et git-merge ? Quelle est la différence ?🎜🎜Mais j'ai découvert après le commit que j'avais manqué d'écrire un autre scénario de test, alors je l'ai ajouté. Après cela, je me suis engagé encore une fois : 🎜🎜Que font git-rebase et git-merge ? Quelle est la différence ?🎜🎜À ce moment, il y aura un autre commit dans l'enregistrement, mais pour moi, ces deux commit sont je fais en fait la même chose, donc avant de passer à distance, je veux trier les commits et fusionner les deux enregistrements. 🎜🎜Il existe deux façons de fusionner ces deux enregistrements. La première consiste à réinitialiser avant d'ajouter le premier scénario de test, puis à effectuer un commit directement. La deuxième méthode consiste à utiliser rebase pour le gérer ! 🎜🎜Jetons d'abord un coup d'œil au journal actuel : 🎜🎜Que font git-rebase et git-merge ? Quelle est la différence ?🎜🎜Mon but est d'organiser 9dc67ff et 87af945 en un seul , Donc les commits à ajuster proviennent de init, c'est-à-dire que tous les commits après l'identifiant de commit sont 7eb57cb S'ils sont combinés avec la commande rebase, ce sera : 🎜.
git checkout string-library
Copier après la connexion
Copier après la connexion
🎜Il sautera après la saisie. Accédez à l'écran d'édition de vim : 🎜🎜image .png🎜🎜Vous verrez tous les commits après 7eb57cb à l'écran (actuellement seulement 9dc67ff et 87af945), puis changez le pick de 9dc67ff en squash, ce qui signifie fusionner avec le commit précédent. Cliquez d'abord sur i, puis commencez à éditer le contenu avec vim : 🎜🎜Que font git-rebase et git-merge ? Quelle est la différence ?🎜🎜Après l'édition, vous pouvez cliquer sur Échap et saisir :wq pour enregistrer. Si vous êtes juste curieux, entrez et jouez. Si vous ne souhaitez pas le sauvegarder, entrez :q!. Après avoir terminé le processus ci-dessus, vérifiez à nouveau le journal et vous constaterez que les deux validations ne font qu'un. Après avoir enregistré, vous accéderez à l'écran du message de validation. Ici, vous pouvez saisir le message de validation fusionné, mais je ne le modifierai pas et je l'enregistrerai directement : 🎜🎜Que font git-rebase et git-merge ? Quelle est la différence ?🎜🎜Terminer le processus ci-dessus Enfin , vérifiez à nouveau le journal et vous constaterez que deux commits ne font qu'un : 🎜🎜Que font git-rebase et git-merge ? Quelle est la différence ?🎜🎜Bien d'abord, l'opération ci-dessus est le mode interactif de rebase, entré après git rebase - je suis en fait l'abréviation de interactif. 🎜

git-merge

🎜Tout le monde devrait être très familier avec la commande de fusion, car lorsque vous créez de nouvelles fonctionnalités, vous retirez généralement une branche, puis fusionnez une fois terminée. Revenez à la branche principale telle que master ou develop. Le déroulement de l'opération est le suivant : 🎜🎜🎜🎜

在 merge 的时候会有两种情况,第一种是  fast-forward,会把被合并分支的 HEAD 的 reference 移到要合併分支内最新的 commit 上,上方操作的 merge 结果就是 fast-forward,master 的 HEAD 被移到 string-library 的最新 commit,画成图的话就是这样子:

Que font git-rebase et git-merge ? Quelle est la différence ?

但是如果在执行 merge 的时候产生冲突,那分支的合并行为就会和 fast-forward 有点不同了。举例来说,我分别在 master 和 string-library 的同一个文件添加内容,那当我执行 merge 的时候就会要求先修复冲突:

Que font git-rebase et git-merge ? Quelle est la différence ?

修复完后,再执行 commit 完成合并,而这一次合并时,会再多一个 commit 是有关 merge 了 string-library 分支的纪录:

Que font git-rebase et git-merge ? Quelle est la différence ?

这个情况画成图就会像这样子:

Que font git-rebase et git-merge ? Quelle est la différence ?

git-rebase 与 git-merge 的差异

看完上方对 rebasemerge 的介绍后,你也许会想说:

「咦?那这两个不是完全不同的东西吗?」

对的,原本我也是这麽认为,一直到我去看了 git-rebase 的文档,才发现原来我一直误会它了。在 git book 的 rebase 篇章,第一段就说明了,在 Git 里有两种方法可以用来整合两个分支,而这两个在上方都有提到,分别为 mergerebase

Que font git-rebase et git-merge ? Quelle est la différence ?

从上方的 merge 例子已经知道了,merge 在合并的时候会有 fast-forward,和冲突时用一个 commit 记录合并变更的两种情形。而 rebase 的整合方式非常有趣,依照关于 rebase 的另一段说明,它可以「把某个分支中所有 commit 的过程,以另一个分支的 commit 为基础重播一遍」:

Que font git-rebase et git-merge ? Quelle est la différence ?

这是什麽意思呢?首先让我们回到上述的例子,并在 master 分支上用 reset,让 master 的版本回到合并 string-library 之前:

Que font git-rebase et git-merge ? Quelle est la différence ?

现在我们要用 rebase 指令,将 string-library 所有的 commit 修改,以 master 的 commit 为基础跑一次。使用 rebase 合并的第一步,要先切到想重播 commit 的分支:

git checkout string-library
Copier après la connexion
Copier après la connexion

然后再输入 git rebase 指令,并于后方指定要在哪个分支上重播:

git rebase master
Copier après la connexion

执行结果:

Que font git-rebase et git-merge ? Quelle est la différence ?

在 rebase 重播 commit 的过程中,和 merge 相似的地方在于,如果有冲突的话还是需要解决,但在解决后,并不是使用 commit 指令进行合并,而是要输入 git rebase --continue,让 rebase 可以继续重播接下来的 commit:

Que font git-rebase et git-merge ? Quelle est la différence ?

重播完成时,会显示目前重播到哪个 commit,以 string-library 来说就是最新的add string unit test D。这时候的分支关系,画成图就会变成:

Que font git-rebase et git-merge ? Quelle est la différence ?

上图在经过 rebase 之后,string-library 里 07e38fb 修改,会以 master 的 commit 为基底再重播一次。

需要注意的是,重播后的 commit id 会和原本的不一样,这等于完全改写了分支内所有的 commit 历史纪录。

De plus, après avoir exécuté le rebase, string-library n'a pas réellement été fusionné avec la branche master, vous devez donc toujours revenir à la branche master pour exécuter la fusion et terminer la fusion : string-library 其实还没有被合并回 master 分支上,因此还是要再切回 master 执行 merge,以完成合併:

Que font git-rebase et git-merge ? Quelle est la différence ?

因为已经先用 rebase 在重播时处理完 commit 的冲突了,所以现在 merge 就会直接走 fast-forward 合并,也不会另外多一个 merge 的 commit 纪录。

使用 git-rebase 合併的优缺点

优点

  • 不会在合併时产生多馀的 commit。

  • 可以在重播的时候以 commit 为单位处理冲突。

  • 合併时会依分支的 commit 排列,能够比较清楚的 review issue 或 feature 处理的过程。如果使用 merge,在合併后就会依照时间顺序穿插排列两个分支的 commit。

  • 在贡献开源项目的时候,如果在 push 前先做 rebase,那作者就能够直接以 fast-forward 的方式合并,不需要再另外解冲突。

缺点

最大的缺点就是上方提到的,使用 rebase 会修改 commit 的历史纪录,如果在自己的 local 整理 commit 或是分支那还好,但如果不小心去异动到 remote 的分支,然后又更不小心用了 git push -f,那可能就会被同事讨厌,或被投稿到纯靠北工程师。

该用 git-rebase 或 git-merge?

在查了一些资料后,发现 rebase 和 merge 都各有拥护者,我先阐述他们的想法,再主观提一下自己的观点。

git-merge 派

支持 git-merge 派的工程师们认为,版本纪录有价值的地方就在于项目的 commit,也就是这个项目的「历史实际上发生过哪些事情」,如果你去修改了这些历史纪录那就很不好。因此即使不同分支的内容在 merge 后都混在一起,但这些内容仍然说明了这个项目的历史。

git-rebase 派

支持 git-rebase

Que font git-rebase et git-merge ? Quelle est la différence ?

Étant donné que le rebase a été utilisé pour gérer les conflits de validation lors de la relecture, la fusion ira désormais directement à la fusion en avance rapide, et il n'y aura pas d'autre enregistrement de validation pour la fusion.

Avantages et inconvénients de l'utilisation de git-rebase pour fusionner

Avantages

  • Aucun commit redondant ne sera généré pendant la fusionner.
  • Les conflits peuvent être gérés dans des unités de validation pendant la relecture. 🎜
  • 🎜Lors de la fusion, elle sera organisée en fonction du commit de la branche, afin que le problème de révision ou le processus de traitement des fonctionnalités puisse être clairement compris. Si vous utilisez la fusion, les commits des deux branches seront classés par ordre chronologique après la fusion. 🎜
  • 🎜Lorsque vous contribuez à un projet open source, si vous rebasez avant de pousser, l'auteur peut directement fusionner de manière rapide sans avoir à résoudre les conflits séparément. 🎜
🎜Inconvénients🎜🎜Le plus gros inconvénient est celui mentionné ci-dessus. L'utilisation du rebase modifiera l'historique des commits ou des branches localement, ce n'est pas grave, mais si vous y allez accidentellement. modifiez la branche distante, puis utilisez accidentellement git push -f, vous pourriez être détesté par vos collègues, ou vous pourriez être soumis à un ingénieur purement nordique. 🎜🎜🎜Dois-je utiliser git-rebase ou git-merge ? 🎜🎜🎜Après avoir vérifié certaines informations, j'ai découvert que le rebasement et la fusion ont tous deux leurs propres partisans. Je vais d'abord expliquer leurs idées, puis mentionner subjectivement mes propres opinions. 🎜🎜🎜git-merge Pai🎜🎜🎜 prend en charge git-merge. Les ingénieurs de Pai pensent que la valeur des enregistrements de version réside dans les commits du projet, c'est-à-dire dans "l'historique de ce projet qui s'est réellement produit". " "Quelles choses", ce serait très mauvais si vous modifiiez ces documents historiques. Ainsi, même si les contenus des différentes branches sont mélangés après la fusion, ils illustrent néanmoins l'histoire du projet. 🎜🎜🎜git-rebase faction 🎜🎜🎜 prend en charge git-rebase. Les ingénieurs de la faction estiment que le commit parle du "processus d'évolution" de ce projet. Ce qui est important, c'est ce qui se passe, même si. il est modifié L'historique du commit a été supprimé, mais ce qui s'est passé n'a pas changé Puisque nous pouvons utiliser un enregistrement plus clair et plus concis pour que les générations futures puissent le lire, nous devrions le faire. 🎜🎜🎜Opinion subjective personnelle🎜🎜🎜Personnellement, j'utilise toujours git-rebase pour modifier les commits afin de rendre les enregistrements historiques plus simples et plus faciles à lire, mais l'utilisation est limitée avant de pousser à distance si les enregistrements ont été poussés à distance aujourd'hui. , alors peu importe le désordre, je ne les modifierai pas. Après tout, les enregistrements distants sont partagés par tout le monde. Si je ne les modifie pas à volonté, je respecte les autres membres de l'équipe. 🎜🎜【Recommandation de didacticiel vidéo connexe : 🎜front-end Web🎜】🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment mettre à jour le code dans GIT Comment mettre à jour le code dans GIT Apr 17, 2025 pm 04:45 PM

Étapes pour mettre à jour le code GIT: Consultez le code: Git Clone https://github.com/username/repo.git Obtenez les derniers modifications: Git Fetch Merge Modifications: Git Merge Origin / Master Push Changes (Facultatif): Git Push Origin Master

Comment télécharger des projets GIT vers local Comment télécharger des projets GIT vers local Apr 17, 2025 pm 04:36 PM

Pour télécharger des projets localement via GIT, suivez ces étapes: installer Git. Accédez au répertoire du projet. Clonage du référentiel distant à l'aide de la commande suivante: Git Clone https://github.com/username/repository-name.git

Que faire si le téléchargement git n'est pas actif Que faire si le téléchargement git n'est pas actif Apr 17, 2025 pm 04:54 PM

Résolve: lorsque la vitesse de téléchargement GIT est lente, vous pouvez prendre les étapes suivantes: Vérifiez la connexion réseau et essayez de changer la méthode de connexion. Optimiser la configuration GIT: augmenter la taille du tampon post (Git Config - Global Http.PostBuffer 524288000) et réduire la limite à basse vitesse (Git Config - Global Http.LowspeedLimit 1000). Utilisez un proxy GIT (comme Git-Proxy ou Git-LFS-Proxy). Essayez d'utiliser un client GIT différent (comme SourceTree ou GitHub Desktop). Vérifiez la protection contre les incendies

Comment supprimer un référentiel par git Comment supprimer un référentiel par git Apr 17, 2025 pm 04:03 PM

Pour supprimer un référentiel GIT, suivez ces étapes: Confirmez le référentiel que vous souhaitez supprimer. Suppression locale du référentiel: utilisez la commande RM -RF pour supprimer son dossier. Supprimer à distance un entrepôt: accédez à l'entrepôt, trouvez l'option "Supprimer l'entrepôt" et confirmez l'opération.

Comment utiliser Git Commit Comment utiliser Git Commit Apr 17, 2025 pm 03:57 PM

Git Commit est une commande qui enregistre le fichier qui passe à un référentiel GIT pour enregistrer un instantané de l'état actuel du projet. Comment l'utiliser est comme suit: Ajoutez des modifications à la zone de stockage temporaire Écrivez un message de soumission concis et informatif pour enregistrer et quitter le message de soumission pour compléter la soumission éventuellement: Ajoutez une signature pour le journal GIT Utilisez le contenu de soumission pour afficher le contenu de soumission

Comment résoudre le problème de recherche efficace dans les projets PHP? Typesense vous aide à y parvenir! Comment résoudre le problème de recherche efficace dans les projets PHP? Typesense vous aide à y parvenir! Apr 17, 2025 pm 08:15 PM

Lors du développement d'un site Web de commerce électronique, j'ai rencontré un problème difficile: comment atteindre des fonctions de recherche efficaces en grande quantité de données de produit? Les recherches traditionnelles de base de données sont inefficaces et ont une mauvaise expérience utilisateur. Après quelques recherches, j'ai découvert le moteur de recherche TypeSense et résolu ce problème grâce à son client PHP officiel TypeSense / TypeSen-PHP, ce qui a considérablement amélioré les performances de recherche.

Comment soumettre des dossiers vides dans git Comment soumettre des dossiers vides dans git Apr 17, 2025 pm 04:09 PM

Pour soumettre un dossier vide dans GIT, suivez simplement les étapes suivantes: 1. Créez un dossier vide; 2. Ajouter le dossier à la zone de stadification; 3. Soumettre les modifications et saisir un message de validation; 4. (Facultatif) Poussez les modifications au référentiel distant. Remarque: le nom d'un dossier vide ne peut pas commencer. Si le dossier existe déjà, vous devez utiliser Git Add --Force pour ajouter.

Comment fusionner le code dans git Comment fusionner le code dans git Apr 17, 2025 pm 04:39 PM

Processus de fusion du code GIT: tirez les dernières modifications pour éviter les conflits. Passez à la branche que vous souhaitez fusionner. Lancer une fusion, spécifiant la branche pour fusionner. Résoudre les conflits de fusion (le cas échéant). Stadification et engager la fusion, fournir un message de validation.

See all articles