git只merge部分_⼀篇⽂章,教你学会Git 作者:范培华
在⽇常⼯作中,经常会⽤到Git操作。但是对于新⼈来讲,刚上来对Git很陌⽣,操作起来也很懵逼。本篇⽂章主要针对刚开始接触Git 的新⼈,理解Git的基本原理,掌握常⽤的⼀些命令。
⼀、Git⼯作流程
以上包括⼀些简单⽽常⽤的命令,但是先不关⼼这些,先来了解下⾯这4个专有名词。
Workspace:⼯作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库
⼯作区
程序员进⾏开发改动的地⽅,是你当前看到的,也是最新的。
平常我们开发就是拷贝远程仓库中的⼀个分⽀,基于该分⽀进⾏开发。在开发过程中就是对⼯作区的操作。
暂存区
.git⽬录下的index⽂件, 暂存区会记录git add添加⽂件的相关信息(⽂件名、⼤⼩、),不保存⽂件实体, 通过id指向每个⽂件实体。可以使⽤git status查看暂存区的状态。暂存区标记了你当前⼯作区中,哪些内容是被git管理的。
当你完成某个需求或功能后需要提交到远程仓库,那么第⼀步就是通过git add先提交到暂存区,被git管理。
本地仓库
保存了对象被提交 过的各个版本,⽐起⼯作区和暂存区的内容,它要更旧⼀些。
git commit后同步index的⽬录树到本地仓库,⽅便从下⼀步通过git push同步本地仓库与远程仓库的同步。
远程仓库
远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。
⼩结
1. 任何对象都是在⼯作区中诞⽣和被修改;
git常用指令2. 任何修改都是从进⼊index区才开始被版本控制;
3. 只有把修改提交到本地仓库,该修改才能在仓库中留下痕迹;
4. 与协作者分享本地的修改,可以把它们push到远程仓库来共享。
下⾯这幅图更加直接阐述了四个区域之间的关系,可能有些命令不太清楚,没关系,下部分会详细介绍。
⼆、常⽤Git命令
⽹上了个图,别⼈整理的⼀张图,很全很好,借来⽤下。下⾯详细解释⼀些常⽤命令。
HEAD
在掌握具体命令前,先理解下HEAD。
HEAD,它始终指向当前所处分⽀的最新的提交点。你所处的分⽀变化了,或者产⽣了新的提交点,HEAD就会跟着改变。add
add相关命令很简单,主要实现将⼯作区修改的内容提交到暂存区,交由git管理。
git add .添加当前⽬录的所有⽂件到暂存区git add
添加指定⽬录到暂存区,包括⼦⽬录git add 添加指定⽂件到暂存区
commit
commit相关命令也很简单,主要实现将暂存区的内容提交到本地仓库,并使得当前分⽀的HEAD向后移动⼀个提交点。
git commit -m 提交暂存区到本地仓库,message代表说明信息git commit -m 提交暂存区的指定⽂件到本地仓库git commit --amend -m 使⽤⼀次新的commit,替代上⼀次提交
branch
涉及到协作,⾃然会涉及到分⽀,关于分⽀,⼤概有展⽰分⽀,切换分⽀,创建分⽀,删除分⽀这四种操作。
git branch列出所有本地分⽀git branch -r列出所有远程分⽀git branch -a列出所有本地分⽀和远程分⽀git branch 新建⼀个分⽀,但依然停留在当前分⽀git checkout -b 新建⼀个分⽀,并切换到该分⽀git branch --track 新建⼀个分⽀,与指定的远程分⽀建⽴追踪关系git checkout 切换到指定分⽀,并更新⼯作区git branch -d 删除分⽀git push origin --delete 删除远程分⽀
关于分⽀的操作虽然⽐较多,但都⽐较简单好记。
merge
merge命令把不同的分⽀合并起来。如上图,在实际开放中,我们可能从master分⽀中切出⼀个分⽀,然后进⾏开发完成需求,中间经过R3,R4,R5的commit记录,最后开发完成需要合⼊master中,这便⽤到了merge。
git fetch merge之前先拉⼀下远程仓库最新代码git merge 合并指定分⽀到当前分⽀
⼀般在merge之后,会出现conflict,需要针对冲突情况,⼿动解除冲突。主要是因为两个⽤户修改了同⼀⽂件的同⼀块区域。如下图所⽰,需要⼿动解除。
rebase
rebase⼜称为衍合,是合并的另外⼀种选择。
在开始阶段,我们处于new分⽀上,执⾏git rebase dev,那么new分⽀上新的commit都在master分⽀上重演⼀遍,最后checkout切换回到new分⽀。这⼀点与merge是⼀样的,合并前后所处的分⽀并没有改变。git rebase dev,通俗的解释就是new分⽀想站在dev的肩膀上继续下去。rebase也需要⼿动解决冲突。
rebase与merge的区别
现在我们有这样的两个分⽀,test和master,提交如下:
D---E test    /A---B---C---F master
在master执⾏git merge test,然后会得到如下结果:
D--------E    /          A---B---C---F----G  test, master
在master执⾏git rebase test,然后得到如下结果:
A---B---D---E---C'---F'  test, master
可以看到,merge操作会⽣成⼀个新的节点,之前的提交分开显⽰。⽽rebase操作不会⽣成新的节点,是将两个分⽀融合成⼀个线性的提交。
如果你想要⼀个⼲净的,没有merge commit的线性历史树,那么你应该选择git
rebase
如果你想保留完整的历史记录,并且想要避免重写commit history的风险,你应该选择使⽤git merge
reset
reset命令把当前分⽀指向另⼀个位置,并且相应的变动⼯作区和暂存区。
git reset —soft 只改变提交点,暂存区和⼯作⽬录的内容都不改变git reset —mixed 改变提交点,同时改变暂存区的内容git reset —hard 暂存区、⼯作区的内容都会被修改到与提交点完全⼀致的状态git reset --hard HEAD让⼯作区回到上次提交时的状态
revert
git revert⽤⼀个新提交来消除⼀个历史提交所做的任何修改。
revert与reset的区别
git revert是⽤⼀次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
在回滚这⼀操作上看,效果差不多。但是在⽇后继续merge以前的⽼版本时有区别。因为git revert是⽤⼀次逆向的commit“中和”之前的提交,因此⽇后合并⽼的branch时,导致这部分改变不会再次出现,减少冲突。但是git reset是之间把某些commit在某个branch上删除,因⽽和⽼的branch再次merge时,这些被回滚的commit应该还会被引⼊,产⽣很多冲突。关于这⼀点,不太理解的可以看这篇⽂章。
git reset 是把HEAD向后移动了⼀下,⽽git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。