Git工作流程图

image-20251127203108679

命令如下:

  1. clone(克隆): 从远程仓库中克隆代码到本地仓库
  2. checkout (检出):从本地仓库中检出一个仓库分支然后进行修订
  3. add(添加): 在提交前先将代码提交到暂存区
  4. commit(提交): 提交到本地仓库。本地仓库中保存修改的各个历史版本
  5. fetch (抓取) : 从远程库,抓取到本地仓库,不进行任何的合并动作,一般操作比较少。
  6. pull (拉取) : 从远程库拉到本地库,自动进行合并(merge),然后放到到工作区,相当于 fetch+merge
  7. push(推送) : 修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库

Git安装

当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用该用户信息

最好是你的github账号与邮箱

1
2
git config --global user.name xxxx
git config --global user.email xxxxxx

为常用指令配置别名(可选)

  1. 打开用户目录,创建 .bashrc 文件

  2. 在 .bashrc 文件中输入如下内容:

    1
    2
    3
    4
    #用于输出git提交日志
    alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
    #用于输出当前目录所有文件及基本信息
    alias ll='ls -al'
  3. 打开gitBash,执行 source ~/.bashrc

这个配置就是使用git-log代替git log –pretty=oneline –all –graph –abbrev-commit这一长串指令,方便我们后面查看日志

获取本地仓库

​ 要使用Git对我们的代码进行版本控制,首先需要获得本地仓库

​ 这里在电脑中找一个空目录作为我们的git仓库,在这个空目录中,我们右键打开Git bash窗口,执行git init。注意这里创建完是隐藏文件,需要打开隐藏文件可见才可以看到。

​ 由于我们配置了ll=’ls -al’,所以在git bash中输入ll就可以看到全部文件,包括隐藏文件。
image-20251127204259144

Git基础操作指令

Git工作目录下对于文件的修改(增加、删除、更新)会存在几个状态,这些修改的状态会随着我们执行Git 的命令而发生变化。
image-20251127204335287

简要说明: git add 工作区->暂存区 git commit 暂存区 -> 本地仓库

查看修改的状态(status):

  • 作用:查看的修改的状态(暂存区、工作区)
  • 命令形式:git status

image-20251128111245251

添加工作区到暂存区(add):

  • 作用:添加工作区一个或多个文件的修改到暂存区
  • 命令形式:git add 单个文件名|通配符
    • 将所有修改加入暂存区:git add .

image-20251128111438148

提交暂存区到本地仓库(commit)

  • 作用:提交暂存区内容到本地仓库的当前分支
  • 命令形式:git commit -m ‘注释内容’

image-20251128111643933

修改file01内容后,再次查看:image-20251128111817834

再次提交:

image-20251128111923344

回退版本:git reset –hard + (前面标识数字)(这样就可以回到之前的版本)

image-20251128112410619

回退版本再回去:git reset –hard +前面标识数字就可以。但是如果清屏了,没有提交记录了。也可以找回来:git reflog:记录了之前全部的操作

有些文件不需要git管理,我们希望add的时候不加入git仓库,可以创建一个.gitignore,里面内容可以是:

1
2
3
4
5
6
7
8
9
10
11
12
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf

Git 分支

​ 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离 开来进行重大的Bug修改、开发新的功能,以免影响开发主线。

​ 查看本地分支:git branch

​ 常见本地分支:git branch + 分支名

​ 切换分支:git checkout + 分支名

​ 若切换的不存在,可以创建一个新的: git checkout -b + 分支名

image-20251128133602236

我们在master上和dev01上分别提交一个文件:

image-20251128134323435

image-20251128134429837

可以看到git仓库中切换不同的分支,里面的内容也发生了变化。再用git-log看一下操作日志:可以看到这里在不同的分支中都记录了刚刚添加的文件。image-20251128134530162

合并分支:merge : 命令:git merge 分支名称 一般都是将其他的分支合并到master上。所以我们先切换到master,然后执行git merge+ 分支名

git merge后会出现一个vim进入文本编辑的地方,按ESC 进入命令模式,退出指令 是 “ :wq” ,合并后结果如下图所示。

image-20251128134906163

注意,这里只是在master中合并了dev01,并没有删除dev01。还是可以切回dev01的分支的。(这里打错字母了创建了两个分支,不过问题不大)

删除分支:不能删除当前分支,只能删除其他分支

​ git branch -d 分支名 (删除分支时,需要做各种检查) git branch -D 分支名 (不做任何检查,强制删除)

解决冲突:

​ 当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解 决冲突,解决冲突步骤如下:

  1. 处理文件中冲突的地方

  2. 将解决完冲突的文件加入暂存区(add)

  3. 提交到仓库(commit)

    示例:删除原来的分支dev01,在master基础上新建文件file02并新建分支dev02,修改file02中的内容,返回master中再修改file02内容,并在master中合并dev02(注意,这里分支修改都要commit才可以).

image-20251128141537424

接下来需要自己修改cnt的值,然后git add . 再然后 git commit(直接提交即可)。最后master的file02中的值就是你最后修改的值。

补: 什么时候要使用git checkout -D xxxx 强制删除某个分支?当某个分支提交了某个文件,但是没有merge到master上,就会提示。强制删除即可。

Git 远程仓库

