You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
merge会把分支上的commit合并为一个commit再合进来,而rebase正常操作是把commit依次合进去,会有多次commit的修改信息,只要加入-i参数也可以和merge一样合并为一个commit。 git rebase -i master之后会进入提交信息界面(待补图),只要把下图中要合并的commit前面的pick改为f,然后保存退出即可把置为f的commit合入被pick的commit中。
前言
版本控制系统:在文件的修改历程中保留修改历史,让你可以方便地撤销之前对文件的修改操作
git是分布式版本控制系统,包含一个中央仓库和多个本地仓库。中央仓库的主要任务是同步团队代码,保存版本历史的工作转交到了每个团队成员的本地仓库中。
概念
.git
这个文件夹保存了所有版本信息,是git的工作目录
commit
保存了文件的改动信息,有多个引用可以指代某个
commit
:sha-1
码(下图中commit
后的那串字符),几乎不可能出现的重复,所以取开头一段指代也是可以的master
,和自主创建的分支,都是某个commit
的引用HEAD
,总是指向当前commit
,且唯一origin/master
指代远程中央仓库的master
分支origin/HEAD
指代远程仓库中的HEAD
如图中所示,HEAD和master都指向
7428c141535
这个commit
branch
可以理解为一个指针,对某个
commit
的引用,是从初始commit
到branch
所指向的commit
之间的所有commits
的一个「串」,或者称为路径,且这条路径不唯一。master
本质也是一个分支,为创建仓库时第一次commit
默认创建的分支,自动指向了第一次commit
HEAD
一个总是指向当前
commit
(最新)的指针,且唯一,总是跟随着当前commit
的移动而移动在每次提交时
HEAD
都会自动向前移动到最新的commit
基本操作指令
git add
把所选文件的改动(如果有的话)添加到缓存区,
.
代表目录下的所有文件,每次有了新的改动提交前都要执行一次。git commit
git commit -m
+'msg'
把文件缓存提交到本地仓库并附加上这次commit的描述,然后将HEAD
指向这个commit
。总是基于HEAD指向的commit进行提交
git fetch
把远程的中央仓库的内容(版本信息,commit等)同步到本地仓库。
git branch
git branch
+name
创建分支本质上是为当前
commit
(即HEAD
指向的commit
)创建一个引用创建后执行
git push origin master
把分支推送到远程仓库,orgin
是创建时中央仓库的默认名字git branch -d
删除这个引用,但不会删除commit
,被遗留的无法追溯的commit
会被自动回收未被合入
master
的branch
需要使用git branch -D
删除。git checkout
本质是移动
HEAD
指向。checkout
的意思就是把某个commit
作为当前commit
,把HEAD
移动过去,并把工作目录的文件内容替换成这个commit
所对应的内容git checkout
+branchName
切换分支git checkout -b
+branchName
创建分支并切换到该分支git checkout -b
+new branchName
+origin/master
基于远程 master 分支切出一个新分支git checkout
+.
清空暂存区git merge
+targetCommit
指定一个
commit
,把它合并到当前的commit
来。具体来说就是,从目标
commit
和当前commit
(即HEAD
所指向的commit
)分叉的位置起,把目标commit
的路径上的所有commit
的内容一并应用到当前commit
,然后自动生成一个新的commit
。git rebase
rebase
的意思是,给你的commit
序列重新设置基础点(也就是父commit
)。展开来说就是,把你指定的commit
以及它所在的commit
串,以指定的目标commit
为基础,依次重新提交一次git checkout example
=>git rebase master
=>git checkout master
=>git merge example
这3步操作就是切换到example
分支,然后把从切出该分支开始的第一个commit
到当前(最后一个 )commit
组成的commit
串,以master
指向的commit
为基础,再重新提交一次,然后切回master
执行一次merge
就可以把example
分支的修改信息合入master
分支。请看图:rebase
和merge
的比较git rebase
和git merge
有异曲同工之妙,结果都是合并了两个分支的修改信息。example
分支的修改信息合并到master
分支上为例):rebase
是站在example
分支上合到master
分支去,而merge是站在master
分支上把example
分支合进来。所以区别之一就是站在的基准不同。merge
会把分支上的commit
合并为一个commit
再合进来,而rebase
正常操作是把commit
依次合进去,会有多次commit
的修改信息,只要加入-i
参数也可以和merge
一样合并为一个commit
。git rebase -i master
之后会进入提交信息界面(待补图),只要把下图中要合并的commit
前面的pick
改为f
,然后保存退出即可把置为f
的commit
合入被pick
的commit
中。git pull
本质是先
git fetch
同步信息到本地,然后在执行git merge
把新增的commit
合并到当前commit
中。conflict
在合并
commit
的过程中,git
本身自带一定的自动合并能力,但是当两个commit
修改了同一个地方,git
就傻傻分不清楚以哪个commit
的修改信息为准了,这时就产生了冲突,需要手动操作了。merge
中的冲突修改冲突 =>
git add .
=>git commit
即可解决冲突并成功合并在发生冲突时使用
git merge --abort
即可放弃这次合并,恢复到合并前的状态。rebase
中的冲突修改冲突 =>
git add .
=>git rebase --continue
即可解决这次冲突(可能需要解决多次冲突)同样使用
git rebase --abort
可放弃并恢复到变基前。Feature Branching
接下来先描述这个流行的团队协作模型
feature
或bug
修复全都从主分支(一般为master
)中切出一个branch
来写;branch
写完后,合并到master
,然后删掉这个branch
。举个例子
detail
分支进行开发commit
终于开发完成detail
分支推到中央仓库,并告诉同事分支名,帮忙review一下代码detail
分支合入到master
中,然后推送到中央仓库并删除该分支commit
,然后再从第3步开始,提交=>review,直到得到同事的pass,然后合入master
至此,一个工作流就描述完了。在这个过程中,团队的所有成员都同时进行开发,互不干预,所有分支在未得到pass之前都不会合入主分支,从而也保证了主分支的正常运行。
进阶操作指令
git stash
储藏假设这样一个场景。你正在
A
分支开发一个新功能,此时测试报了一个紧急bug
要你立马修复,但暂存区内修改了很多文件又不想提交上去,此时你就可以使用git stash
指令把暂存区内的内容储藏到一个未完结变更的堆栈中,随时可以重新应用。然后你就可以切到B
分支,等修复完成后,再切回A
分支使用git stash apply
指令恢复到原本的样子。撤回rebase
找到rebase前的commit的sha-1码:
git reflog
然后再
git reset --hard sha-1
修改
commit
刚
commit
完你就发现写错了,那这个时候就可以新写一个commit
修改,然后在commit
的时候加上--amend
参数,这个新的commit
就会替换掉刚才已经提交了的写错了的commit
git commit --amend
删除
commit
同样是刚commit完你就发现写错了,但是没有修改的价值了,不如删除了重写过,那这个时候就可以
git reset --hard HEAD^
来撤销这个commit
,本质上就是把指向最新commit
的HEAD
和branch
一同移到前一个
commit
用a分支覆盖b分支
git push origin a:b -f
checkout
和reset
的比较乍一看这两个指令都是移动指向,其实
checkout
只是移动了HEAD
,branch
还留在原地,而reset
是带着HEAD
和branch
一起移动的git cherry-pick
选择某个节点,合入该分支中。
假设当前有a、b两个分支。a分支的改动巨大,当前已合入master,b分支改动少量,还未合入master,若此时将b分支合入master,将产生大量冲突。这时可从现有master中切一个c分支,然后利用
cheery-pick
将b分支中的commit(可先合并b分支中的commit)合入c分支中,再把c合入master中...... (欢迎补充更多实用git命令)
.gitignore
排除不想被管理的文件和目录,把文件路径写入改文件即可
The text was updated successfully, but these errors were encountered: