git-rebase와 git-merge는 어떤 용도로 사용되나요? git-rebase와 git-merge의 차이점은 무엇입니까? 다음 기사에서는 git-rebase와 git-merge의 차이점을 소개하겠습니다. 도움이 되길 바랍니다.
버전 관리를 위해 Git을 사용하는 것은 대부분의 엔지니어가 매일 접하는 작업 흐름 중 하나여야 하지만 제가 사용하는 것은 push
, pull code>, merge
, checkout
또는 log
및 기타 여러 명령을 더 자세히 살펴보면 무엇을 물어봐야 할지 알 수 없습니다. 질문: "Git에서 병합과 리베이스의 차이점을 아시나요?" push
、pull
、merge
、checkout
或 log
等几个指令,更深入一点就一问三不知了,在面试时被问到了这个问题:「你知道 Git 的 merge 和 rebase 有什麽不同吗?」
听完后我直接困惑,对我来说 rebase 就是用来整理 commit 的工具,居然还可以和 merge 做比较?【推荐学习:《Git教程》】
git-rebase
先来说说平常我会用 rebase 这个指令来干嘛,假如我新增了一个单元测试,然后 commit
,这时候 log
就会多一条 commit
的纪录:
但是在 commit 完才发现,我少写了另一个测试案例,因此在补上之后,我又 commit 了一次:
这时记录中会多出另外一条 commit
,不过对我来说,这两个 commit
在做的其实是同一件事,于是我在 push 到 remote 之前,就会想要先整理一下 commit,把这两条记录合并起来。
要把这两条记录合并起来有两个方法,第一个是 reset
到添加第一个测试案例之前,然后直接做一次 commit
。第二个方法就是用 rebase
来处理!
首先让我们看看目前的 log:
我的目的是把 9dc67ff
和 87af945
整理成一个,所以要调整的 commit 是从 init, 也就是 commit id为 7eb57cb
之后的所有 commit,搭配上 rebase
指令的话就是:
git rebase -i 7eb57cb
输入完后就会跳到 vim 的编辑画面:
画面上会看到 7eb57cb
后的所有 commit(目前就只有 9dc67ff
和 87af945
),接着把 9dc67ff
的 pick
改成 squash
,表示把它与前一个 commit 做合并。先点一下 i 后开始用 vim 编辑内容:
编辑完后,可以点 esc 再输入 :wq
做保存,如果只是好奇进来玩看看,不想保存的话就输入 :q!
。结束上面的流程后,再查看一次 log,会发现两条 commit 变成一笔了。保存完会跳到 commit message 的画面,这边可以让你输入合并后的 commit message,但我就不改了,一样直接保存:
结束上方的流程后,再查看一次 log,会发现两笔 commit 变成一笔了:
先 nice,上述的操作为 rebase 的 interactive mode,在 git rebase 后输入的 -i 其实就是 interactive
的缩写。
git-merge
大家应该对 merge 指令都非常熟悉,因为在做新功能的时候,通常都会拉一个分支出去,完成后再 merge
git-rebase

commit
, log code>가 됩니다. <code>커밋
의 또 다른 기록: 🎜

commit
이 있을텐데 제게는 이 두 commit
이 실제로 동일한 작업을 수행하므로 원격으로 푸시하기 전에 커밋을 정렬하고 두 레코드를 병합하고 싶습니다. 🎜🎜이 두 레코드를 병합하는 방법에는 두 가지가 있습니다. 첫 번째는 첫 번째 테스트 사례를 추가하기 전에 reset
을 수행한 다음 직접 commit
을 수행하는 것입니다. 두 번째 방법은 rebase
를 사용하여 처리하는 것입니다! 🎜🎜먼저 현재 로그를 살펴보겠습니다. 🎜🎜
9dc67ff
와 87af945
를 하나로 정리하는 것입니다 , 따라서 조정될 커밋은 init에서 가져온 것입니다. 즉, 커밋 ID 뒤의 모든 커밋은 7eb57cb
입니다. rebase
명령과 결합하면 다음과 같습니다. 🎜 git checkout string-library🎜입력 후 점프합니다. vim 편집 화면으로 이동: 🎜🎜