我们已经知道了Git中存在两种类型的仓库,即本地仓库和远程仓库。那么我们如何搭建Git远程仓库呢?

​ 我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有GitHub、码云、GitLab等。

gitHub( 地址:https://github.com/ )是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名gitHub 码云(地址: https://gitee.com/ )是国内的一个代码托管平台,由于服务器在国内,所以相比于 GitHub,码云速度会更快 GitLab (地址: https://about.gitlab.com/ )是一个用于仓库管理系统的开源项目,使用Git作 为代码管理工具,并在此基础上搭建起来的web服务,一般用于在企业、学校等内部网络搭建git私服。

配置SSH公钥

​ 在用户目录(C:\Users\Administrator)下打开git bash。

​ 输入:ssh-keygen -t rsa,不断回车。如果公钥已经存在,则自动覆盖

​ 设置账户共公钥:可以在用户目录下生成的.ssh中的id_rsa.pub中复制,也可以通过cat ~/.ssh/id_rsa.pub打开

​ 将这个公钥复制到gitee或者github安全设置中的ssh。

​ 测试连接:ssh -T git@gitee.com / ssh -T git@github.com ,第一次会出现(github类似)

1
2
3
4
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'gitee.com' (ED25519) to the list of known hosts.
Hi whcc_c(@whcc_c)! You've successfully authenticated, but GITEE.COM does not provide shell access.

上传码云(gitee):

​ 首先要创建自己的码云仓库。创建后要确认是你本人连接仓库的,有多种认证方式。比较推荐的是通过ssh公钥连接远程仓库。

1
2
3
git remote add gitee  xxxxx // 添加gitee到本地列表
git remote // 查看列表
git push gitee master // 推送到仓库master分支

上传github:

​ 第一次通过git bash访问github:

1
2
3
4
5
6
The authenticity of host '[ssh.github.com]:443 ([20.205.243.160]:443)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[ssh.github.com]:443' (ED25519) to the list of known hosts.
Hi whcComz1! You've successfully authenticated, but GitHub does not provide shell access.

​ 首先添加github仓库的SSH地址: git remote add github xxxxxxxxxx。

​ 然后可以 git remote查看是否成功添加到本地列表中。

​ ssh -T git@github.com 大概率会出现:ssh: connect to host github.com port 22: Connection timed out。此时去C盘用户目录下的.ssh文件下创建一个不带后缀的文件:config,复制以下内容: 其中User为你登陆github的用户名邮箱

1
2
3
4
5
6
Host github.com
User xxxxqq.com
Hostname ssh.github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
Port 443

​ 再次运行ssh -T git@github.com。输入yes即可。此时就连接到github的远端仓库了。 git push github master,在对应的仓库中就有本地仓库的文件了:image-20251128162741278

命令总结:

  • git remote add <远端名称> <仓库路径>(从远端服务器获取此URL)
    例如: git remote add origin git@gitee.com:czbk_zhang_meng/git_test.git
  • 查看远程仓库:git remote
  • 推送到远程仓库:git push [-f] [–set-upstream] [远端名称 [本地分支名][:远端分支名] ]
    • 如果远程分支名和本地分支名称相同,则可以只写本地分支
      • 例如:git push origin master
    • -f 表示强制覆盖
    • –set-upstream 一般都是第一次push的时候添加这个。推送到远端的同时并且建立起和远端分支的关联关系。
      • git push –set-upstream origin master
    • 如果当前分支已经和远端分支关联,则可以省略分支名和远端名
      • git push 将master分支推送到已关联的远端分支
  • 删除本地列表中的连接: git remote remove xxxx

克隆操作:git clone + 仓库连接

  • 克隆的操作其实并不经常用。比如一次小的更新,完全没必要使用clone,我们可以使用push和pull指令

抓取指令:git fetch [remote name] [branch name]

  • 抓取指令就是将仓库里的更新都抓取到本地,不会进行合并
    • 如果不指定远端名称和分支名,则抓取所有分支

拉取 命令:git pull [remote name] [branch name]

  • 拉取指令就是将远端仓库的修改拉到本地并自动进行合并,等同于fetch+merge
    • 如果不指定远端名称和分支名,则抓取所有并更新当前分支

image-20251128192928610

image-20251128192957562

解决合并冲突:在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。 A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要推送到远程仓库,此时B用户晚于A用户,故需要先拉取远程仓库的提交,经过合并后才能推送到远端分支。远程分支也是分支,所以合并时冲突的解决方式也和解决本地分支冲突相同相同

IDEA中使用Git功能

在Idea中配置Git:image-20251128202028920

首先可以先在当前目录下添加.gitignore文件,因为不是所有的代码都需要上传。一些测试代码配置文件都不需要上传。我使用的比较简单,如下所示:

1
2
3
4
5
6
.idea/
*.iml
target/
*.class
*.log
.iml

方式一:

​ 可以在idea中登陆github账号,然后直接可以按照自己的目录直接建库上传。

方式二:

​ 先在github上面创建库,然后获得ssh地址。在git,管理远程中自己添加即可
image-20251128202615989

image-20251128202651076

添加到本地仓库,对应的就是提交,上传到远程仓库,对应的就是推送。后续的修改,idea会给你标出来,重新提交,推送即可。