Git教程

第一章 Git概述

Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。

Git易于学习,占地面积小,性能极快。具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。

1.1 版本控制

版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。

版本控制最重要的是可以记录文件修改历史,从而让用户能够查看历史版本,方便版本切换。

1.2 版本控制工具

集中式版本控制工具:CVS、SVN、VSS…

  • 集中化的版本控制系统诸如 CVS、SVN 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。

  • 优点:每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来得轻松容易。

  • 缺点:中央服务器发生单点故障后任何人都无法提交更新,无法协同工作。

分布式版本控制工具:Git、Mercurial、Bazaar、Darcs…

  • 像Git这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来 (本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。
  • 分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷 :
    • 服务器断网的情况下也可以进行开发,因为版本控制是在本地进行的。
    • 每个客户端保存的也都是整个完整的项目,包含历史记录。更加安全。

1.3 Git简史

image-20221110133431576

1.4 Git工作机制

image-20221110133522244

1.5 Git和代码托管中心

代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库

  • 局域网:GitLab
  • 互联网:GitHub、Gitee

第二章 Git安装

官网:https://git-scm.com/

安装步骤:默认即可

安装时注意事项:

image-20221110141920393

image-20221110141945413

image-20221110141958020

image-20221110142027471

image-20221110142107415

文件的行末换行符, Windows使用 CRLF Linux使用 LF

image-20221110142142812

image-20221110142151364

image-20221110142200359

image-20221110142210586

第三章 Git常用命令

命令名称作用
git config global user.name 用户名设置用户签名
git config global user.email 邮箱设置用户签名
git init初始化本地库
git status查看本地库状态
git add 文件名添加到暂存区
git commit m " 日志信息 " 文件名提交到本地库
git reflog查看历史记录
git reset hard 版本号版本穿梭

3.1 设置用户签名

基本语法:

git config --global user.name 用户名
git config --global user.email 邮箱

配置完成后可在C:\Users\Administrator\.gitconfig文件中查看配置信息。

签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。 Git首次安装必须设置一下用户签名,否则无法提交代码。

注意:这里设置用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系。

3.2 初始化本地库

基本语法:

git init 

初始化后可在工作空间看到隐藏的 .git 文件夹。

3.3 查看本地库状态

基本语法:

git status

首次查看(工作区没有任何文件)

$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

新增文件(hello.txt)

$ vim hello.txt
hello git
hello git

再次查看(检测到未追踪的文件)

$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        hello.txt

nothing added to commit but untracked files present (use "git add" to track)

3.4 将工作区文件添加到暂存区

基本语法:

git add 文件名

提交后查看状态(检测到暂存区有新文件)

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   hello.txt

删除暂存区文件

git rm --cached 文件名

再次查看状态(检测到未追踪的文件)

$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        hello.txt

nothing added to commit but untracked files present (use "git add" to track)

3.5 将暂存区文件提交到本地库

基本语法:

git commit -m "日志信息" 文件名
$ git commit -m "first commit" hello.txt
[master (root-commit) 6433731] first commit
 1 file changed, 2 insertions(+)
 create mode 100644 hello.txt

提交成功后查看状态

$ git status
On branch master
nothing to commit, working tree clean

查看版本信息

$ git reflog
6433731 (HEAD -> master) HEAD@{0}: commit (initial): first commit

6433731:版本号

查看版本详细信息

$ git log
commit 6433731704e58f8e9768d5b9165b9033c9c36926 (HEAD -> master)
Author: wuyp315 <345949570@qq.com>
Date:   Thu Nov 10 16:35:32 2022 +0800

    first commit

6433731704e58f8e9768d5b9165b9033c9c36926:详细版本号

3.6 修改文件

修改文件–> 查看状态–> 添加到暂存区–> 查看状态 --> 提交到本地库 --> 查看状态 --> 查看版本信息

$ vim hello.txt
hello git
hello git 111
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   hello.txt

no changes added to commit (use "git add" and/or "git commit -a")
$ git add hello.txt
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   hello.txt
$ git commit -m "second commit" hello.txt
[master 83c894c] second commit
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git status
On branch master
nothing to commit, working tree clean
$ git reflog
83c894c (HEAD -> master) HEAD@{0}: commit: second commit
6433731 HEAD@{1}: commit (initial): first commit

3.7 历史版本

基本语法:

git reflog   查看版本信息
git log      查看版本详细信息

3.8 版本穿梭

基本语法:

git reset --hard 版本号
--首先查看当前的历史记录,可以看到当前是在83c894c这个版本
$ git reflog
83c894c (HEAD -> master) HEAD@{0}: commit: second commit
6433731 HEAD@{1}: commit (initial): first commit

--切换到6433731版本,也就是我们第一次提交的版本
$ git reset --hard 6433731
HEAD is now at 6433731 first commit

--切换完毕之后再查看历史记录,当前成功切换到了6433731版本
$ git reflog
6433731 (HEAD -> master) HEAD@{0}: reset: moving to 6433731
83c894c HEAD@{1}: commit: second commit
6433731 (HEAD -> master) HEAD@{2}: commit (initial): first commit

--然后查看文件hello.txt,发现文件内容已经变化

Git 切换版本,底层其实是移动的 HEAD 指针。

image-20221110201249565

第四章 Git分支操作

image-20221110202117517

4.1 什么是分支

在版本控制过程中,同时推进多个任务,为每个任务我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)

