찾다
개발 도구자식git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

git-rebase와 git-merge는 어떤 용도로 사용되나요? git-rebase와 git-merge의 차이점은 무엇입니까? 다음 기사에서는 git-rebase와 git-merge의 차이점을 소개하겠습니다. 도움이 되길 바랍니다.

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

버전 관리를 위해 Git을 사용하는 것은 대부분의 엔지니어가 매일 접하는 작업 흐름 중 하나여야 하지만 제가 사용하는 것은 push, pull code>, merge, checkout 또는 log 및 기타 여러 명령을 더 자세히 살펴보면 무엇을 물어봐야 할지 알 수 없습니다. 질문: "Git에서 병합과 리베이스의 차이점을 아시나요?" pushpullmergecheckoutlog 等几个指令,更深入一点就一问三不知了,在面试时被问到了这个问题:「你知道 Git 的 merge 和 rebase 有什麽不同吗?」

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

git-rebase

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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

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

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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

git rebase -i 7eb57cb

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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

git-merge

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

이 말을 듣고 바로 혼란스러워졌습니다. 리베이스는 커밋을 구성하는 데 사용되는 도구입니다. ? [추천 학습: "Git 튜토리얼"]

git-rebase

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?먼저 내가 일반적으로 rebase 명령을 사용하는 것에 대해 이야기해 보겠습니다. 새 단위 테스트를 추가하면 commit, log code>가 됩니다. <code>커밋의 또 다른 기록: 🎜git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?🎜🎜그런데 커밋하고 나서 다른 테스트 케이스 작성을 놓친 걸 알고 추가했어요. 그 후 커밋했어요. 다시: 🎜🎜git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?🎜🎜이때 기록에 또 다른 commit이 있을텐데 제게는 이 두 commit이 실제로 동일한 작업을 수행하므로 원격으로 푸시하기 전에 커밋을 정렬하고 두 레코드를 병합하고 싶습니다. 🎜🎜이 두 레코드를 병합하는 방법에는 두 가지가 있습니다. 첫 번째는 첫 번째 테스트 사례를 추가하기 전에 reset을 수행한 다음 직접 commit을 수행하는 것입니다. 두 번째 방법은 rebase를 사용하여 처리하는 것입니다! 🎜🎜먼저 현재 로그를 살펴보겠습니다. 🎜🎜git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?🎜🎜제 목적은 9dc67ff87af945를 하나로 정리하는 것입니다 , 따라서 조정될 커밋은 init에서 가져온 것입니다. 즉, 커밋 ID 뒤의 모든 커밋은 7eb57cb입니다. rebase 명령과 결합하면 다음과 같습니다. 🎜
git checkout string-library
🎜입력 후 점프합니다. vim 편집 화면으로 이동: 🎜🎜image .png🎜🎜화면에서 7eb57cb 이후의 모든 커밋을 볼 수 있습니다(현재는 만) 9dc67ff 및 87af945), 그런 다음 9dc67ffpicksquash로 변경합니다. 즉, 병합을 의미합니다. 이전 커밋과 함께 사용하세요. 먼저 i를 클릭한 다음 vim으로 콘텐츠 편집을 시작하세요: 🎜🎜git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?🎜🎜수정 후 esc를 누르고 :wq를 입력해 저장하시면 됩니다. 궁금하신 분들은 들어가서 플레이해보세요. 저장하고 싶지 않다면 :q!를 입력하세요. 위의 과정을 모두 마친 후 로그를 다시 확인해 보면 두 개의 커밋이 하나가 된 것을 확인할 수 있습니다. 저장 후 커밋 메시지 화면으로 이동합니다. 여기에서 병합된 커밋 메시지를 입력할 수 있지만 변경하지 않고 직접 저장하겠습니다. 🎜🎜git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?🎜🎜위 과정을 종료합니다 마지막으로 , 로그를 다시 확인하면 두 개의 커밋이 하나가 된 것을 확인할 수 있습니다: 🎜🎜git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?🎜🎜먼저 위의 작업은 git rebase 다음에 입력되는 대화형 리베이스 모드입니다. interactive의 약어입니다. 🎜

git-merge

🎜모든 사람은 병합 명령에 매우 익숙해야 합니다. 왜냐하면 새로운 기능을 만들 때 일반적으로 분기를 꺼내고 완료 후 병합 master나 development 등의 메인 브랜치로 돌아갑니다. 작업 과정은 다음과 같습니다: 🎜🎜🎜🎜<p>在 merge 的时候会有两种情况,第一种是  <code>fast-forward,会把被合并分支的 HEAD 的 reference 移到要合併分支内最新的 commit 上,上方操作的 merge 结果就是 fast-forward,master 的 HEAD 被移到 string-library 的最新 commit,画成图的话就是这样子:

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

