GIT使用
作者:小教学发布时间:2023-09-24分类:程序开发学习浏览:69
git
- git
- git 基本操作
- 创建 Git 本地仓库
- 配置 Git
- 认识⼯作区、暂存区、版本库
- 添加文件
- 查看 .git文件
- 修改文件
- 版本回退
- 删除文件
- 撤销修改
- 情况⼀:对于⼯作区的代码,还没有 add
- 情况⼆:已经 add ,但没有 commit
- 情况三:已经 add ,并且也 commit 了
- 分支管理
- 创建分支
- 切换分支
- 合并分支
- 删除分支
- 合并冲突
- 远程操作
- 远程仓库
- 新建远程仓库
- 克隆远程仓库
- 向远程仓库推送
- 拉取远程仓库
- 配置Git
- 忽略特殊⽂件
- 标签管理
- 理解标签
- 创建标签
- 推送标签
- 删除标签
git
git 基本操作
创建 Git 本地仓库
创建⼀个 Git 本地仓库对应的命令为 git init
配置 Git
git config [--global] user.name "Your Name" git config [--global] user.email "email@example.com"
其中 --global 是⼀个可选项。如果使⽤了该选项,表⽰这台机器上所有的 Git 仓库都会使⽤这个配置。如果你希望在不同仓库中使⽤不同的 name 或 e-mail ,可以不要 --global 选项,但要 注意的是,执⾏命令时必须要在仓库⾥。
查看配置命令为:
git config -l
删除对应的配置命令为:
git config [--global] --unset user.name git config [--global] --unset user.email
认识⼯作区、暂存区、版本库
-
⼯作区:是在电脑上你要写代码或⽂件的⽬录。
-
暂存区:英⽂叫 stage 或 index。⼀般存放在 .git ⽬录下的 index ⽂件(.git/index)中,我们 把暂存区有时也叫作索引(index)。
-
版本库:⼜名仓库,英⽂名 repository 。⼯作区有⼀个隐藏⽬录 .git ,它不算⼯作区,⽽ 是 Git 的版本库。这个版本库⾥⾯的所有⽂件都可以被 Git 管理起来,每个⽂件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
下⾯这个图展⽰了⼯作区、暂存区和版本库之间的关系:
图中左侧为⼯作区,右侧为版本库。Git 的版本库⾥存了很多东西,其中最重要的就是暂存区。
- 在创建 Git 版本库时,Git 会为我们⾃动创建⼀个唯⼀的 master 分⽀,以及指向 master 的⼀个指针叫 HEAD。
- 当对⼯作区修改(或新增)的⽂件执⾏ git add 命令时,暂存区⽬录树的⽂件索引会被更新。
- 当执⾏提交操作 git commit 时,master 分⽀会做相应的更新,可以简单理解为暂存区的⽬录树才会被真正写到版本库中。
由上述描述我们便能得知:通过新建或粘贴进⽬录的⽂件,并不能称之为向仓库中新增⽂件,⽽只是 在⼯作区新增了⽂件。必须要通过使⽤ git add 和 git commit 命令才能将⽂件添加到仓库中进⾏管理!!!
添加文件
在包含 .git 的⽬录下新建⼀个 ReadMe ⽂件,我们可以使⽤ git add 命令可以将⽂件添加到暂存区:
- 添加⼀个或多个⽂件到暂存区:
git add [file1] [file2] ...
- 添加指定⽬录到暂存区,包括⼦⽬录:
git add [dir]
- 添加当前⽬录下的所有⽂件改动到暂存区:
git add .
再使⽤ git commit 命令将暂存区内容添加到本地仓库中: - 提交暂存区全部内容到本地仓库中:
git commit -m "message"
- 提交暂存区的指定⽂件到仓库区:
git commit [file1] [file2] ... -m "message"
注意 git commit 后⾯的 -m 选项,要跟上描述本次提交的 message,由⽤⼾⾃⼰完成,这部分内容绝对不能省略,并要好好描述,是⽤来记录你的提交细节,是给我们⼈看的。
其中在创建的 ReadMe 文件中写入一些数据,并将该文件git add 和 git commit。
查看 .git文件
可以看到 HEAD指针指向的是 /refs/heads/master
。
而master里存储的是最近一次commit的哈希值。
其中这个哈希值可以理解成对象库的一个对象,然后可以在object文件夹里看到它
其中 哈希值要分为两个部分,前两位就是objects下的文件夹名,后面就是对应的文件名。
使用git cat-file -p 哈希值
,就可以查看到刚刚提交的信息等。
其中 tree 后面跟的哈希值是一个指向存储着文件和目录快照的树对象(tree object)的哈希值。这个树对象包含了当前提交时的文件和目录结构的信息,它指向了每个文件和子目录的对应树对象或者文件对象。通过递归地查看这些树对象和文件对象,Git 可以恢复出该提交时的完整目录结构和文件内容。所以,tree s对象在 Git 中非常重要,它记录了每个提交的文件和目录状态。
修改文件
修改文件就是直接vim打开去修改文件。
git status
命令⽤于查看在你上次提交之后是否有对⽂件进⾏再次修改。
git diff [file]
命令⽤来显⽰暂存区和⼯作区⽂件的差异,显⽰的格式正是Unix通⽤的diff 格 式。也可以使⽤ git diff HEAD -- [file]
命令来查看版本库和⼯作区⽂件的区别。
版本回退
执行 git reset 命令⽤于回退版本,可以指定退回某⼀次提交的版本。要解释⼀下“回退”本质是 要将版本库中的内容进⾏回退,⼯作区或暂存区是否回退由命令参数决定:
git reset 令语法格式为: git reset [--soft | --mixed | --hard] [HEAD]
-
–mixed 为选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内容,⼯作区⽂件保持不变。
-
–soft 参数⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
-
–hard 参数将区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重
HEAD 说明:
- 可直接写成 commit id,表⽰指定退回的版本
- HEAD 表⽰当前版本
- HEAD^ 上⼀个版本
- HEAD^^ 上上⼀个版本
- 以此类推…
可以使⽤~数字表⽰:
- HEAD~0 表⽰当前版本
- HEAD~1 上⼀个版本
- HEAD^2 上上⼀个版本
- 以此类推
git reflog
会列出最近的操作历史记录,包括每次操作的提交哈希、操作类型和提交消息。
使用 git reflog
来配合使用恢复意外删除或移动的分支、标签,以及查看仓库中的操作历史通常包括以下步骤:
- 查看操作历史记录:
- 运行
git reflog
来查看仓库中的操作历史记录。这将显示出每次操作的提交哈希、操作类型和提交消息。
- 找到需要恢复的引用:
- 浏览
git reflog
输出,找到您意外删除或移动的分支、标签或其他引用的记录。每次操作都有一个唯一的引用标识,通常以HEAD@{数字}
的形式显示。
- 恢复引用:
- 使用
git checkout
或git branch
命令来恢复引用。您可以使用HEAD@{数字}
或引用的哈希值来指定要还原到的位置。
下面是一个示例,演示如何使用 git reflog
来恢复一个意外删除的分支:
假设我们有一个名为 my-feature-branch
的分支,然后意外删除了它。我们想使用 git reflog
来找回它。
- 首先,运行
git reflog
命令来查看操作历史记录:
插入代码复制代码
git reflog
这将显示出类似以下的输出,其中列出了仓库的操作历史记录:
插入代码复制代码
HEAD@{0}: checkout: moving from my-feature-branch to main
HEAD@{1}: commit: Fix bug #123
HEAD@{2}: checkout: moving from main to my-feature-branch
HEAD@{3}: commit: Implement new feature
HEAD@{4}: checkout: moving from my-feature-branch to main
HEAD@{5}: commit: Update documentation
HEAD@{6}: checkout: moving from main to my-feature-branch
HEAD@{7}: commit: Initial commit
-
找到删除分支的记录。在本例中,我们想要找回
my-feature-branch
,看到HEAD@{2}
行中有一个与该分支相关的操作记录。 -
使用
git checkout
命令并指定记录来还原分支:
插入代码复制代码
git checkout -b my-feature-branch HEAD@{2}
这将创建一个新的名为 my-feature-branch
的分支,并将其还原到操作历史记录中 HEAD@{2}
所指定的状态。
现在,my-feature-branch
分支已成功恢复,包括了删除前的代码和提交历史。
类似的方法也可以用于恢复标签或其他引用,只需找到相应的操作历史记录并执行相应的 git checkout
命令即可。
删除文件
在 Git 中,删除也是⼀个修改操作,我们实战⼀下, 如果要删除 file5 ⽂件,怎么搞呢?如果你这样做了:
但这样直接删除是没有⽤的,反⽽徒增烦恼, git status 命令会⽴刻告诉你哪些⽂件被删除了
此时,⼯作区和版本库就不⼀致了,要删⽂件,⽬前除了要删⼯作区的⽂件,还要清除版本库的⽂件。
⼀般⾛到这⾥,有两种可能:
- 确实要从版本库中删除该⽂件
- 不⼩⼼删错了
对第⼆种情况,很明显误删,需要使⽤ git checkout 来进⾏恢复:
对于第⼀种情况,很明显是没有删完,我们只删除了⼯作区的⽂件。这时就需要使⽤ git rm
将⽂件从暂存区和⼯作区中删除,并且 commit:
撤销修改
情况⼀:对于⼯作区的代码,还没有 add
使用 git checkout – 文件名
– 必须加上,不加上就是切换分支的意思了。
情况⼆:已经 add ,但没有 commit
使用 git reset命令来回退
情况三:已经 add ,并且也 commit 了
使用 git reset命令来回退。不过,这是有条件的,就是你还没有把⾃⼰的本地版本库推送到远程。
分支管理
创建分支
git branch #查看当前本地所有分⽀
git branch 分支名 #新建分⽀
git checkout -b 分支名 # 创建分支并切换到该分支
git branch -r 要查看远程分⽀需要加上-r选项。 但前提是要pull⼀下拉取最新的远端仓库,才能看到最新的内容
切换分支
使⽤ git checkout
命令即可完成切换
合并分支
git merge
命令⽤于合并指定分⽀到当前分⽀。合并后,master 就能看到 testbranch 分⽀提交的内容了。
删除分支
合并完成后, dev 分⽀对于我们来说就没⽤了, 那么dev分⽀就可以被删除掉,注意如果当前正处于某分⽀下,就不能删除当前分⽀。
git branch -d <branch> //delete local fully merged branch
git branch -D <branch> //delete local branch (even if not merged)
合并冲突
可是,在实际分⽀合并的时候,并不是想合并就能合并成功的,有时候可能会遇到代码冲突的问题。为了演⽰这问题,创建⼀个新的分⽀ dev1 ,并切换⾄⽬标分⽀,我们可以使⽤ git checkout -b dev1 ⼀步完成创建并切换的动作。
Fast forward 模式
Git ⽀持我们强制禁⽤ Fast forward 模式,那么就会在 merge 时⽣成⼀个新的 commit ,这样, 从分⽀历史上就可以看出分⽀信息。 --no-ff ⽅式的 git merge
这样的好处是,从分⽀历史上就可以看出分⽀信息。例如我们现在已经删除了在合并冲突部分创建的 dev2 分⽀,但依旧能看到 master 其实是由其他分⽀合并得到。
假如我们现在正在 dev2 分⽀上进⾏开发,开发到⼀半,突然发现 master 分⽀上⾯有bug需要解决。在Git中,每个bug都可以通过⼀个新的临时分⽀来修复,修复后,合并分⽀,然后将临时分⽀删除。
可现在dev2 的代码在⼯作区中开发了⼀半,还⽆法提交,怎么办?
Git 提供了 git stash 命令,可以将当前的⼯作区信息进⾏储藏,被储藏的内容可以在将来某个时间恢复出来。
注意:git stash
另外,恢复现场也可以采⽤ git stash apply 恢复,但是恢复后,stash内容并不删除,你需要 ⽤ git stash drop 来删除;
你可以多次stash,恢复的时候,先⽤ git stash list 查看,然后恢复指定的stash,⽤命令
git stash apply stash@{0}
远程操作
远程仓库
新建远程仓库
新建远程项⽬仓库,这里以gitee为例
填写基本信息
从创建好的远程仓库中我们便能看到,刚创建的仓库有且只有⼀个默认的master分⽀
克隆远程仓库
克隆/下载远端仓库到本地,需要使⽤ git clone 命令,后⾯跟上我们的远端仓库的链接,远端仓库的链接可以从仓库中找到:选择“克隆/下载”获取远程仓库链接:
使⽤ HTTPS 方式
使用 SSH 方式
- 首先先生成 SSH Key
ssh-keygen -t rsa -C "123456@qq.com" 这里必须要填你的gitee绑定的邮箱
此时使用 cd ~,进入到用户主目录中,查看是否有生成.ssh⽬录,再看看这个⽬录下有没有 id_rsa 和 id_rsa.pub 这两个⽂件
这两个就是SSH Key的秘钥对, id_rsa 是私钥,id_rsa.pub 是公钥。
- 添加⾃⼰的公钥到远端仓库
最后在使用git clone
git clone git@gitee.com:Z--J/gitcode.git
向远程仓库推送
当我们在本地仓库创建了一个文件并add和commit之后,如果远程想要在远程仓库也能看到就需要git push到远程仓库。
拉取远程仓库
Git 提供了 git pull 命令,该命令⽤于从远程获取代码并合并本地的版本。格式如下:
git pull <远程仓库名> <本地分支名>:<远程分支名>
//如果远程分⽀是与当前分⽀合并,则冒号后⾯的部分可以省略。git push同理
git pull <远程主机名> <远程分⽀名>
配置Git
忽略特殊⽂件
在⽇常开发中,我们有些⽂件不想或者不应该提交到远端,比如保存了数据库密码的配置⽂件,那怎么让 Git 知道呢?在 Git ⼯作区的根⽬录下创建⼀个特殊的 .gitignore ⽂件,然后把要忽略的⽂件名填进去,Git 就会⾃动忽略这些⽂件了。 如果在创建远程仓库时没有勾选这个文件,那么在本地新建一个即可。
标签管理
理解标签
标签 tag ,可以简单的理解为是对某次 commit 的⼀个标识,相当于起了⼀个别名。例如,在项⽬发布某个版本的时候,针对最后⼀次 commit 起⼀个 v1.0 这样的标签来标识⾥程碑的意义。
这有什么⽤呢?相较于难以记住的 commit id ,tag 很好的解决这个问题,因为 tag ⼀定要给⼀个让⼈容易记住,且有意义的名字。当我们需要回退到某个重要版本时,直接使⽤标签就能很快定位到。
创建标签
git tag [name] 哈希值
使用git show 标签名
并使用git log --decorate查看到,每个提交对应的tag
给tag添加备注信息git tag -a [name] -m "备注信息" commit_id
推送标签
推送某个标签到远程,使⽤命令 git push origin <tagname>
删除标签
git tag -d [name]
如果标签已经推送到远程,要删除远程标签就⿇烦⼀点,先从本地删除,在推送到远端
- 程序开发学习排行
-
- 1鸿蒙HarmonyOS:Web组件网页白屏检测
- 2HTTPS协议是安全传输,为啥还要再加密?
- 3HarmonyOS鸿蒙应用开发——数据持久化Preferences
- 4记解决MaterialButton背景颜色与设置值不同
- 5鸿蒙HarmonyOS实战-ArkUI组件(RelativeContainer)
- 6鸿蒙HarmonyOS实战-ArkUI组件(Stack)
- 7鸿蒙HarmonyOS实战-ArkUI组件(GridRow/GridCol)
- 8[Android][NDK][Cmake]一文搞懂Android项目中的Cmake
- 9鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)
- 最近发表
-
- WooCommerce最好的WordPress常用插件下载博客插件模块的相关产品
- 羊驼机器人最好的WordPress常用插件下载博客插件模块
- IP信息记录器最好的WordPress常用插件下载博客插件模块
- Linkly for WooCommerce最好的WordPress常用插件下载博客插件模块
- 元素聚合器Forms最好的WordPress常用插件下载博客插件模块
- Promaker Chat 最好的WordPress通用插件下载 博客插件模块
- 自动更新发布日期最好的WordPress常用插件下载博客插件模块
- WordPress官方最好的获取回复WordPress常用插件下载博客插件模块
- Img to rss最好的wordpress常用插件下载博客插件模块
- WPMozo为Elementor最好的WordPress常用插件下载博客插件模块添加精简版