Git入门到精通

参考:
1、Ubuntu下git的安装与使用
2、哔哩哔哩–尚硅谷Git入门到精通全套教程(涵盖GitHub\Gitee码云\GitLab)(主要参考)

1 ubuntu下git的安装

1.1 安装git、配置名称和电子邮件地址

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 配置SSH公钥

如果 git 想通过 SSH 的方式对远程仓库(repository)进行 拉取(pull) 、 推送(push)、克隆(clone) 等操作 ,则需要配置 SSH 公钥。
1)基础语法
命令:ssh-keygen -C ‘your email address@qq.com’ -t rsa
注释:-t : 指定用哪种加密算法来生成SSH公钥;rsa : 一种加密算法(非对称加密协议)
2)实操

  • 名称和电子邮件地址配置完成后,需要创建验证用的公钥。输入命令ssh-keygen -C ‘your email address@qq.com’ -t rsa(注意ssh与-keygen之间没有空格)后,如果一路回车则默认会在用户目录~/.ssh/下建立相应的密钥文件,并没有密码; 也可以在 Enter file … 处输入想让密钥文件保存的路径和文件名,在1处输入密码,2处确认密码。
    本处将密钥命名为 id_rsa_learn-linux,并1、2处不设密码直接回车,若设置了密码则在 git push 时需要输入密码,麻烦。
    在这里插入图片描述
  • 创建完公钥后,需要上传。使用命令 cd ~/.ssh 进入~/.ssh文件夹,输入gedit id_rsa_learn-linux.pub打开 id_rsa_learn-linux.pub文件,复制其中所有内容。接着访问 Github ,点击头像–> Settings --> Ctrl+F搜索SSH,然后点击SSH公钥,标题栏可以随意输入,公钥栏把你刚才复制的内容粘贴进去就OK了。
    在这里插入图片描述
    (id_rsa_learn-linux.pub是公钥(public),id_rsa_learn-linux是私钥)
  • 可以使用 ssh -T git@github.com 命令来测试连接是否畅通。
    在这里插入图片描述

2 四个工作区域 和 git常用指令

2.1 四个工作区域

(fetch 命令不常用了,一般都用 clone)

说明:

  • workspace:工作区,就是你平时存放项目代码的地方
    示例:比如在Windows下用 Pycharm 编写一个Python程序,则下图所示就是工作区。

  • staging area:暂存区/缓存区

  • local repository:版本库或本地仓库,就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本

  • remote repository:远程仓库(可以理解为github这种云端仓库)
    实际使用时只需管理workspace、remote repository,中间两个(暂存区、本地仓库)只需使用命令去操作即可。

2.2 git 常用指令

在这里插入图片描述

3 文件4种状态

3.1、文件的4种状态

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。

  • Untracked: 未跟踪。文件在刚刚新建的时候,是没有被跟踪的。 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.

  • Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件

  • Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 !

  • Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified。

3.2、查看文件状态(未整理好)

上面说文件有4种状态,通过如下命令可以查看到文件的状态:

首先,勾选 show hidden files 选项,这样可以查看隐藏文件。
在这里插入图片描述

3.3、.gitignore忽略文件

此处参考文章 .gitignore 忽略文件和目录

4 创建本地仓库(2种办法:克隆远程仓库或本地搭建)

创建本地仓库的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库。

4.1 克隆远程仓库

"# 克隆一个项目和它的整个代码历史(版本信息)"
$ git clone [url]  "# https://gitee.com/kuangstudy/openclass.git "

如果 git clone [url] 不成功,可以 git clone [SSH_url],SSH_url 就是下图所示的链接。(如果通过SSH的方式访问资源库需要配置SSH公钥)
或者执行 sudo apt-get update 、sudo apt-get upgrade 命令升级一下,再执行 git clone [HTTPS_url]。
在这里插入图片描述

4.2 本地仓库搭建

4.2.1 创建本地空仓库并初始化

创建本地仓库的条件是需要一个空目录,然后在空目录中初始化你的项目

如我想创建一个名为“test”的空项目,并使用 git init 初始化当前仓库

lx@lx-virtual-machine:~/Desktop/linux_learn_lx$ mkdir test
lx@lx-virtual-machine:~/Desktop/linux_learn_lx$ cd test
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ git init
Initialized empty Git repository in /home/lx/Desktop/linux_learn_lx/test/.git/
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ tree -a
.
└── .git
    ├── branches
    ├── config
    ├── description
    ├── HEAD
    ├── hooks
    │   ├── applypatch-msg.sample
    │   ├── commit-msg.sample
    │   ├── fsmonitor-watchman.sample
    │   ├── post-update.sample
    │   ├── pre-applypatch.sample
    │   ├── pre-commit.sample
    │   ├── prepare-commit-msg.sample
    │   ├── pre-push.sample
    │   ├── pre-rebase.sample
    │   ├── pre-receive.sample
    │   └── update.sample
    ├── info
    │   └── exclude
    ├── objects
    │   ├── info
    │   └── pack
    └── refs
        ├── heads
        └── tags

