Git有两个基本作用:
- 版本控制
- 团队开发
一、Git工作流程
二、Git基本配置
设置用户信息
设置:(+如果要查看,只输入双引号前面的就好了)
1 | git config --global user.name "yourname" |
有3种范围:--local
只对某个仓库有效,--global
对当前用户的所有仓库有效,--system
对系统所有登录的用户有效。
要显示config的配置,加--list
。
三、Git基本使用
获取本地仓库
git init
,执行之后工作目录下就会产生.git
隐藏目录。
核心操作
clone
(克隆): 从远程仓库中克隆代码到本地仓库checkout
(检出):从本地仓库中检出一个仓库分支然后进行修订add
(添加): 在提交前先将代码提交到暂存区- 可以接单个文件名,也可以接通配符
commit
(提交): 暂存区 –> 本地仓库。本地仓库中保存修改的各个历史版本- 可以接
-m
后跟注释
- 可以接
fetch
(抓取) : 从远程库,抓取到本地仓库,不进行任何的合并动作,一般操作比较少pull
(拉取) : 从远程库拉到本地库,自动进行合并(merge
),然后放到到工作区,相当于fetch
+merge
push
(推送) : 修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库
辅助查看与操作
git status
:查看修改的状态git log [option]
:查看提交日志,git-log
以精简形式查看git log
:以默认形式查看提交日志git log --all
:显示所有分支的提交日志git log --pretty=oneline
:将提交信息显示为一行git log --abbrev-commit
:使得输出的 commitId 更简短git log --graph
:以图的形式显示提交历史,便于查看分支合并情况
git reflog commitID
:记录所有操作,可以回滚到任意地方git reset --hard commitID
:版本回退- 添加文件到忽略列表:创建
.gitignore
文件,列出要忽略的文件模式
回滚
如果在开发过程中,某个需求不需要了,此时分为3种情况讨论:
- 文件在工作区:执行
git checkout file
- 文件在暂存区:执行
git reset HEAD file
,让这个文件回到工作区,然后执行1 - 文件在本地仓库:执行
git reset -方式
(有3种)hard
:工作区、暂存区、本地仓库3个地方保持一致mixed
:让文件保存在工作区soft
:让文件保存在暂存区
四、Git分支
核心操作
查看本地分支:
git branch
创建本地分支:
git branch 分支名
切换分支:
git checkout 分支名
- 可以直接切换到一个不存在的分支(创建并切换):
git checkout -b 分支名
- 可以直接切换到一个不存在的分支(创建并切换):
合并分支:
git merge 分支名称
,一个分支上的提交可以合并到另一个分支删除分支:不能删除当前分支,只能删除其他分支
git branch -d b1
删除分支时,需要做各种检查git branch -D b1
不做任何检查,强制删除
解决冲突
步骤:
处理文件中冲突的地方
将解决完冲突的文件加入暂存区(
add
)提交到仓库(
commit
)
GitFlow
master
(生产) 分支:线上分支,主分支,中小规模项目作为线上运行的应用对应的分支;develop
(开发)分支:是从master
创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要是合并到master
分支,准备上线;feature/xxxx
分支:从develop
创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop分支;hotfix/xxxx
分支:从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master
、test
、develop
分支;还有一些其他分支,在此不再详述,例如
test
分支(用于代码测试)、pre
分支(预上线分支)等等。
五、Git远程仓库
基本命令
对接远程仓库:
git remote add <远端名称> <仓库路径>
查看远程仓库:
git remote
推送到远程仓库:
git push [-f] [--set-upstream] [远端名称 [本地分支名]:[远端分支名]]
- 如果远程分支名和本地分支名称相同,则可以只写本地分支
git push origin master
-f
表示强制覆盖--set-upstream
推送到远端的同时并且建立起和远端分支的关联关系- 如果当前分支已经和远端分支关联,则可以省略分支名和远端名
- 如果远程分支名和本地分支名称相同,则可以只写本地分支
查看本地分支与远程分支的关联关系:
git branch -vv
从远程仓库克隆:
git clone <仓库路径> [本地目录]
从远程仓库抓取/拉取:(如果不指定远端名称和分支名,就抓取所有分支)
git fetch [remote name] [branch name]
:将仓库里的更新都抓取到本地,不进行合并。git pull [remote name] [branch name]
:将远端仓库的修改拉到本地并自动进行合并,等同于fetch+merge
解决冲突
远程分支也是分支,解决冲突的方式和本地相同(看上文)。
需要先拉取远程仓库的提交,经过合并后才能推送到远端分支:
六、进阶命令
交互式变基
在本地使用,重新排序、合并、拆分、编辑或删除提交,从而整理提交历史,使其更加清晰。
rebase和merge的区别:都是实现合并分支,但是细节不同,rebase
会把复杂的提交历史修订为干净整洁的线性结构,并且产生新的commitID
。
使用步骤:
执行
git rebase -i HEAD~5
,此时打开一个编辑器,显示最近的5个提交,每个提交前有一个命令(默认是pick
)编辑提交列表,修改每一行前面的命令,例如
pick
改成reword
Git会按照指令提交
常用命令:
命令 | 缩写 | 作用 |
---|---|---|
pick |
p |
保留该提交(不做修改) |
reword |
r |
修改提交信息 |
edit |
e |
暂停 rebase,允许修改提交内容(如增删文件)或提交信息 |
squash |
s |
合并到前一个提交,并保留提交信息 |
fixup |
f |
合并到前一个提交,但丢弃当前提交的提交信息 |
drop |
d |
删除该提交 |
exec |
x |
执行一个 shell 命令(如运行测试) |
注意事项:
不要修改已经推送到远程仓库的提交历史(除非确定没有其他人基于此工作)
如果遇到冲突:
- 解决冲突后,用
git add
标记为已解决 - 继续 rebase:
git rebase --continue
- 或终止 rebase:
git rebase --abort
- 解决后强制推送到远程:
git push --force
- 解决冲突后,用
储藏
临时保存未提交的更改,将当前工作目录和暂存区的修改保存到一个“储藏区”(stash stack),可以快速切换分支或处理其他任务,后续再恢复这些更改。
基本命令:
基本命令 | 具体操作 | 说明 |
---|---|---|
存(入栈) | stash (push) |
默认存入当前工作区的修改到栈中 |
stash save "注释" |
可以连续存多次变动代码,添加注释方便区分 | |
取(出栈) | stash pop |
取出栈顶的修改并应用到当前工作区,同时从栈中移除该修改 |
注意:确保此时 pop 的变动代码是你需要的,否则 pop 后可能需要重新压栈 |
||
stash apply |
取出栈顶的修改并应用到当前工作区,但不从栈中移除该修改(类似 peek ) |
|
清除 | stash drop |
丢弃栈顶的修改 |
stash clear |
清空整个 stash 栈 | |
查看 | stash list |
查看 stash 栈中的所有修改记录 |
stash show + 栈索引 |
查看指定索引位置的修改详情 |
使用场景:
- 切换分支时,当前分支有未完成的代码。
- 需要紧急修复其他分支的 Bug,但不想提交当前代码。
- 临时保存实验性代码,避免污染提交历史。
- 合并冲突前,先保存当前改动。
使用示例:
1 | 1. 当前有未提交的修改,但需要切换到其他分支 |
挑选
工作在多分支结构的提交维度上,与merge
的区别:
merge
:需要另一个分支上的所有变动cherry-pick
:需要另一个分支上的部分变动
提交情形:
当产生冲突时,会停下来让用户决定,此时有3种情况:
--continue
:解决冲突后,git add
,再执行此命令继续合并--abort
:放弃合并,回到之前的状态--quit
:放弃合并,且不回到之前
比较不同
diff
命令,主要讲解两点提交和三点提交的区别:
七、铁令
切换分支前先提交本地的修改
代码及时提交,提交过了就不会丢
遇到任何问题都不要删除文件目录