GIT使用

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 protected]"

其中 --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使用_第1张图片
图中左侧为⼯作区,右侧为版本库。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使用_第2张图片

查看 .git文件

GIT使用_第3张图片
可以看到 HEAD指针指向的是 /refs/heads/master

而master里存储的是最近一次commit的哈希值。

其中这个哈希值可以理解成对象库的一个对象,然后可以在object文件夹里看到它

GIT使用_第4张图片
其中 哈希值要分为两个部分,前两位就是objects下的文件夹名,后面就是对应的文件名。

使用git cat-file -p 哈希值,就可以查看到刚刚提交的信息等。

GIT使用_第5张图片

其中 tree 后面跟的哈希值是一个指向存储着文件和目录快照的树对象(tree object)的哈希值。这个树对象包含了当前提交时的文件和目录结构的信息,它指向了每个文件和子目录的对应树对象或者文件对象。通过递归地查看这些树对象和文件对象,Git 可以恢复出该提交时的完整目录结构和文件内容。所以,tree s对象在 Git 中非常重要,它记录了每个提交的文件和目录状态。

在这里插入图片描述

修改文件

修改文件就是直接vim打开去修改文件。

git status 命令⽤于查看在你上次提交之后是否有对⽂件进⾏再次修改。

GIT使用_第6张图片
git diff [file] 命令⽤来显⽰暂存区和⼯作区⽂件的差异,显⽰的格式正是Unix通⽤的diff 格 式。也可以使⽤ git diff HEAD -- [file] 命令来查看版本库和⼯作区⽂件的区别。

GIT使用_第7张图片

版本回退

执行 git reset 命令⽤于回退版本,可以指定退回某⼀次提交的版本。要解释⼀下“回退”本质是 要将版本库中的内容进⾏回退,⼯作区或暂存区是否回退由命令参数决定:
git reset 令语法格式为: git reset [--soft | --mixed | --hard] [HEAD]

  • –mixed 为选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内容,⼯作区⽂件保持不变。

  • –soft 参数⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。

  • –hard 参数将区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重

GIT使用_第8张图片
HEAD 说明:

  • 可直接写成 commit id,表⽰指定退回的版本
  • HEAD 表⽰当前版本
  • HEAD^ 上⼀个版本
  • HEAD^^ 上上⼀个版本
  • 以此类推…

可以使⽤~数字表⽰:

  • HEAD~0 表⽰当前版本
  • HEAD~1 上⼀个版本
  • HEAD^2 上上⼀个版本
  • 以此类推

git reflog 会列出最近的操作历史记录,包括每次操作的提交哈希、操作类型和提交消息。

使用 git reflog 来配合使用恢复意外删除或移动的分支、标签,以及查看仓库中的操作历史通常包括以下步骤:

  1. 查看操作历史记录
  • 运行 git reflog 来查看仓库中的操作历史记录。这将显示出每次操作的提交哈希、操作类型和提交消息。
  1. 找到需要恢复的引用
  • 浏览 git reflog 输出,找到您意外删除或移动的分支、标签或其他引用的记录。每次操作都有一个唯一的引用标识,通常以 HEAD@{数字} 的形式显示。
  1. 恢复引用
  • 使用 git checkoutgit branch 命令来恢复引用。您可以使用 HEAD@{数字} 或引用的哈希值来指定要还原到的位置。

下面是一个示例,演示如何使用 git reflog 来恢复一个意外删除的分支:

假设我们有一个名为 my-feature-branch 的分支,然后意外删除了它。我们想使用 git reflog 来找回它。

  1. 首先,运行 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
  1. 找到删除分支的记录。在本例中,我们想要找回 my-feature-branch,看到 HEAD@{2} 行中有一个与该分支相关的操作记录。

  2. 使用 git checkout 命令并指定记录来还原分支:

插入代码复制代码

git checkout -b my-feature-branch HEAD@{2}

这将创建一个新的名为 my-feature-branch 的分支,并将其还原到操作历史记录中 HEAD@{2} 所指定的状态。

现在,my-feature-branch 分支已成功恢复,包括了删除前的代码和提交历史。

类似的方法也可以用于恢复标签或其他引用,只需找到相应的操作历史记录并执行相应的 git checkout 命令即可。

删除文件

在 Git 中,删除也是⼀个修改操作,我们实战⼀下, 如果要删除 file5 ⽂件,怎么搞呢?如果你这样做了:
GIT使用_第9张图片
但这样直接删除是没有⽤的,反⽽徒增烦恼, git status 命令会⽴刻告诉你哪些⽂件被删除了
GIT使用_第10张图片
此时,⼯作区和版本库就不⼀致了,要删⽂件,⽬前除了要删⼯作区的⽂件,还要清除版本库的⽂件。
⼀般⾛到这⾥,有两种可能:

  • 确实要从版本库中删除该⽂件
  • 不⼩⼼删错了

