一文搞懂git操作_git 操作
目录
前言
初步设置git
创建git仓库
向git仓库中添加文件
提交git仓库中的文件
git状态查看
git版本回退
git管理修改
git撤销修改
git删除文件
远程仓库关联
远程仓库推送
远程仓库克隆
git分支
分支创建
查看分支
分支合并
删除分支
分支管理策略
git分支推送
git仓库抓取
fetch
pull
总结
路径分割符“/”
前言
一些关于本文的说明:
- 使用工具:git bash
- 使用软件:gitlab和github(gitlab与github都是使用git进行管理)
- 本文参考“廖雪峰”老师的git教程,教程链接:简介 - Git教程 - 廖雪峰的官方网站
初步设置git
git的安装在这里就不再赘述,如果您不会安装,请在“前言”部分浏览“廖雪峰”老师的教程安装。
当您安装好git后,请务必执行下面两条命令来设置:
git config --global user.name \"name\"git config --global user.email \"email\"
- \"name\":填写你的名字(方便别人知道是谁提交的)
- “email”:填写你的邮箱
- --global:这个参数表示这台机器上的所有Git仓库都会使用这个配置
创建git仓库
git仓库是git的精华所在,git仓库里所有文件的修改、删除都会被git记录
切换到一个文件下(不论是否空白),执行下面命令创建一个git仓库:
git init
此时该文件夹下会生成一个“.git”文件,不过它是隐藏的,如果您是windows系统,可以点击显示隐藏文件,如果是Linux系统,可以输入“ls -a”来显示
向git仓库中添加文件
git的管理策略是:“git只会记录您添加到仓库中的文件,哪怕该文件在仓库目录中”
使用下面这条命令添加文件
git add files_name
- files_name:文件名
下面让我们创建一个文件并添加到仓库中:
// touch创建一个新文件touch test.txt// 向仓库中添加一个新文件git add test.txt
添加这一串字符串,并查看文件是否被git成功检测到
// 使用status查看状态git status
可以看到“test.txt”文件修改被成功检测到
下面我们再创建一个文件,但是不添加到仓库中:
touch test1.txt
随后给这个文件添加一串字符串
// 继续使用status命令查看git是否记录到修改git status
可以看git并没有检测到test1.txt的修改,只检测到test1.txt文件的创建(但并没有添加到仓库中)
提交git仓库中的文件
// 使用commit提交,带-m参数git commit -m \"description\"// 或不带-m参数git commit
- description:由您自定义,一般描述本次提交做了什么修改
当不带-m参数提交时,git bash会默认打开一个vim窗口,此时将会在vim窗口中编辑description:
git状态查看
// 显示git仓库状态git status// 显示commit历史记录git log
使用git log时:
- commit ea25d12.....:这一串表示commit号,可以用来回退版本
- Author:提交人
- Date:日期
git版本回退
git rset --hard 版本
在git中,用“HEAD”表示当前版本,上一个版本就是“HEAD^”,上上个版本就是“HEAD^^”,但是如果版本太多“^”也太多,容易数不过来,为此可以使用“HEAD~X”来回退。
例如下面这个例子:
// 回退到上一个版本git reset --hard HEAD// 或git reset --hard HEAD~1// 回退到上100个版本git reset --hard HEAD~100
当然我们也可以用commit版本号来指定回退到某个版本
// 使用commit版本号回退,版本号没必要写全,写前几位即可git reset --hard ea25d1
- --hard:回退到上个版本的已提交状态
- --soft:回退到上个版本的未提交状态
- --mixed:回退到上个版本已添加但未提交的状态
git管理修改
现在有下面一系列操作:
- 在test1.txt中添加一串字符串
- git add test.txt
- 在test1.txt再添加一串字符串
- git commit -m \"添加字符串\"
最后结果如何呢?
1.在test1.txt中添加一串字符串
2.git add test.txt
3.在test1.txt再添加一串字符串
4.git commit -m \"添加字符串\"
- 您会发现,您明明commit了,为什么第二次的修改没有被commit?
- 原因在于:git只会将您add的那一刻的状态添加到暂存区
- 解决方法:添加字符串 -> git add -> 添加字符串 -> git add -> git commit
git撤销修改
// 使用checkout撤销工作区修改git checkout -- file
checkout撤销修改有两种情况:
- file自修改后还没有被放到暂存区,撤销修改,返回到file被添加到暂存区前的状态
- file已经被添加到暂存区,又作了修改,撤销修改,返回到file被添加到暂存区时的状态
git删除文件
当我们删除某个文件时:
git提示我们有一个文件被删除了,如果想要确认删除执行:
// 确认删除git rm file
删除也是一次修改,因此仍然需要commit
- 当您删除文件后,可以使用git rm file来确认删除
- 也可以使用 git add file,来添加这个状态
- 上述两种方法都可以,本质就是确认修改
远程仓库关联
当您在github/gitlab中创建一个仓库后,您可以使用remote命令关联远程仓库
// 关联远程仓库git remote add [origin] [SSH/HTTP]
- [origin]:远程仓库名字,由您指定
- [SSH/HTTP]:SSH或HTTP连接
如果您不想关联这个远程仓库后,可以使用rm命令删除关联远程仓库
// 使用remote删除关联远程仓库git remote rm origin
远程仓库推送
您可以使用push命令来将本地提交推送到远程仓库中
git push origin master
- master:远程仓库分支
远程仓库克隆
当您接触一个新仓库想要克隆下来,第一次克隆请务必使用clone
// 使用git clone克隆仓库git clone [SSH/HTTP]
- [SSH/HTTP]:SSH或HTTP连接
当您已经克隆一个仓库之后,之后可以使用pull
// 使用git pull拉取代码git pull origin
git pull相当于
git fetch origin main # 拉取远程main的最新更新到本地origin/maingit merge origin/main # 将origin/main合并到当前本地分支
git分支
每次提交,git都把它们串成一条时间线,这条时间线就是一个分支。
当您没有创建分支时,它只有一条线,这个分支叫“主分支”(master/main)。
HEAD指向master,master指向提交,因此HEAD指向当前分支
每次提交,master分支都会向前移动一步,这样随着你不断提交,master分支也越来越长
当我们创建新的分支,例如dev时,git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上
不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次之后,dev指针往前移动一步,而master指针不变
】
假如我们在dev上的工作完成了,就可以把dev合并到master上(最简单的方法就是把master指针移动到dev指针处)
分支创建
您可以使用“checkout”命令创建分支:
// 创建dev分支git checkout dev// 切换到dev分支git checkout dev// 创建dev分支并切换到dev分支(方法一)git checkout -b dev// 创建dev分支并切换到dev分支(方法二)git switch -c dev
查看分支
// 查看所有分支git branch
- 当前分支前面会标有一个*号
分支合并
当您想要将dev分支的工作成功合并到master分支上,您可以使用:
// 合并dev分支到master分支上git checkout mastergit merge dev
- 这是一个快速合并
- 本质是:将master分支指针移动到dev分支指针
删除分支
当您想要删除分支,可以使用-d命令
// 删除dev分支git branch -d dev
分支管理策略
合并分支时,git会优先使用“快速模式”,这样删除分支后,会丢掉分支信息。
如果禁用“快速模式”,git就会在merge时生成一个新的commit,这样就可以从分支历史上看出分支信息
使用“--no-ff”参数,表示禁用“快速模式”
git merge --no-ff -m \"merge with no fast forward\" dev
- 因为本次合并要创建一个新的commit,所以加上-m参数
合并后,使用git log查看分支历史:
- 分支历史就像这样
git分支推送
当您从远程仓库克隆时,git会自动帮您把本地master(main)分支与远程的master分支对应
您可以使用push命令将本地修改推送到远程服务器
// 推送远程分支git push origin master
- origin:由您指定的服务器名
- master:由您指定的本地git分支
当您第一次使用push命令时,强烈建议您带上-u参数,这个代表本地与远程服务器的分支关联,当您使用的本地分支是“dev”时,而远程服务器没有dev,那么远程服务器会自动创建一条“dev”分支
// 使用-u参数git push -u origin dev
如果您不想构建“本地 -> 远程”的关联关系,可以使用“本地分支:远程分支”的方法来指定推送:
// 指定本地的dev分支推送到远程origin的mastergit push origin dev:master
git仓库抓取
当您想要获取远程仓库的更新您可以使用“fetch”或“pull”
fetch
fetch属于“安全获取”,具体包括下面四项:
- 新提交记录:远程各分支上比本地对应分支多出的提交
- 新分支:远程仓库中新建的分支
- 标签更新:远程仓库中新创建的标签或对已有标签的修改
- 分支删除信息:远程仓库中被删除的分支
例如远程仓库origin有下面四点变动,但是你的本地仓库还没有同步:
- mian分支新增了两个提交
- 同事新建了feature/pay分支并推送了三个提交
- 仓库管理员增加了v2.1标签
- 旧分支feature/old删除
此时执行git fetch,本地会:
- 下载main分支的两个新提交,更新本地的origin/main引用
- 记录feature/pay分支的存在,创建origin/feature/pay引用,并下载三个提交
- 下载v2.1标签到本地
- 标记origin/feature/old为已删除
git fetch只会下载并记录这些更新到本地的“远程跟踪分支”,但不会修改你的大工作区文件,也不会合并到你当前正在工作的本地分支
如果要将这些更新应用到本地分支,需要手动执行git merge或git rebase。
pull
pull命令会自动帮您合并分支,相当于“fetch + merge”两个动作,一条命令帮您完成
// pull拉取远程master分支并自动合并到当前分支git pull origin master// pull拉取当前分支与远程仓库关联分支的更新git pull
git merge origin/master
总结
- git fetch:相当于查看远程仓库更新了什么
- git pull:查看并合并远程仓库的更新
路径分割符“/”
在git,“/”主要用于“分隔分支名称中的层级关系”
具体用法:
- 远程仓库名与分支名的分隔:origin/master -> origin是远程仓库名称,master是远程仓库origin下的master分支
- 使用 / 组织分支结构,让分支名更具可读性(git会将整个字符串视为一个分支名,不影响功能) -> feature/login