10 directories, 15 files
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$

4.2.2 新建文件a.c并添加到 local repository (本地仓库)

下面代码区用 "# " 标识的内容是我自己额外加的注释
(实际在shell命令行输入命令时进行注释使用 # , shell 会忽略 # 后的内容)

------------------------------------"# 注释内容"------------------------------------
"# 查看指定文件状态 "
git status [filename]

"# 查看所有文件状态 "
git status 

"# 添加所有文件到暂存区 "
git add .  

git commit -m "日志信息"            "# 将暂存区里的所有内容提交到本地仓库; -m(message)"
git commit -m "日志信息" filename   "# 将暂存区里的filename文件提交到本地仓库"
------------------------------------"注释内容"------------------------------------
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ ll -a
total 12
drwxrwxr-x 3 lx lx 4096 519 15:29 ./
drwxrwxr-x 6 lx lx 4096 515 17:58 ../
drwxrwxr-x 7 lx lx 4096 519 15:41 .git/

"# 此时test文件夹只有 .git 文件夹 "
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ vim a.c
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ cat -n a.c
     1	#include <stdio.h>
     2	
     3	int main()
     4	{
     5		printf("hello world!");
     6
     7		return 0;
     8	}		
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ git status
On branch master

No commits yet

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

	a.c

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

"# 在test文件夹里创建一个文件a.c,未执行git add命令,执行git status命令可查看到显示有未跟踪(Untracked)文件 a.c "
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$  git add .   "# 将test下所有文件添加到 Staging area(暂存区) "
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$  git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)  "# 执行git rm --cached a.c 命令可以将暂存区里的a.c文件删掉"

	new file:   a.c

"# 执行 git add . 命令后a.c文件显示待提交(Changes to be committed)状态,此时 a.c 文件在暂存区中 "
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$  git commit -m "first commit"
[master (root-commit) 7a1515a] first commit
 1 file changed, 8 insertions(+)               "# 1个文件被更改,插入了8行内容"
 create mode 100644 a.c
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$  git status
On branch master
nothing to commit, working tree clean

"# 恢复到之前的状态:没有东西要提交 "
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$  

一般我们工作时会把代码全部放在工作目录(workspace)下,代码写完之后执行 git add . 将所有代码提交到暂存区,通过git status查看有没有提交进去,提交进去后通过 git commit 提交到本地仓库,最后 git push 到远程仓库。

4.2.3 修改a.c文件并再次提交到本地库

上面 3.2.2 中 a.c 文件已经编辑好并提交到 local repository(本地仓库)中了,现在想修改 a.c 文件。
下面代码区用 "# " 标识的内容是我自己额外加的注释

lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ vim a.c    "# 修改了 a.c 文件"
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ cat -n a.c
     1	#include <stdio.h>
     2	
     3	int main()
     4	{
     5		printf("hello world!");
     6		printf("healthy, happy!");
     7		
     8		return 0;
     9	}
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ 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:   a.c

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

"# 修改的a.c文件还未提交到暂存区(Staging area)里"
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ git add a.c 
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   a.c

lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ git commit -m "second commit" a.c
[master 47b1630] second commit
 1 file changed, 1 insertion(+)
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ git status
On branch master
nothing to commit, working tree clean

lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ git log
commit 47b1630c911df031ff2bf70e2998e811d7ae28e3 (HEAD -> master)
Author: xinhappy1 <2455842670@qq.com>
Date:   Sun May 21 15:45:51 2023 +0800

    second commit

commit fc478be1fcfb10daf1cdd53b9ea4bf44a5838caa
Author: xinhappy1 <2455842670@qq.com>
Date:   Sun May 21 15:16:26 2023 +0800

    first commit
    
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ git reflog
47b1630 (HEAD -> master) HEAD@{0}: commit: second commit         "# 当前指针HEAD指向最新提交的版本(second commit)"
fc478be HEAD@{1}: commit (initial): first commit

lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ cat -n a.c  "# 此时执行cat命令显示的内容是最新提交的版本"
     1	#include <stdio.h>
     2	
     3	int main()
     4	{
     5		printf("hello world!");
     6		printf("healthy, happy!");
     7		
     8		return 0;
     9	}
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ 

4.2.4 查看文件历史提交信息(git log 和 git reflog)

上面4.2.3中已经使用了 git log 和 git reflog 命令
1)基本语法
命令: 1、git log 和 git reflog                 作用:查看所有文件历史提交/修改信息
    2、git log filename 和 git reflog filename     作用:查看指定文件历史提交/修改信息