对第⼆种情况,很明显误删,需要使⽤ git checkout 来进⾏恢复:
GIT使用_第11张图片
对于第⼀种情况,很明显是没有删完,我们只删除了⼯作区的⽂件。这时就需要使⽤ git rm将⽂件从暂存区和⼯作区中删除,并且 commit:

GIT使用_第12张图片

撤销修改

情况⼀:对于⼯作区的代码,还没有 add

使用 git checkout – 文件名
– 必须加上,不加上就是切换分支的意思了。

情况⼆:已经 add ,但没有 commit

使用 git reset命令来回退

情况三:已经 add ,并且也 commit 了

使用 git reset命令来回退。不过,这是有条件的,就是你还没有把⾃⼰的本地版本库推送到远程。

分支管理

创建分支

git branch #查看当前本地所有分⽀

git branch 分支名 #新建分⽀

git checkout -b 分支名 # 创建分支并切换到该分支

git branch -r 要查看远程分⽀需要加上-r选项。 但前提是要pull⼀下拉取最新的远端仓库,才能看到最新的内容

GIT使用_第13张图片

切换分支

使⽤ git checkout 命令即可完成切换

GIT使用_第14张图片

合并分支

git merge 命令⽤于合并指定分⽀到当前分⽀。合并后,master 就能看到 testbranch 分⽀提交的内容了。

GIT使用_第15张图片

删除分支

合并完成后, dev 分⽀对于我们来说就没⽤了, 那么dev分⽀就可以被删除掉,注意如果当前正处于某分⽀下,就不能删除当前分⽀。

git branch -d //delete local fully merged branch

git branch -D //delete local branch (even if not merged)

合并冲突

可是,在实际分⽀合并的时候,并不是想合并就能合并成功的,有时候可能会遇到代码冲突的问题。为了演⽰这问题,创建⼀个新的分⽀ dev1 ,并切换⾄⽬标分⽀,我们可以使⽤ git checkout -b dev1 ⼀步完成创建并切换的动作。

Fast forward 模式
GIT使用_第16张图片
Git ⽀持我们强制禁⽤ Fast forward 模式,那么就会在 merge 时⽣成⼀个新的 commit ,这样, 从分⽀历史上就可以看出分⽀信息。 --no-ff ⽅式的 git merge
GIT使用_第17张图片
这样的好处是,从分⽀历史上就可以看出分⽀信息。例如我们现在已经删除了在合并冲突部分创建的 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为例
GIT使用_第18张图片
填写基本信息
GIT使用_第19张图片
从创建好的远程仓库中我们便能看到,刚创建的仓库有且只有⼀个默认的master分⽀
GIT使用_第20张图片

克隆远程仓库

克隆/下载远端仓库到本地,需要使⽤ git clone 命令,后⾯跟上我们的远端仓库的链接,远端仓库的链接可以从仓库中找到:选择“克隆/下载”获取远程仓库链接:
GIT使用_第21张图片

使⽤ HTTPS 方式
GIT使用_第22张图片
使用 SSH 方式

  1. 首先先生成 SSH Key
ssh-keygen -t rsa -C "[email protected]" 这里必须要填你的gitee绑定的邮箱

此时使用 cd ~,进入到用户主目录中,查看是否有生成.ssh⽬录,再看看这个⽬录下有没有 id_rsa 和 id_rsa.pub 这两个⽂件

这两个就是SSH Key的秘钥对, id_rsa 是私钥,id_rsa.pub 是公钥。

  1. 添加⾃⼰的公钥到远端仓库

GIT使用_第23张图片
最后在使用git clone

git clone [email protected]:Z--J/gitcode.git

向远程仓库推送

当我们在本地仓库创建了一个文件并add和commit之后,如果远程想要在远程仓库也能看到就需要git push到远程仓库。

GIT使用_第24张图片

拉取远程仓库

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使用_第25张图片
使用git show 标签名

并使用git log --decorate查看到,每个提交对应的tag

GIT使用_第26张图片
给tag添加备注信息
git tag -a [name] -m "备注信息" commit_id

推送标签

推送某个标签到远程,使⽤命令 git push origin

GIT使用_第27张图片
GIT使用_第28张图片

删除标签

git tag -d [name]
在这里插入图片描述
如果标签已经推送到远程,要删除远程标签就⿇烦⼀点,先从本地删除,在推送到远端
GIT使用_第29张图片

你可能感兴趣的:(GIT,git)