一、概述
刚开始使用git的时候,总想拿git
来和cvs
或者svn
来作对比,但不久后发现这个想法本身就是错的,git
完全就是另外一种物种,一种本属于未来的物种。它的对象存储方式,快照,分支等,都是完全不同的。
相信每个使用git
的人,都想了解git
内存文件的存储对象,快照,提交在历史和分支等内部的原理。都想知道它是否有传说中的那么强大?
1、优势
- 底层文件存储系统
- 分布式的特性
2、原理
基础概念:
工作区(Workspace)
:就是你在电脑里能看到的目录暂存区(Index/Stage)
:所有变动的文件,Git 都记录在一个区域,叫做"暂存区"本地仓库(Repository)
:本地的代码仓库,不用上网,纯本地管理。远程仓库(Remote)
:线上仓库,本地仓库某个版本在线上的镜像存在。
以上4个区域之间的代码流通如下图:
二、常用命令
-
git init
初始化 -
git remote add origin #远程仓库地址
添加文件到版本库 -
git add <file>/.
未暂存区 >> 已暂存区 -
git commit -m '版本说明'
已暂存区 >> 本地仓库 -
git status
查看工作目录中所有文件的状态 -
git log
命令可以显示所有提交过的版本信息 -
git reflog
可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作) -
git stash
暂存,git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。后续可以在某个分支上恢复出堆栈中的内容。 -
git stash clear
清空缓存 -
git stash pop
释放最近一次缓存到当前分支 -
git stash list
查看临时缓存 -
git stash -m '提示文字'
创建缓存,并设置提示文字 -
git stash apply <index>
应用指定索引号对应缓存(通过list
命令工可查看索引号) -
git reset --hard HEAD
回退到当前版本,清空暂存区和工作区的所有修改; -
git reset --hard HEAD~
回退到上一个版本,清空暂存区和工作区的所有修改; -
git reset --hard 1094a
回退到某个指定版本,清空暂存区和工作区的所有修改; -
git checkout -- <file>
撤销某文件的修改。
- 一种是自修改后还没有被放到暂存区,则回到和版本库一样的状态;
- 一种是已经添加到暂存区后,又作了修改,则回到添加到暂存区后的状态。
-
git checkout commid_id src/main/main.c
回退某文件到指定版本 -
git push origin master -f
提交到远程仓库【强制】 -
git push origin master -u
、git push --set-upstream origin master
将本地当前所属分支推送到远程指定分支 -
git pull origin master -f
从远程仓库获取本地仓库【强制执行】 -
git checkout -b dev
创建dev分支,然后切换到dev分支。(等于下面两步)
git branch dev
创建dev分支git checkout dev
切换到dev分支
git checkout dev
切换到dev分支git branch
查看所有本地分支git branch -a
查看所有本地+远程分支git branch -d dev
删除本地分支git branch -D dev
删除本地分支【强制】git checkout master
从当前分支切换回master分支git merge dev
把dev分支的工作成果合并到当前分支上git push origin --delete branchname
删除远程分支git push origin -d branchname
删除远程分支 【同上】git checkout --track origin/branch_name
远程新建了一个分支,本地没有该分支,这时本地会新建一个分支名叫 branch_name ,会自动跟踪远程的同名分支 branch_name。git checkout -b serverfix origin/serverfix
拉取远程新建的分支到本地git branch -m new_branch_name
分支重命名git branch -m old_branch_name new_branch_name
分支重命名git config core.editor vim
修改编辑器为Vim
git rebase -i HEAD~3
:合并最近3次提交。【p:保留 s:和前一个commit合并】git rebase -i [startpoint] [endpoint]
合并【startpoint】~【endpoint】之间的提交git rebase master
变基到master
分支
rebase参考:
git rebase
使用git rebase合并多次commit
三、打tag标签
//创建标签
//-a 后面跟版本号
//-m 后面跟标签描述,一般和版本号一致
git tag -a v0.1 -m “v0.1”
git show v0.1 //查看某次tag的提交记录
//推送标签到远程(仅推送tag,未推送代码)
git push --tag
//查找标签
git tag -l "v0.2.*" //查找v0.2.开头的所有标签
git tag -l "v0.2.1" //查找v0.2.1这个版本
//补充标签
git log --pretty=oneline //首先查看下提交记录
git tag -a v0.3 6653fd4f -m "v0.3" //在指定commitid上补上标签
#99acf7e3f6d4bfa45fbd698630f86a8380252144 (origin/dev) dev上第三次提交
#b910f8530163d06badc7dc61e300129f53ce0dc7 dev上第二次提交
#6653fd4f8ac036d5607775f9f0a89d72bc1221c8 dev第一次提交
#5655e61421c2163e4101f96295573f10f7353edf k
#...
//检出tag
git checkout -b v0.4 //检出v0.4,并新建一个同名分支
git checkout v04 //切换到v0.4标签
//回退步骤
//1、查看tag清单,找到需要回退的tag
git tag
//2、找到commit id
git show v3.0
//3、 根据上面点的commit
git reset --hard commitId
四、创建仓库
1、从远程仓库克隆到本地仓库
在码云新建一个仓库,命名为GitTest
,里面默认生成两个说明文件:README.en.md
、README.md
。
从远端仓库clone到本地
git clone https://gitee.com/***/GitTest.git
从默认的主分支克隆
git clone -b develop https://gitee.com/***/GitTest.git
从develop分支克隆
2、从本地仓库Push到远程仓库
本地初始化一个项目,执行git init
初始化。会在当前目录中生成一个.git隐藏目录,用于记录代码变化。
关联远程仓库,git remote add origin https://gitee.com/***/GitTest.git
设置用户名和邮箱:
git config --global user.name "你的名字或昵称"
git config --global user.email "你的邮箱"
提交
git add .
git commit -m "第一次提交"
git push origin master
//git branch --set-upstream-to origin/main master 将远程仓库的main分支和本地的master映射起来
参考资料:
提交第一行代码
Git教程 - 廖雪峰的官方网站
五、Git操作流
git操作流没有标准的方案,只有最适合团队的方案,这里贴上一张比较通用的GitFlow
:
六、清除本地缓存分支
有时候会遇到这种情形:Git 远程删除分支后,本地 git branch -a
依然能看到
使用命令 git remote show origin
,可以查看remote地址,远程分支,还有本地分支与之相对应关系等信息。
此时我们可以看到那些远程仓库已经不存在的分支,根据提示,使用 git remote prune origin
命令自动清除已经删除的分支:
$ git remote prune origin
Pruning origin
URL: https://xxx@gitlab.com/xxx/xxx.git
* [pruned] origin/develop
* [pruned] origin/fix_composer_repositories_type
* [pruned] origin/join_weixin_module
* [pruned] origin/movtop
* [pruned] origin/right
* [pruned] origin/schedule_dev
* [pruned] origin/stuff_web_fix
* [pruned] origin/task_temp
* [pruned] origin/weibo
七、回退
1、revert
//假如git commit 链是:
//A -> B -> C -> D
//如果想把B,C,D都给revert,除了一个一个revert之外,还可以使用range revert
git revert B^..D
//这样就把B,C,D都给revert了,变成:
//A-> B ->C -> D -> D'-> C' -> B'
//用法就是:
git revert OLDER_COMMIT^..NEWER_COMMIT
//如果我们想把这三个revert不自动生成三个新的commit,而是用一个commit完成,可以这样:
git revert -n OLDER_COMMIT^..NEWER_COMMIT
git commit -m "revert OLDER_COMMIT to NEWER_COMMIT"
2、reset
git reset commit_id //回退到指定commit,回退commit代码保留在工作区
git reset commit _id --hard //回退到指定commit,完全一致
git reset HEAD //回退到当前最新的commit
git reset HEAD~ //回退到当前最新commit的上一个commit
八、下载子文件夹
git init test && cd test //新建仓库并进入文件夹
git config core.sparsecheckout true //设置允许克隆子目录
echo 'tt*' >> .git/info/sparse-checkout //设置要克隆的仓库的子目录路径 //空格别漏
git remote add origin git@github.com:mygithub/test.git //这里换成你要克隆的项目和库
git pull origin master //下载
git学习之git clone 克隆或下载一个仓库单个文件夹
九、.gitignore
git base
中运行vim .gitignore
,创建.gitignore
文件,可以设置哪些文件/文件夹不需要加入到仓库。vim
的安装参考:window10安装vim编辑器
保存文件:1、esc、2、:wq
demo:
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
package-lock.json
node_modules
.DS_Store
dist
dist-ssr
*.local
/cypress/videos/
/cypress/screenshots/
# Editor directories and files
.vscode
!.vscode/extensions.json
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
十、给branch添加注释
我们在创建分支时通常使用 feature-版本号
这样的命名规则,让分支名和对应开发版本号对应。但是纯数字版本号的分支名语义化程度低,没法第一时间识别分支具体的内容;
例如,下面这样的分支,我们根本没法从分支名去识别每个分支具体对应什么开发内容:
这里我们可以使用分支备注:
1.添加命令
在命令行输入:git config branch.xxx.description '备注'
例子:git config branch.develop.description '开发基线分支'
2.查询
先安装插件,执行命令 npm i -g git-br
然后查询输入 : git-br
十一、git修改远程仓库地址
- 直接命令修改
git remote set-url origin [url]
#例如:git remote set-url origin https://ddns.togit.cc:7777/rffanlab/tensorflow_get_started_doc_cn.git
- 先删后添加
git remote rm origin
git remote add origin [url]
- 修改config文件
打开.git
目录,修改config
文件里面的url
替换就OK了。