이 기사는 Git 기록을 깨끗하게 유지하는 방법에 대해 주로 설명합니다. 관심 있는 친구는 아래를 살펴보고 모든 사람에게 도움이 되기를 바랍니다.
저자는 최근 한 프로젝트의 아키텍처 마이그레이션 작업을 주도하고 있습니다. 마이그레이션 프로젝트의 무거운 역사적 부담과 많은 인력 협력으로 인해 여러 분기와 여러 커밋을 수행하는 것이 불가피합니다. 시간이 지남에 따라 git 제출 기록이 엉망이 되었습니다. 느낌을 주기 위해 그래픽 git 제출 기록을 가져왔습니다.
하렘에서 첩들이 호감을 얻기 위해 경쟁하는 것처럼 여러 가지가 미친 듯이 싸우고 있습니다. 이러한 상황이 발생하는 이유는 주로 git merge 명령을 남용하고 그에 따른 이해 비용이 부족하기 때문입니다. 오늘날 대규모 공장에서 일하는 프로그래머들은 변경 사항을 처음부터 신중하게 고려하지 않으면 필연적으로 "애자일" 개념의 홍보와 함께 온라인 변경의 급속한 반복이 발생하게 됩니다. 핵심 지표가 된 이후에는 이러한 무의미한 커밋 로그가 "다음 번에 처리"되어 시간이 지남에 따라 혼란스러워졌습니다.
일부 오픈 소스 저장소를 살펴보면 커밋 기록이 매우 깔끔하다는 것을 알 수 있습니다. 사실 이는 커뮤니티의 프로그래머가 더 유능하기 때문이 아니라 이를 채찍질할 KPI 스틱이 없기 때문입니다. 코드를 제출하기 전에 시간을 들여 커밋 로그를 정리합니다. 그리고 이번 글의 주인공은 바로 "Git Rebase" 입니다.
git rebase는 중국어로 "rebase"로 번역되며 일반적으로 분기 병합에 사용됩니다. 브랜치 병합이 언급되었기 때문에 git merge
명령은 반드시 필요합니다. git merge
这个命令。
相信每个新手程序员刚进入职场的时候,都会听到“xxx你把这个分支merge一下”这样的话。那么问题来了,假如你有6个程序员一起工作, 你就会有6个程序员的分支, 如果你使用merge, 你的代码历史树就会有六个branch跟这个主的branch交织在一起。
上图是 git merge
操作的流程示意图,Merge命令会保留所有commit的历史时间。每个人对代码的提交是各式各样的。尽管这些时间对于程序本身并没有任何意义。但是merge的命令初衷就是为了保留这些时间不被修改。于是也就形成了以merge时间为基准的网状历史结构。每个分支上都会继续保留各自的代码记录,主分支上只保留merge的历史记录。子分支随时都有可能被删除。子分子删除以后,你能够看到的记录也就是,merge某branch到某branch上了。这个历史记录描述基本上是没有意义的。
而 git rebase
中文翻译为“变基”,变得这个基指的是基准。如何理解这个基准呢?我们看一下下图。
我们可以看到经过变基后的feature分支的基准分支发生了变化,变成了最新的master。这就是所谓的“变基”。
通过上面的两张图可以很明显的发现,这两种合并分支的方式最大的区别在于,merge后的分支,会保留两个分支的操作记录,这在git commit log 树中会以交叉的形式保存。而rebase后的分支会基于最新的master分支,从而不会形成分叉,自始至终都是一条干净的直线。
关于
git rebase
和git merge
的详细用法不在本文的介绍范围内,详情可以参考互联网上的其他资料。
在变基过程中,我们通常需要进行commit的修改,而这也为我们整理git记录提供了一个可选方案。
假设我们有一个仓库,我在这个仓库里执行了4次提交,通过 git reflog
命令查看提交记录如下。
如果我们想将Commit-3、Commit-2和Commit-1的提交合并成一次提交(假设某次提交至改了一些pom文件),我们可以直接执行下面的命令
git rebase -i HEAD~3
-i
指的是 --interactive
,HEAD~3
위로 그림은
git merge
작업의 흐름도입니다. Merge 명령은 모든 커밋의 기록 시간을 유지합니다. 모든 사람의 코드 제출은 다양합니다. 이 시간은 프로그램 자체에는 아무런 의미가 없습니다. 그러나 병합 명령의 원래 의도는 이러한 시간이 수정되지 않도록 하는 것입니다. 결과적으로 병합 시간을 기준으로 한 네트워크 이력 구조가 형성됩니다. 각 브랜치는 자체 코드 기록을 계속 유지하며, 병합 내역만 기본 브랜치에 유지됩니다. 하위 지점은 언제든지 삭제될 수 있습니다. 하위 분자가 삭제된 후 볼 수 있는 기록은 특정 가지가 특정 가지로 병합되는 것입니다. 이 역사적 설명은 기본적으로 의미가 없습니다. 그리고 git rebase
는 중국어로 "rebase"로 번역되는데, 이 베이스는 기준선을 의미합니다. 이 벤치마크를 이해하는 방법은 무엇입니까? 아래 이미지를 살펴 보겠습니다. 🎜🎜 🎜🎜 us 기능 브랜치의 베이스 브랜치가 리베이스 이후 변경되어 최신 마스터가 된 것을 확인할 수 있습니다. 이것을 "리베이스"라고 합니다. 🎜🎜위의 두 그림에서 명확하게 볼 수 있듯이 브랜치를 병합하는 두 가지 방법의 가장 큰 차이점은 병합된 브랜치가 두 브랜치의 작업 기록을 유지하며 이는 git 커밋 로그에 십자가로 표시된다는 것입니다. 트리 형식으로 저장됩니다. 리베이스 이후의 브랜치는 최신 마스터 브랜치를 기반으로 하므로 분기가 없고 처음부터 끝까지 깔끔한 직선이 됩니다. 🎜🎜🎜리베이스 프로세스 중에는 일반적으로 커밋 수정이 필요하며 이는 git 레코드를 구성할 수 있는 옵션도 제공합니다. 🎜git rebase
및git merge
의 자세한 사용법은 이 글의 범위를 벗어납니다. 자세한 내용은 인터넷의 다른 정보를 참조하세요. 🎜
git reflog
명령을 통해 4개의 커밋을 실행했다고 가정해 보겠습니다. 아래 제출 기록. 🎜🎜🎜🎜원한다면 Commit-3, Commit-2 및 Commit-1의 커밋은 하나의 커밋으로 병합됩니다(특정 커밋에서 일부 pom 파일이 변경되었다고 가정). 다음 명령을 직접 실행할 수 있습니다. 🎜git rebase -i d2b9b78🎜
-i는 <code>--interactive
를 의미하고, HEAD~3
은 마지막 3개의 커밋을 나타냅니다. 🎜🎜물론 보관하고 싶은 최신 Commit🎜의 ID를 직접 지정할 수도 있습니다. 위의 예에서는 Commit-0의 ID이므로 🎜git rebase -i xxx git push -f git pull🎜라고 쓸 수도 있습니다. 다음과 같이 입력하겠습니다. 인터페이스: 🎜
这个界面是一个Vim界面,我们可以在这个界面中查看、编辑变更记录。有关Vim的操作,可以看我之前写的文章和录制的视频《和Vim的初次见面》
在看前三行之前,我们先来看一下第5行的命令加深一下我们对git rebase
的认识。
翻译过来就是,将d2b9b78..0e65e22
这几个分支变基到d2b9b78
这个分支,也就是将Commit-3/2/1/0
这几次变更合并到Commit-0
上。
回到前面三行,这三行表示的是我们需要操作的三个 Commit,每行最前面的是对该 Commit 操作的 Command。而每个命令指的是什么,命令行里都已经详细的告诉我们了。
pick
:使用该commitsquash
:使用该 Commit,但会被合并到前一个 Commit 当中fixup
:就像 squash
那样,但会抛弃这个 Commit 的 Commit message因此我们可以直接改成下面这样
这里使用fixup,而不是squash的主要原因是squash会让你再输入一遍commit的log,图省事的话,可以无脑选择fixup模式。
然后执行:wq
退出vim编辑器,我们可以看到控制台已经输出Successful了。
这个时候我们再来看下log 记录,执行git log --oneline
于是最近三次的提交记录就被合并成一条提交记录了。
那如果不是最后的几个commit合并,而是中间连续的几个Commit记录,可以用上述方法整理合并吗?答案是可以的,只不过需要注意一下。
我们重新创建一个新的仓库
如果这次我们想将"third commit"和"second commit"合并为一个提交,其实和上面的方式一样,我们只需执行git rebase -i HEAD~3
,然后将中间的提交改成fixup/squash
模式即可,如下图所示:
之所以是HEAD~3,是因为我们要做的变更是基于first commit做的,因此我们也可以写成
git rebase -i a1f3929
我们来看下更改完的commit log,如下图所示:
是不是就干掉了third commit了。
上面我们都是在本地的git仓库中进行的commit记录整理,但是在实际的开发过程中,我们基本上都是写完就直接push到远程仓库了,那应该如何让远程的开发分支也保持记录的整洁呢?
第一种做法是在push代码前就做在本地整理好自己的代码,但是这种做法并不适用于那种本地无法部署,需要部署到远程环境才能调试的场景。
这时我们只需要执行git push -f
命令,将自己的修改同步到远程分支即可。
-f
是force强制的意思,之所以要强制推送是因为本地分支的变更和远程分支出现了分歧,需要用本地的变更覆盖远程的。
而远程分支更新后,如果其他人也在这条分支上更改的话,还需要执行一个git pull
命令来同步远程分支。
这里我们来总结下让git提交记录保持整洁的三行代码。
git rebase -i xxx git push -f git pull
❗️❗️❗️Tips:由于rebase和push -f是有些危险的操作,因此只建议在自己的分支上执行哦。
推荐学习:《Git视频教程》
위 내용은 세 줄의 코드로 Git 커밋 기록을 깔끔하게 만드세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!