2)相关总结
git log 与 git reflog的区别:git命令log与reflog的比较
简易区别:
    git log    作用:查看版本详细信息
    git reflog   作用:查看版本简略信息
重要区别:
git log 和 git reflog的最大区别是能不能查询到被删除的 commit 记录和 reset 的操作记录,log不能,而reflog可以;所以以后要买后悔药就去找reflog。

简单说 就是 git log 只能查看提交的历史 以前的提交 但是你回退版本后 最前面的版本是不能再被查看了 而git reflog 可以

4.2.5 a.c文件版本切换(通过版本号)

1)基本语法
git reset --hard 版本号
2)案例实操

lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ git log
commit 47b1630c911df031ff2bf70e2998e811d7ae28e3 (HEAD -> master)
Author: xinhappy1 <2455842670@qq.com>
Date:   Sun May 21 15:45:51 2023 +0800

    second commit

commit fc478be1fcfb10daf1cdd53b9ea4bf44a5838caa        
    "# fc478be1fcfb10daf1cdd53b9ea4bf44a5838caa是a.c(first commit)的详细版本号"
Author: xinhappy1 <2455842670@qq.com>
Date:   Sun May 21 15:16:26 2023 +0800

    first commit
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ git reflog
47b1630 (HEAD -> master) HEAD@{0}: commit: second commit
fc478be HEAD@{1}: commit (initial): first commit  
                "# fc478be是a.c(first commit)的简略版本号,是详细版本号的前7位"           


"
当前HEAD指针指向的是最新提交的版本(second commit),如果我不想使用second commit,而想使用第一次提交的版本(first commit)
则操作如下:
首先,复制first commit的版本号:fc478be
然后,执行命令:git reset --hard fc478be
"
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ git reset --hard fc478be
HEAD is now at fc478be first commit
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ cat -n a.c
     1	#include <stdio.h>
     2	
     3	int main()
     4	{
     5		printf("hello world!");
     6		
     7		return 0;
     8	}

"# 查看日志"
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ git log
commit fc478be1fcfb10daf1cdd53b9ea4bf44a5838caa (HEAD -> master)
Author: xinhappy1 <2455842670@qq.com>
Date:   Sun May 21 15:16:26 2023 +0800

    first commit
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ git reflog
fc478be (HEAD -> master) HEAD@{0}: reset: moving to fc478be
47b1630 HEAD@{1}: commit: second commit
fc478be (HEAD -> master) HEAD@{2}: commit (initial): first commit   "# HEAD指针已经指向 first commit a.c 文件"
lx@lx-virtual-machine:~/Desktop/linux_learn_lx/test$ 

3)补充内容
假设我编写提交了 3个文件:a.c、b.c、c.c,第一次提交后,我又修改了这3个文件并进行了第二次提交。此时我想通过 git reset --hard 命令切换到b.c第二次提交的版本,则结果如下:
在这里插入图片描述
切换到 b.c 第二次提交的版本,此时 HEAD -> master (重点关注最下面的HEAD -> master)已经指向该版本,通过cat 命令查看文件内容发现,只有c.c文件是第一次提交的版本,剩下的 a.c、b.c 都是第二次提交的版本。
说明: git reset --hard 命令切换版本时切换的是整个本地项目的版本,而不单单是某一文件的版本

5 Git分支操作

一定要注意的点:
特别注意:修改文件后一定不要忘了将文件提交到 local repository(本地仓库)。
特别注意:修改文件后一定不要忘了将文件提交到 local repository(本地仓库)。
特别注意:修改文件后一定不要忘了将文件提交到 local repository(本地仓库)。

5.1 什么是分支

bilibili–尚硅谷Git–15_尚硅谷_Git_分支_概述和优点

5.2 分支的操作

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

5.2.1 查看分支

1)基本语法
git branch -v
2)案例实操
在这里插入图片描述
表明当前只有 master 分支

5.2.2 创建分支

1)基本语法
git branch 分支名
2)案例实操
在这里插入图片描述

5.2.3 切换分支

1)基本语法
git checkout 分支名
2)案例实操
在这里插入图片描述

5.2.4 修改分支

修改 hot-fix 分支中的 a.c 文件(和在 master 分支下的操作一样)
在这里插入图片描述
在这里插入图片描述
特别注意:修改文件后一定要将文件提交到 local repository(本地仓库)。
特别注意:修改文件后一定要将文件提交到 local repository(本地仓库)。
特别注意:修改文件后一定要将文件提交到 local repository(本地仓库)。

5.2.5 合并分支

基本语法:
git merge 分支名

1、正常合并