7eb57cb
이후의 모든 커밋을 볼 수 있습니다(현재는 만) 9dc67ff
및 87af945), 그런 다음 9dc67ff
의 pick
을 squash
로 변경합니다. 즉, 병합을 의미합니다. 이전 커밋과 함께 사용하세요. 먼저 i를 클릭한 다음 vim으로 콘텐츠 편집을 시작하세요: 🎜🎜
:wq
를 입력해 저장하시면 됩니다. 궁금하신 분들은 들어가서 플레이해보세요. 저장하고 싶지 않다면 :q!
를 입력하세요. 위의 과정을 모두 마친 후 로그를 다시 확인해 보면 두 개의 커밋이 하나가 된 것을 확인할 수 있습니다. 저장 후 커밋 메시지 화면으로 이동합니다. 여기에서 병합된 커밋 메시지를 입력할 수 있지만 변경하지 않고 직접 저장하겠습니다. 🎜🎜

interactive
의 약어입니다. 🎜git-merge
🎜모든 사람은 병합 명령에 매우 익숙해야 합니다. 왜냐하면 새로운 기능을 만들 때 일반적으로 분기를 꺼내고완료 후 병합 master나 development 등의 메인 브랜치로 돌아갑니다. 작업 과정은 다음과 같습니다: 🎜🎜🎜🎜<p>在 merge 的时候会有两种情况,第一种是 <code>fast-forward
,会把被合并分支的 HEAD 的 reference 移到要合併分支内最新的 commit 上,上方操作的 merge 结果就是 fast-forward
,master 的 HEAD 被移到 string-library 的最新 commit,画成图的话就是这样子:
但是如果在执行 merge 的时候产生冲突,那分支的合并行为就会和 fast-forward 有点不同了。举例来说,我分别在 master 和 string-library 的同一个文件添加内容,那当我执行 merge 的时候就会要求先修复冲突:
修复完后,再执行 commit 完成合并,而这一次合并时,会再多一个 commit 是有关 merge 了 string-library 分支的纪录:
这个情况画成图就会像这样子:
git-rebase 与 git-merge 的差异
看完上方对 rebase
和 merge
的介绍后,你也许会想说:
「咦?那这两个不是完全不同的东西吗?」
对的,原本我也是这麽认为,一直到我去看了 git-rebase 的文档,才发现原来我一直误会它了。在 git book 的 rebase 篇章,第一段就说明了,在 Git 里有两种方法可以用来整合两个分支,而这两个在上方都有提到,分别为 merge
和 rebase
:
从上方的 merge 例子已经知道了,merge 在合并的时候会有 fast-forward
,和冲突时用一个 commit 记录合并变更的两种情形。而 rebase 的整合方式非常有趣,依照关于 rebase 的另一段说明,它可以「把某个分支中所有 commit 的过程,以另一个分支的 commit 为基础重播一遍」:
这是什麽意思呢?首先让我们回到上述的例子,并在 master 分支上用 reset
,让 master 的版本回到合并 string-library 之前:
现在我们要用 rebase 指令,将 string-library 所有的 commit 修改,以 master 的 commit 为基础跑一次。使用 rebase 合并的第一步,要先切到想重播 commit 的分支:
git checkout string-library
然后再输入 git rebase
指令,并于后方指定要在哪个分支上重播:
git rebase master
执行结果:
在 rebase 重播 commit 的过程中,和 merge 相似的地方在于,如果有冲突的话还是需要解决,但在解决后,并不是使用 commit 指令进行合并,而是要输入 git rebase --continue,让 rebase 可以继续重播接下来的 commit:
重播完成时,会显示目前重播到哪个 commit,以 string-library
来说就是最新的add string unit test D
。这时候的分支关系,画成图就会变成:
上图在经过 rebase 之后,string-library
里 07e38fb 修改,会以 master 的 commit 为基底再重播一次。
需要注意的是,重播后的 commit id 会和原本的不一样,这等于完全改写了分支内所有的 commit 历史纪录。
또한 리베이스를 실행한 후 string-library
는 실제로 마스터 브랜치로 다시 병합되지 않았으므로 병합을 완료하려면 마스터 브랜치로 다시 전환해야 합니다. string-library
其实还没有被合并回 master 分支上,因此还是要再切回 master 执行 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를 사용하여 병합할 때의 장점과 단점장점- 중복 커밋이 생성되지 않습니다. 병합.
- 재생 중 커밋 단위로 충돌을 처리할 수 있습니다. 🎜
- 🎜병합 시 검토 문제나 기능 처리 과정을 명확하게 이해할 수 있도록 브랜치의 커밋에 따라 정리됩니다. 병합을 사용하면 병합 후 두 브랜치의 커밋이 시간순으로 정렬됩니다. 🎜
- 🎜오픈소스 프로젝트에 기여할 때 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

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

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

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

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

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

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


핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

Dreamweaver Mac版
시각적 웹 개발 도구

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

WebStorm Mac 버전
유용한 JavaScript 개발 도구

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