参考:
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 5月 19 15:29 ./
drwxrwxr-x 6 lx lx 4096 5月 15 17:58 ../
drwxrwxr-x 7 lx lx 4096 5月 19 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到自己的仓库。