释义:git branch hot-fix 创建新分支hot-fix,此时hot-fix分支里的内容和主分支里的内容相同,如果接下来仅仅对hot-fix分支里的文件进行了修改,那么使用 git merge 命令进行合并时不会报冲突,是正常合并。
在这里插入图片描述
将 hot-fix 分支合并到 master 分支:先 git checkout 切换到 master 分支,然后使用 git merge hot-fix 命令进行合并。
在这里插入图片描述
在这里插入图片描述

2、冲突合并

释义:如果创建了新分支hot-fix后,不仅仅对新分支里的文件内容进行了修改,还对 master 分支里的文件内容进行了修改,且所做修改不同,那么在进行合并时会报冲突,此时需要手动选择合并内容。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6 Github操作

6.1 创建远程仓库

打开登录Github,在下图所示位置可以创建 远程库。
按照习惯,远程库的名称最好和本地库的名称相同,我的本地库名称为test,因此远程库名称也设为 test。
在这里插入图片描述

6.2 远程仓库操作

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

补充内容:
   git remote rename 旧别名 新别名     作用:重命名别名
   git remote remove 别名         作用:移除别名
   git clone -b 远程仓库分支 远程仓库地址   作用:将远程仓库的指定分支克隆到本地

6.2.1 创建远程库别名

意义:在实际工作时,可能需要频繁地 push 或 pull 远程仓库代码,而远程仓库地址太长不方便记忆,
   使用别名进行操作会比较方便。
1)基本语法
git remote -v            作用:查看当前所有远程地址别名
git remote add 别名 远程地址   作用:给远程地址起别名
2)案例实操
下面的链接为 test 远程仓库的链接。
在这里插入图片描述
在这里插入图片描述

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

1)基本语法
  git push 别名 分支   作用:推送本地分支上的内容到远程仓库
注意: 推送时要指定推送的是本地仓库的哪个分支
2)案例实操
由于我的电脑通过 HTTPS 链接推送不了远程仓库,
因此我使用远程仓库的 SSH 链接进行 推送 或 拉取。(如果通过SSH的方式访问资源库需要配置SSH公钥)
首先便是给链接取别名:在这里插入图片描述
本地仓库有2个分支:master 和 hot-fix,
将 master 分支推送到远程仓库。下图表示推送成功。
在这里插入图片描述
刷新Github,此时默认分支是 main 分支,将其切换到 master 分支即可看到推送的内容。
在这里插入图片描述
切换到 master 分支
在这里插入图片描述
点开查看 a.c 内容,发现和推送的一致。
在这里插入图片描述

6.2.3 pull 拉取远程库到本地

1)基本语法
git pull 远程库地址别名 远程库分支名
作用:将远程仓库对应分支最新内容拉取到本地仓库,且拉取下来后会与当前本地分支自动合并
注意:在拉取时,需要确定是拉取到本地哪个分支上,如果是想拉取到本地 master 分支上,需要先切换到该分支然后再进行拉取。
2)案例实操
在这里插入图片描述
如上图所示,此时本地仓库与远程仓库已经不是同步的了,此时需要更新本地库的代码,通过拉取命令可以更新。
在这里插入图片描述
在这里插入图片描述
上图可以看出,拉取后会自动与本地仓库进行合并,不需要额外执行 git add 、 git commit 等操作。

6.2.4 克隆远程仓库到本地

1)基本语法
  1、git clone 远程地址            作用:将远程仓库的内容克隆到本地(默认克隆主分支)
  2、git clone -b 远程仓库分支 远程仓库地址   作用:将远程仓库的指定分支克隆到本地
          -b 是 branch 的缩写
步骤: 在一个新文件夹(空文件夹)里进行克隆操作
小结: clone会做如下操作:1、拉取代码 ;2、初始化本地仓库;3、创建别名(默认别名为origin)
2)案例实操
在这里插入图片描述

6.3 团队内协作(在Github上repository里添加项目成员)

在远程项目仓库里添加成员后,该成员就可以对该仓库进行 push 等等操作。
哔哩哔哩-团队内协作

6.4 跨团队协作(涉及到Github上的fork操作)

哔哩哔哩-跨团队协作
哔哩哔哩-团队内协作和跨团队协作机制
fork :叉子。 这里可以理解为把代码叉过来
在这里插入图片描述
(令狐冲是岳不群的弟子,就是岳不群团队内的人)
主要流程:岳不群想让团队外的大佬东方不败帮忙修改自己的项目代码,首先岳不群将自己远程仓库的地址发给东方不败,东方不败在Github上打开该地址后,点击了右上角的 Fork 便将岳不群的项目代码叉到(类似复制)自己的远程仓库(Github–repository)里。
此时东方不败在自己的远程仓库里对叉过来的项目代码进行修改后,想把修改后的代码发给岳不群,便使用 pull request 操作将代码发给岳不群,岳不群再审核一下然后merge到自己的仓库。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值