Git设计理念和使用教程

Posted IT飞牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git设计理念和使用教程相关的知识,希望对你有一定的参考价值。

刚开始使用git的时候,总想拿git来和cvs或者svn来作对比,但不久后发现这个想法本身就是错的,git完全就是另外一种物种,一种本属于未来的物种。它的对象存储方式,快照,分支等,都是完全不同的。
相信每个使用git的人,都想了解git内存文件的存储对象,快照,提交在历史和分支等内部的原理。都想知道它是否有传说中的那么强大?

Git相比较其他版本控制系统最大的优势无异于:
1、底层文件存储系统
2、分布式的特性
​​

基本原理

需要搞清楚以下名词的概念:
工作区(Workspace):就是你在电脑里能看到的目录
暂存区(Index/Stage):所有变动的文件,Git 都记录在一个区域,叫做"暂存区"
本地仓库(Repository):本地的代码仓库,不用上网,纯本地管理。
远程仓库(Remote):线上仓库,本地仓库某个版本在线上的镜像存在。

常用命令

  • 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 reset --hard HEAD 回退到当前版本,清空暂存区和工作区的所有修改;

  • git reset --hard HEAD~ 回退到上一个版本,清空暂存区和工作区的所有修改;

  • git reset --hard 1094a 回退到某个指定版本,清空暂存区和工作区的所有修改;

  • git checkout -- <file> 撤销某文件的修改。
    1.一种是自修改后还没有被放到暂存区,则回到和版本库一样的状态;
    2.一种是已经添加到暂存区后,又作了修改,则回到添加到暂存区后的状态。

  • git checkout commid_id src/main/main.c 回退某文件到指定版本,注意:/
    提交到远程仓库:

  • git push origin master -f 强制执行

  • git push origin master -ugit push --set-upstream origin master 将本地当前所属分支同步推送到远程

  • git pull origin master -f 从远程仓库更新本地仓库(强制执行)
    分支
    git checkout -b dev 创建dev分支,然后切换到dev分支。(等于下面两步)
    1、git branch dev 创建dev分支
    2、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分支的工作成果合并到master分支上(需要处于master分支上时执行)

  • 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 分支重命名

打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


创建仓库两种方式

一、从远程仓库克隆到本地仓库

在码云新建一个仓库,命名为GitTest,里面默认生成两个说明文件:README.en.md、README.md。
从远端仓库clone到本地
git clone https://gitee.com/***/GitTest.git 从默认的主分支克隆
git clone -b develop https://gitee.com/***/GitTest.git 从develop分支克隆

二、从本地仓库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目前只有一个分支master。开发人员的工作流程是

  1. 在本地clone项目主分支:git clone master branch
    2.在自己本地checkout -b local创建一个本地开发分支,在本地的开发分支上开发和测试阶段性开发完成后(包含功能代码和单元测试),可以准备提交代码
  2. 首先切换到master分支:git checkout master
  3. 拉取最新的分支状态:git pull
  4. 然后切回local分支:git checkout local
  5. 合并提交 — 2表示合并两个:git rebase -i HEAD~2
    通过git rebase -i 将本地的多次提交合并为一个,以简化提交历史。本地有多个提交时,如果不进行这一步,在git rebase master时会多次解决冲突(最坏情况下,每一个提交都会相应解决一个冲突)
  6. git rebase master 将master最新的分支同步到本地,这个过程可能需要手动解决冲突(如果进行了上一步的话,只用解决一次冲突)
  7. 然后切换到master分支,git merge将本地的local分支内容合并到master分支
  8. git push将master分支的提交上传

执行代码如下:

git checkout master
git pull   
git checkout local              
git rebase -i HEAD~2        
git rebase master   ---->解决冲突后执行--->  git rebase --continue
git checkout master
git merge local
git push

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

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"

下载子文件夹代码

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文件,可以设置哪些文件/文件夹不需要加入到仓库。
保存文件:1、esc、2、:wq

文件demo:

micro-cloud/
QT客户端/
数据库/
文档/

WEB前台/.DS_Store
WEB前台/node_modules/
WEB前台/dist/main.index
WEB前台/dist/static
WEB前台/npm-debug.log*
WEB前台/yarn-debug.log*
WEB前台/yarn-error.log*
WEB前台//test/unit/coverage/
WEB前台//test/e2e/reports/
WEB前台/selenium-debug.log


# Editor directories and files
WEB前台/.idea
WEB前台/.vscode
WEB前台/*.suo
WEB前台/*.ntvs*
WEB前台/*.njsproj
WEB前台/*.sln

.gitignore
​```

以上是关于Git设计理念和使用教程的主要内容,如果未能解决你的问题,请参考以下文章

Git 检出其它分支的某个文件

text 使用git检出分支时出错

GIT科普系列2:git代码检出与日常维护

git 怎么切换分支

Git如何检出指定目录或文件

git 检出项目部分目录(稀疏检出)