image-20221110202604340

4.2 分支的好处

同时并行推进多个功能开发,提高开发效率。

各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。

4.3 分支的操作

命令名称作用
git branch 分支名创建分支
git branch -v查看分支
git checkout 分支名切换分支
git merge 分支名把指定的分支合并到当前分支上

4.3.1 查看分支

基本语法:

git branch -v
$ git branch -v
* master 6433731 first commit

4.3.2 创建分支

基本语法:

git branch 分支名
$ git branch hot-fix

$ git branch -v
  hot-fix 6433731 first commit(刚创建的新的分支 ,并将主分支master的内容复制了一份)
* master  6433731 first commit

4.3.3 修改分支

修改master分支后,将文件添加暂存区,提交本地库后查看分支

$ git branch -v
hot-fix 6433731 first commit(hot-fix分支并未做任何改变)
* master 83c894c first commit(当前master分支已更新为最新一次提交的版本)

4.3.4 切换分支

基本语法:

git checkout 分支名
Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'

--发现当先分支已由master改为hot-fix,并且hot-fix分支上的文件内容与master分支上的内容不同
Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (hot-fix)

4.3.5 合并分支(正常合并)

基本语法:

git merge 分支名
$ git merge hot-fix
Updating 6433731..110e36d
Fast-forward
 hello.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

4.3.6 合并分支(冲突合并)

冲突产生的表现:后面状态为 MERGING

Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (master|MERGING)
$ cat hello.txt
hello git 111
test
<<<<<<< HEAD
2222
=======
test
>>>>>>> hot-fix
hello git

冲突产生的原因:合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git无法替我们决定使用哪一个。必须人为决定新代码内容。

查看状态(检测到有文件有两处修改)

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   hello.txt

no changes added to commit (use "git add" and/or "git commit -a")

4.3.7 解决冲突

  • 编辑有冲突的文件,删除特殊符号,决定要使用的内容

    • 特殊符号:<<<<<<< HEAD 当前分支的代码 ======= 合并过来的代码 >>>>>>> hot-fix
  • 添加到暂存区

    • git add hello.txt
  • 执行提交(注意:此时使用git commit 命令时不能带文件名)

    •   Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (master|MERGING)
        $ git commit -m "test"
        [master 22c139d] test
        
        --后面MERGING消失,变为正常
        Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (master)
      

4.4 创建分支和切换分支理解

master、hot-fix其实都是指向具体版本记录的指针。当前所在的分支,其实是由HEAD决定的。所以创建分支的本质就是多创建一个指针。

HEAD 如果指向master,那么我们现在就在master 分支上。

HEAD 如果执行hotfix,那么我们现在就在hotfix 分支上。

所以切换分支的本质就是移动HEAD指针。

第五章 Git团队协作机制

5.1 团队内协作

image-20221110222633935

5.2 跨团队协作

image-20221110222715644

第六章 GitHub操作

GitHub网址:https://github.com/

6.1 创建远程仓库

image-20221111093649376

6.2 远程仓库操作

命令名称作用
git remote v查看当前所有远程地址别名
git remote add 别名 远程地址起别名
git push 别名 分支推送本地分支上的内容到远程仓库
git clone 远程地址将远程仓库的内容克隆到本地
git pull 远程库地址别名 远程分支名将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并

