git从入门到入土

发布于:2024-04-27 ⋅ 阅读:(20) ⋅ 点赞:(0)

Git使用步骤

1、Git客户端(入门咯)

官网

https://git-scm.com

下载页面

https://git-scm.com/download/win

建议下载 64-bit Git for Windows Portable

下载后得到 PortableGit-2.41.0-64-bit.7z.exe 自解压文件,

将其复制到 D:/ecuter/applications 目录下,双击启动自解压。

最后将 D:\ecuter\applications\PortableGit\bin 添加环境变量的 Path 变量中。 这里我多提一嘴,如果你默认安装在C盘,那就不用配置环境变量了,在我们环境变量中,已经默认有C盘下载的目录并指向那个文件夹下的bin,bin是什么?一般来说这个文件夹存放了大量的命令,比如你要执行git add . 命令,那你的终端是不是首先要认识git命令?因此才说要有环境变量,告诉你的电脑,git这个可执行命令存放在哪里,也就是配置环境变量的过程,比如你下载D盘的git目录,git底下就有一个用于存放命令的文件夹,那么你配置环境变量,地址指向这个文件夹,电脑就知道命令在哪里,也就认识这个命令了。

配置好环境变量后可以在 命令提示符 中执行 git -vgit --version 查看版本信息。

我们可以通过 git --helpgit -h 来查看 git 帮助信息,比如

C:\Users\Administrator>git -h
usage: git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           [--super-prefix=<path>] [--config-env=<name>=<envvar>]
           <command> [<args>]

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone     Clone a repository into a new directory
   init      Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add       Add file contents to the index
   mv        Move or rename a file, a directory, or a symlink
   restore   Restore working tree files
   rm        Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect    Use binary search to find the commit that introduced a bug
   diff      Show changes between commits, commit and working tree, etc
   grep      Print lines matching a pattern
   log       Show commit logs
   show      Show various types of objects
   status    Show the working tree status

grow, mark and tweak your common history
   branch    List, create, or delete branches
   commit    Record changes to the repository
   merge     Join two or more development histories together
   rebase    Reapply commits on top of another base tip
   reset     Reset current HEAD to the specified state
   switch    Switch branches
   tag       Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch     Download objects and refs from another repository
   pull      Fetch from and integrate with another repository or a local branch
   push      Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
See 'git help git' for an overview of the system.

2、SSH公钥

3.1、生成公钥

PowerShell命令提示符Git Bash 中执行以下命令即可生成公钥:

ssh-keygen -t ed25519 -C "Gitee SSH Key"

Windows 用户建议使用 Windows PowerShell 或者 Git Bash

因为在 命令提示符 下无 catls 等命令。

详细步骤可以查看由 gitee 官网提供的帮助文档:

3.2、添加公钥

这里的添加公钥是在 gitee.com 添加我们刚刚生成的 公钥。

首先登录 Gitee 官网,

随后鼠标悬浮到右上角用户头像处,在下拉菜单中选择设置

在新开启的页面左侧找到 安全设置 ,点击 SSH公钥 打开添加公钥页面。

详细步骤可以查看由 gitee 官网提供的帮助文档:

3.3、可信主机

gitee.com 添加到本地的可信主机列表中。

ssh -T git@gitee.com

在等待用户输入时,选择输入 yes 后再回车。

该步骤会在用户主目录下的 .ssh 目录中产生 known_hosts 文件。

3、远程仓库

在登录 Gitee 之后,

鼠标悬浮到右上角的 + 号图标,

点击新建仓库即可开始新建仓库操作。

4、本地仓库

我们可以通过两种方式创建本地仓库:

  • 新建一个目录,并在其中执行 git init 初始化该目录为一个本地仓库
  • 通过克隆远程仓库得到一个本地仓库

因为在 3部分 已经在 Gitee 创建一个远程仓库,所以我们可以将其克隆到本地。

git clone git@gitee.com:malajava/spring-tutorial.git

从远程仓库克隆成功后,在本地会生成一个 spring-tutorial 目录。

此时,我们就说这个 spring-tutorial 目录就是一个本地仓库,

在其内部一定包含一个 .git 目录,该目录就是本地仓库的所有配置。

5、代码管理

5.1、状态

首先进入到某个Git仓库内,比如 spring-tutorial 仓库中:

D:\ecuter\codes\spring-tutorial>

通过 git status 来查看该仓库的状态:

D:\ecuter\codes\spring-tutorial>git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

5.2、添加

将Git本地仓库中所有改动的文件添加到Git本地仓库的暂存区:

D:\ecuter\codes\spring-tutorial> git add .

此处的 . 表示当前目录,而当前目录D:\ecuter\codes\spring-tutorial就是当前Git仓库spring-tutorial的根目录,所以该操作意味着将当前仓库下所有改动的文件添加到暂存区。

此处“改动的文件”包括:新增的文件、被修改的文件、被删除的文件

5.3、提交

将本地Git仓库中暂存区中的内容提交到本地Git仓库:

git commit -m "注释"

比如:

D:\ecuter\codes\spring-tutorial> git commit -m "新增了一个Java源文件"

5.4、推送

可以通过 git push 命令将本地Git仓库中已经commit的操作推送到远程仓库:

git push origin master

当然你没有配钥匙的情况下,git可能不知道你要推到哪个仓库,因此你可以通过

git remote add origin 加上你的仓库地址

然后再去做推送操作

5.5、拉取

可以通过 git pull 命令从远程仓库抓取最新代码:

git pull origin master

6.版本回退

有的时候我们修改了文件,然后把修改好的文件提交到我们的仓库后add. -> commit ->push 后,也许我们会修改很多次这个文件,然后提交很多次,那么在仓库这个文件就会出现很多个版本,但是在我们实际工作时,不可能记得每一次我们做了什么修改因此,git作用就出现了。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看。如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:,那么这些一大串的数字是什么呢?其实就是你的提交版本号,他不直接指明1234,但是每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线,为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

回退

那么我们修改了这么多个版本,如果我们发现现在这个版本不行,还是想要上一个版本怎么办呢? 首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

现在,我们要把当前版本append GPL回退到上一个版本add distributed,就可以使用git reset命令:

$ git reset --hard HEAD^
HEAD is now at e475afc add distributed

欸?此时已经还原到了上一个版本,注意!!!如果这个时候你后悔了,你还是想要新版本,但是此时,你用git log看此时已经不存在最新的那个版本了,你想后悔怎么办?只要你还没有把当前窗口关闭,那就还有机会,你往回拉,查看那个版本的版本号,版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

工作区、暂存区

工作区:就是你在电脑里能看到的目录,就你的本地仓库,那个文件夹。

版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

image.png 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

管理修改

git 管理的是修改而不是文件,你在本地修改了一个文件,然后你add 然后你又对这个文件进行修改,你再commit,那么此时第二次的修改不会提交到master上,因为你的暂存区存的是你第一次修改的,而工作区放的是你第二次修改的,commit是把暂存区的内容推送

撤销修改

人都会犯错,我们如果不小心在文件中添加了一些不该添加的内容,此时我们通过git status可以发现有一个文件修改了,并且git会告诉你git checkout -- file可以丢弃工作区的修改命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

分支管理

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。 首先,我们创建dev分支,然后切换到dev分支:

$ git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

然后,用git branch命令查看当前分支:

$ git branch
* dev
  master

现在,我们把dev分支的工作成果合并到master分支上:

$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)

git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。`

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。合并完成后,就可以放心地删除dev分支了:

$ git branch -d dev

git rebase

有没有懂的同学?怎么用?什么时候用?欢迎补充