git-rebase 与 git-merge 的差异

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

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

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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

git checkout string-library

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

git rebase master

执行结果:

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

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

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

또한 리베이스를 실행한 후 string-library는 실제로 마스터 브랜치로 다시 병합되지 않았으므로 병합을 완료하려면 마스터 브랜치로 다시 전환해야 합니다. string-library 其实还没有被合并回 master 分支上,因此还是要再切回 master 执行 merge,以完成合併:

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

因为已经先用 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

git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?

재생 중 커밋 충돌을 처리하기 위해 리베이스가 사용되었기 때문에 이제 병합은 빨리 감기 병합으로 직접 이동하며 병합에 대한 다른 커밋 기록은 없습니다.

git-rebase를 사용하여 병합할 때의 장점과 단점

장점

  • 중복 커밋이 생성되지 않습니다. 병합.
  • 재생 중 커밋 단위로 충돌을 처리할 수 있습니다. 🎜
  • 🎜병합 시 검토 문제나 기능 처리 과정을 명확하게 이해할 수 있도록 브랜치의 커밋에 따라 정리됩니다. 병합을 사용하면 병합 후 두 브랜치의 커밋이 시간순으로 정렬됩니다. 🎜
  • 🎜오픈소스 프로젝트에 기여할 때 Push하기 전에 Rebase를 하면 별도로 충돌을 해결할 필요 없이 작성자가 Fast-Forward 방식으로 직접 Merge할 수 있습니다. 🎜
🎜단점🎜🎜 가장 큰 단점은 위에서 언급한 것입니다. 리베이스를 사용하면 커밋 기록이 수정됩니다. 로컬에서 커밋이나 브랜치를 구성하면 괜찮지만 실수로 변경하면 됩니다. 원격 지점에 가서 실수로 git push -f를 사용하면 동료들에게 미움을 받거나 순전히 북부 엔지니어에게 제출될 수 있습니다. 🎜🎜🎜git-rebase 또는 git-merge를 사용해야 하나요? 🎜🎜🎜몇 가지 정보를 확인한 결과, 리베이스와 병합 모두 각자의 지지자가 있다는 것을 알았습니다. 먼저 그들의 아이디어를 설명한 다음 주관적으로 제 의견을 언급하겠습니다. 🎜🎜🎜git-merge Pai🎜🎜🎜는 git-merge를 지원합니다. Pai의 엔지니어들은 버전 기록의 가치가 프로젝트의 커밋, 즉 "이 프로젝트의 역사가 실제로 일어났는지"에 있다고 믿습니다. "무슨 일이냐", 이런 역사적 기록을 수정한다면 매우 안타까울 것입니다. 따라서 병합 후 서로 다른 브랜치의 콘텐츠가 혼합되더라도 해당 콘텐츠는 여전히 프로젝트의 역사를 보여줍니다. 🎜🎜🎜git-rebase 팩션 🎜🎜🎜은 git-rebase를 지원합니다. 팩션의 엔지니어들은 커밋이 이 프로젝트의 "진화 과정"에 대해 이야기하고 있다고 생각합니다. 수정되었습니다. 커밋의 기록은 삭제되었지만 발생한 내용은 변경되지 않았습니다. 미래 세대가 읽을 수 있도록 더 명확하고 간결한 기록을 사용할 수 있으므로 그렇게 해야 합니다. 🎜🎜🎜개인적인 주관적 의견🎜🎜🎜저는 개인적으로 기록 기록을 더 간단하고 읽기 쉽게 만들기 위해 커밋을 수정하기 위해 계속 git-rebase를 사용할 예정이지만 기록을 원격으로 푸시하기 전으로만 사용이 제한됩니다. 오늘은 아무리 지저분해도 수정하지 않겠습니다. 결국 원격 기록은 모두가 공유하므로 제가 마음대로 수정하지 않으면 다른 팀원들도 존중합니다. 🎜🎜【추천 관련 동영상 튜토리얼: 🎜웹 프론트엔드🎜】🎜

위 내용은 git-rebase와 git-merge는 무엇을 합니까? 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 掘金社区에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
Git and Github : 그들의 역할과 기능을 탐구합니다Git and Github : 그들의 역할과 기능을 탐구합니다May 09, 2025 am 12:25 AM