6.2.1 创建远程仓库别名

基本语法:

git remote -v     查看当前所有远程地址别名
git remote add 别名 远程地址
Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (master)
$ git remote -v

Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (master)
$ git remote add git-demo https://github.com/wuyp315/git-demo.git

Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (master)
$ git remote -v
git-demo        https://github.com/wuyp315/git-demo.git (fetch)
git-demo        https://github.com/wuyp315/git-demo.git (push)

6.2.2 推送本地分支到远程仓库

基本语法:

git push 别名 分支
$ git push git-demo master
Logon failed, use ctrl+c to cancel basic credential prompt.
Username for 'https://github.com': wuyp315
Enumerating objects: 13, done.
Counting objects: 100% (13/13), done.
Delta compression using up to 4 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (13/13), 1022 bytes | 78.00 KiB/s, done.
Total 13 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To https://github.com/wuyp315/git-demo.git
 * [new branch]      master -> master

注意:登陆时密码需要填写生成的token

image-20221111103543293

6.2.3 拉取远程仓库到本地

基本语法:

git pull 别名 分支
$ git pull git-demo master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/wuyp315/git-demo
 * branch            master     -> FETCH_HEAD
   22c139d..ccde45e  master     -> git-demo/master
Updating 22c139d..ccde45e
Fast-forward
 hello.txt | 1 +
 1 file changed, 1 insertion(+)

6.2.4 克隆远程仓库到本地

基本语法:

git clone 远程地址
$ git clone https://github.com/atguiguyueyue/git-demo.git
Cloning into 'git-demo'...
remote: Enumerating objects: 41, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 41 (delta 12), reused 10 (delta 10), pack-reused 28
Unpacking objects: 100% (41/41), done.

$ git remote -v
origin  https://github.com/atguiguyueyue/git-demo.git (fetch)
origin  https://github.com/atguiguyueyue/git-demo.git (push)

clone会做以下操作:拉取代码、初始化本地库、创建别名

6.2.5 邀请他人加入团队

在仓库中添加成员,并将生成的链接发送给对方即可。

image-20221111113018057

6.2.6 跨团队协作

image-20221111133049377

修改后点击create pull request

image-20221111133239730

如果代码没有问题,可以点击 Merge pull reque合并代码。

image-20221111133508049

第七章 IDEA集成Git

IDEA版本:2020.3

7.1 配置Git忽略

原因:与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE工具之间的差异。

配置方法:创建忽略规则文件 xxxx.ignore(前缀名随便起,建议是 git.ignore,建议也放在用户家目录下)

git.ignore文件模版内容如下:

# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

.classpath
.project
.settings
target
.idea
*.iml

在 .gitconfig文件中引用忽略配置文件

[core]
	excludesfile = C:/Users/Administrator/git.ignore

image-20221111150028277

7.2 定位Git程序

image-20221111144006939

7.3 初始化本地库

image-20221111144106282
选择要创建Git本地仓库的工程。

7.4 添加到暂存区、提交到本地库

image-20221111144334592

7.5 切换版本

image-20221111144430452

7.6 创建切换分支

image-20221111150415478image-20221111150443253image-20221111150546696

选中Checkout branch后,创建成功后自动切换

切换分支:选中分支后,点击Checkout即可

7.7 合并分支(正常合并)

image-20221111151005382

7.8 合并分支(冲突合并)

image-20221111151317553

image-20221111151502230

第八章 IDEA集成GitHub

8.1 添加GitHub账号

点击 + 进行添加,网页授权后即可添加成功。

image-20221111151906286

8.2 push推送本地库到远程库

image-20221111161949537

image-20221111162001767

image-20221111162010811

注意:push是将本地库代码推送到远程库,如果本地库代码跟远程库代码版本不一致,push的操作是会被拒绝的。也就是说, 要想 push成功,一定要保证 本地 库的版本要比远程库的版本高! 因此一个成熟的程序员在动手改本地代码之前,一定会先检查下远程库跟本地代码的区别!如果本地的代码版本已经落后,切记要先 pull拉取一下远程库的代码,将本地代码更新到最新以后,然后再修改,提交,推送!

8.3 克隆远程库到本地

image-20221111163253645

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值