소프트웨어 개발에서 GIT 및 GITHUB의 역할과 기능은 코드 및 협업 개발을 관리하는 것입니다. Gitub은 Commit, Branch 및 병합 기능을 통해 코드 버전을 효율적으로 관리하는 반면 Github은 PullRequest 및 문제와 같은 코드 호스팅 및 협업 도구를 제공하여 팀 협업 효율성을 향상시킵니다.

Github : 코드 발견, 공유 및 기여Github : 코드 발견, 공유 및 기여May 08, 2025 am 12:26 AM

Github는 개발자가 코드를 발견, 공유 및 기여하는 선호하는 플랫폼입니다. 1) 파이썬 프로젝트와 같은 검색 기능을 통해 특정 코드베이스를 찾으십시오. 2) 저장소 및 푸시 코드를 만들어 전 세계 개발자와 공유하십시오. 3) 오픈 소스 프로젝트에 참여하고 Fork 및 PullRequest를 통해 코드를 기여하십시오.

Github와 함께 Git 사용 : 실용 가이드Github와 함께 Git 사용 : 실용 가이드May 07, 2025 am 12:11 AM

GIT는 버전 제어 시스템이며 Github는 GIT를 기반으로 한 온라인 플랫폼입니다. 코드 관리 및 팀 협업에 GIT 및 GitHub를 사용하는 단계에는 다음이 포함됩니다. 1. GIT 저장소 초기화 : Gitinit. 2. 임시 저장 영역에 파일을 추가하십시오 : Gitadd. 3. 변경 사항 제출 : GitCommit-M "InitialCommit". 4. github 리포지토리와 관련된 : gitremoteaddoriginhttps : //github.com/username/repository.git. 5. 코드를 github로 푸시하십시오 : Gitpush-UoriginMaste

Github의 영향 : 소프트웨어 개발 및 협업Github의 영향 : 소프트웨어 개발 및 협업May 06, 2025 am 12:09 AM

Github는 소프트웨어 개발 및 협업에 광범위한 영향을 미칩니다. 1. GIT의 분산 버전 제어 시스템을 기반으로 코드 보안 및 개발 유연성을 향상시킵니다. 2. PullRequest와 같은 기능을 통해 팀 협업 효율성 및 지식 공유를 향상시킵니다. 3. GitHubactions와 같은 도구는 개발 프로세스를 최적화하고 코드 품질을 향상시키는 데 도움이됩니다.

GitHub 사용 : 코드 공유, 관리 및 기여GitHub 사용 : 코드 공유, 관리 및 기여May 05, 2025 am 12:12 AM

GitHub에서 코드를 공유, 관리 및 기여하는 방법에는 다음이 포함됩니다. 1. 저장소 및 푸시 코드를 작성하고 readme 및 라이센스 파일을 작성합니다. 2. 지점, 태그 및 병합 요청을 사용하여 코드를 관리합니다. 3. 저장소를 포크하고 풀 레크스 기여 코드를 수정하고 제출하십시오. 이러한 단계를 통해 개발자는 GitHub를 효과적으로 사용하여 개발 효율성과 협업 기능을 향상시킬 수 있습니다.

Git vs. Github : 비교 분석Git vs. Github : 비교 분석May 04, 2025 am 12:07 AM

GIT는 분산 버전 제어 시스템이며 GitHub는 GIT 기반 협업 플랫폼입니다. GIT는 버전 제어 및 코드 관리에 사용되며 GitHub은 코드 검토 및 프로젝트 관리와 같은 추가 협업 기능을 제공합니다.

git vs. github : 차이 이해git vs. github : 차이 이해May 03, 2025 am 12:08 AM

GIT는 분산 버전 제어 시스템이며 Github는 GIT를 기반으로 한 온라인 플랫폼입니다. GIT는 버전 제어, 지점 관리 및 합병에 사용되며 GitHub은 코드 호스팅, 협업 도구 및 소셜 네트워킹 기능을 제공합니다.

Github : The Frontend, Git : 백엔드Github : The Frontend, Git : 백엔드May 02, 2025 am 12:16 AM

GIT는 백엔드 버전 제어 시스템이며 GitHub는 GIT를 기반으로 한 프론트 엔드 협업 플랫폼입니다. GIT는 코드 버전을 관리하고 GitHub은 사용자 인터페이스 및 협업 도구를 제공하며 두 사람은 함께 작동하여 개발 효율성을 향상시킵니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.