江阴公司做网站,贴心网络推广方法,中国智力技术合作公司官网,建设网站要多少费用文章目录 带你学会Git必会操作1Git的安装2.Git基本操作2.1本地仓库的创建2.2配置本地仓库 3.认识一些Git的基本概念3.1操作流程#xff1a; 4.一些使用场景4.1添加文件场景一4.2查看git文件4.3修改文件4.4Git版本回退4.5git撤销修改 5.分支管理5.1查看分支5.2创建本地分支5.3切… 文章目录 带你学会Git必会操作1Git的安装2.Git基本操作2.1本地仓库的创建2.2配置本地仓库 3.认识一些Git的基本概念3.1操作流程 4.一些使用场景4.1添加文件场景一4.2查看git文件4.3修改文件4.4Git版本回退4.5git撤销修改 5.分支管理5.1查看分支5.2创建本地分支5.3切换本地分支5.4合并分支5.5删除分支5.6合并冲突5.6.1冲突的产生5.6.2解决冲突并合并 5.7bug分支 6.git远程操作6.1创建远程仓库6.2克隆远程仓库6.3向远程仓库进行推送6.4拉去远程仓库到本地仓库6.5.gitignore文件示例 7.标签管理7.1标签有什么用7.2如何创建标签7.3删除标签7.4将标签推送到远程仓库 带你学会Git必会操作
1Git的安装
CentOS环境
这里使用yum来安装,执行如下的命令即可:
sudo yum install git -y安装完成之后执行如下的命令就可以查看是否安装成功,如果安装成功了就会执行这个命令就会显示安装的git的版本
git --versionUbuntu环境
这里使用的是apt-get来安装
sudo apt-get install -y同样的查看是否安装成功的方式和上面的命令一样。
git --versionWin
可以直接去Git的官网进行下载Git - 安装 Git (git-scm.com)
官方也有对应的安装教程文档点击进去就可以看到
2.Git基本操作
2.1本地仓库的创建
什么是本地仓库
本地仓库Local Repository指的是用户在自己的计算机上创建和管理的代码仓库。这个仓库包含了项目的所有文件、提交历史、分支、标签等信息。
创建Git本地仓库在向创建本地仓库的目录下执行即可
git init执行完成后会显示如下可能不同的系统显示不一样但是意思都是一样
Initialized empty Git repository in /home/mi/gitcode/.git/其中这个.git文件是用来跟踪和管理我们对应的仓库的大致的目录结构是这样我们不能去手动更改其中的一些东西否则会导致仓库损坏
[milavm-5wklnbmaja gitcode]$ tree .git/
.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs├── heads└── tags9 directories, 13 files
2.2配置本地仓库 设置用户名和邮箱 每个提交都会包含用户名和邮箱可以通过以下命令配置全局对于当前用户的所有仓库或局部仅对当前仓库信息。 全局配置
git config --global user.name Your Name
git config --global user.email your.emailexample.com局部配置
git config user.name Your Name
git config user.email your.emailexample.com配置默认编辑器 默认情况下Git 使用系统的默认文本编辑器但你可以指定一个自己喜欢的编辑器。
git config --global core.editor code --wait # 使用 Visual Studio Code查看配置 你可以查看当前的配置通过以下命令查看所有全局和局部配置。
git config --list取消设置某个配置取消全局配置需要加上对应的--global选项例如这里取消用户名这里就是全局取消非全局的可以不适用--global选项
git config --global --unset user.name3.认识一些Git的基本概念
这里先上图 这个图展示了Git的工作流程和数据流向包括远程仓库、版本库、暂存区和工作区之间的交互。以下是对各个部分的详细介绍 远程仓库Remote 这是存储在服务器上的中央版本库团队成员可以通过远程仓库共享代码。常用操作fetch/clone 和 push。fetch/clone从远程仓库拉取数据到本地版本库。push将本地版本库的更新推送到远程仓库。 版本库Repository 本地版本库存储代码的历史版本信息是Git的核心。常用操作pull 和 commit。pull从远程仓库获取最新的更改并合并到本地版本库。commit将工作区或暂存区的更改保存到本地版本库。 暂存区Index / Stage 暂存区用于暂时存储你准备提交到版本库的文件快照。常用操作add 和 commit。add将工作区的更改添加到暂存区。commit将暂存区的更改提交到本地版本库。 工作区Workspace 工作区是你实际进行开发和修改文件的地方。常用操作checkout 和 add。checkout从版本库获取文件到工作区或在工作区切换分支。add将工作区的文件修改添加到暂存区准备提交。
3.1操作流程 从远程仓库克隆代码 使用 git clone 命令将远程仓库的代码复制到本地创建本地版本库。 在工作区进行修改 在工作区workspace中进行代码修改、添加新文件或删除文件。 将修改添加到暂存区 使用 git add 命令将工作区的修改添加到暂存区stage。 提交修改到本地版本库 使用 git commit 命令将暂存区的内容提交到本地版本库repository。 推送提交到远程仓库 使用 git push 命令将本地版本库的提交推送到远程仓库remote。 从远程仓库拉取更新 使用 git fetch 或 git pull 命令从远程仓库获取最新的更改并更新本地版本库。
那么Git是如何基于此实现版本管理的呢
4.一些使用场景
4.1添加文件场景一
我们这里创建三个文件并添加到暂存区之后commit到版本库
[milavm-5wklnbmaja gitcode]$ touch file1 file2 file3
[milavm-5wklnbmaja gitcode]$ la
. .. file1 file2 file3 .git ReadMe
[milavm-5wklnbmaja gitcode]$ git add file*
[milavm-5wklnbmaja gitcode]$ git commit -m 添加file1-3
[master 58f5185] 添加file1-33 files changed, 0 insertions(), 0 deletions(-)create mode 100644 file1create mode 100644 file2create mode 100644 file3git log命令用于打印出我们的提交记录
如下我们最新的提交是添加了三个文件上一次是测试提交
其中第一行对应的commit后面跟的是commit id是一个md5值
第二行和第三行是对应的提交者的信息和提交的日期最后一行是我们commit的时候的描述信息。
[milavm-5wklnbmaja gitcode]$ git log
commit 58f5185f2050dccbcaff6b8861eea844288105cd
Author: mqy mqingyang163.com
Date: Sun Jul 21 23:15:47 2024 0800添加file1-3commit 99d14bd9e71e882ac90c60249a4b9b13709d7900
Author: mqy mqingyang163.com
Date: Sun Jul 21 22:39:25 2024 0800测试同时git log也可以加一些参数例如让信息在一行显示
[milavm-5wklnbmaja gitcode]$ git log --prettyoneline
58f5185f2050dccbcaff6b8861eea844288105cd 添加file1-3
99d14bd9e71e882ac90c60249a4b9b13709d7900 测试4.2查看git文件
首先我们查看以下git文件下都有什么
用tree命令来查看一下
[milavm-5wklnbmaja gitcode]$ tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── logs
│ ├── HEAD
│ └── refs
│ └── heads
│ └── master
├── objects
│ ├── 58
│ │ └── f5185f2050dccbcaff6b8861eea844288105cd
│ ├── 6a
│ │ └── a86de6831a0d231d154dcc15e4e86d5502d358
│ ├── 99
│ │ └── d14bd9e71e882ac90c60249a4b9b13709d7900
│ ├── 9f
│ │ └── 4d96d5b00d98959ea9960f069585ce42b1349a
│ ├── dc
│ │ └── b8a6f4408f11ab8afe025b20a7315a2732446b
│ ├── e6
│ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ ├── info
│ └── pack
└── refs├── heads│ └── master└── tags18 directories, 24 filesindex 其中index就是我们在执行add命令的时候git帮我们将文件提交到暂存区形成的索引。 HEAD HEAD是一个指针它指向的是当前所在的仓库分支也可以理解为指向当前最新的commit id。 我们这里先找到对应的HEAD指针存储在哪发现它存储在.git下的这个路径refs/heads/master然后我们在查看以下它的内容发现对应的内容和最新提交的commit id是一致的。 [milavm-5wklnbmaja gitcode]$ git log
commit 58f5185f2050dccbcaff6b8861eea844288105cd
Author: mqy mqingyang163.com
Date: Sun Jul 21 23:15:47 2024 0800添加file1-3commit 99d14bd9e71e882ac90c60249a4b9b13709d7900
Author: mqy mqingyang163.com
Date: Sun Jul 21 22:39:25 2024 0800测试
[milavm-5wklnbmaja gitcode]$ cat .git/HEAD
ref: refs/heads/master
[milavm-5wklnbmaja gitcode]$ cat .git/refs/heads/master
58f5185f2050dccbcaff6b8861eea844288105cd objects 首先其实不管是暂存区还是对应的分支其实内部都是维护了对应的索引而不是文件/对象。那么其实对应的对象都是存储在object下的。其中object和分支可以理解为图(点击可跳转到对应的图)上的版本库。 这里将commit id分成了两段前2位为文件夹名后面的表示对象名。 ├── objects
│ ├── 58
│ │ └── f5185f2050dccbcaff6b8861eea844288105cd
│ ├── 6a
│ │ └── a86de6831a0d231d154dcc15e4e86d5502d358
│ ├── 99
│ │ └── d14bd9e71e882ac90c60249a4b9b13709d7900
│ ├── 9f
│ │ └── 4d96d5b00d98959ea9960f069585ce42b1349a
│ ├── dc
│ │ └── b8a6f4408f11ab8afe025b20a7315a2732446b
│ ├── e6
│ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ ├── info
│ └── pack那么我们查看一下master(用HEAD指针)下有啥吧用这个命令这个命令可以查看任何commit id的信息,也不一定是HEAD git cat-file -p HEAD运行查看 [milavm-5wklnbmaja gitcode]$ git cat-file -p 58f5185f2050dccbcaff6b8861eea844288105cd
tree 6aa86de6831a0d231d154dcc15e4e86d5502d358
parent 99d14bd9e71e882ac90c60249a4b9b13709d7900
author mqy mqingyang163.com 1721574947 0800
committer mqy mqingyang163.com 1721574947 0800添加file1-3 参数解释 parent是本次提交的上一次提交的commit id tree首先我们可以次啊用同样的命令来看看它内部是什么好像是我们文件和commit id的映射 [milavm-5wklnbmaja gitcode]$ git cat-file -p 6aa86de6831a0d231d154dcc15e4e86d5502d358
100644 blob 9f4d96d5b00d98959ea9960f069585ce42b1349a ReadMe
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file2
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file3我们查看以下第一个commit id存储了什么吧原来是我们的文件内容其实这里就是git帮我们把每一个版本的文件修改内容都维护起来了 [milavm-5wklnbmaja gitcode]$ git cat-file -p 9f4d96d5b00d98959ea9960f069585ce42b1349a
Hello Git4.3修改文件
Git追踪管理的其实是修改而不是文件。
我们尝试修改一下已经提交了的ReadMe文件向其中多写入一行字符然后再git仓库目录下执行git status
[milavm-5wklnbmaja gitcode]$ 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: ReadMe
#
no changes added to commit (use git add and/or git commit -a)其中我们可以看到第一行是没有暂存区的改变需要提交接下来就是ReadMe文件被修改的信息但是git status是看不到对应的文件被修改的内容只能获取到哪些文件被修改了。
那么Git也提供了一个命令用于查看暂存区和工作区之间的差异可以看到文件的具体内容哪些被修改了git diff
[milavm-5wklnbmaja gitcode]$ git diff
diff --git a/ReadMe b/ReadMe //比较两个版本的ReadMe文件
index 9f4d96d..c52a7d0 100644 //显示两个版本的文件索引哈希值和文件权限。
--- a/ReadMe //旧版本文件的内容开始b/ReadMe //新版本文件的内容开始-1 1,2 //显示差异的上下文旧版本文件的第1行新版本文件从第1行开始有两行内容Hello Git //旧版本文件的第1行内容
Hello Tx //新版本文件新增加的第2行内容
[milavm-5wklnbmaja gitcode]$ git diff ReadMe
diff --git a/ReadMe b/ReadMe
index 9f4d96d..c52a7d0 100644
--- a/ReadMeb/ReadMe-1 1,2 Hello Git
Hello Tx我们将ReadMe提交到暂存区之后再次执行一下git status
[milavm-5wklnbmaja gitcode]$ git add ReadMe
[milavm-5wklnbmaja gitcode]$ git status
# On branch master
# Changes to be committed:
# (use git reset HEAD file... to unstage)
#
# modified: ReadMe
#
[milavm-5wklnbmaja gitcode]$ git commit -m modify ReadMe
[master db2ce21] modify ReadMe1 file changed, 1 insertion()
[milavm-5wklnbmaja gitcode]$ git status
# On branch master
nothing to commit, working directory clean4.4Git版本回退
git reset 命令的三个参数对比对工作区、暂存区索引以及版本库HEAD的影响的表格
参数工作区暂存区索引版本库HEAD--soft无影响无影响移动HEAD指针到指定提交--mixed (默认)无影响移除暂存区中的更改移动HEAD指针到指定提交--hard丢弃所有未提交的更改丢弃所有未提交的更改移动HEAD指针到指定提交并丢弃所有未提交的更改
详细解释 --soft: 当使用 --soft 参数时git reset 只会移动HEAD指针到指定的提交但不会改变暂存区和工作区的状态。这意味着所有的更改仍然保留在暂存区中你可以重新提交或修改。 --mixed (默认): 默认情况下git reset 使用 --mixed 参数。它会移动HEAD指针到指定的提交并且更新暂存区以匹配该提交的状态但不会改变工作区。这通常用于取消暂存文件即将文件从暂存区移回工作区。 --hard: 使用 --hard 参数时git reset 会移动HEAD指针到指定的提交并且重置暂存区和工作区到该提交的状态。这将丢弃所有未提交的更改因此在使用这个选项之前需要非常小心。
请注意使用 --hard 参数时所有未提交的更改都会被丢弃且无法恢复。因此在执行可能影响工作区和暂存区的 git reset 操作之前确保你已经保存了所有重要的更改。
我们尝试使用一下
[milavm-5wklnbmaja gitcode]$ git log --prettyoneline //首先这里打印日志
db2ce217bd898c59522f748672436dd7e17541d2 modify ReadMe
58f5185f2050dccbcaff6b8861eea844288105cd 添加file1-3
99d14bd9e71e882ac90c60249a4b9b13709d7900 测试
[milavm-5wklnbmaja gitcode]$ git reset --hard 99d14bd9e71e882ac90c60249a4b9b13709d7900 //--hard回退到第一次的commit
HEAD is now at 99d14bd 测试
[milavm-5wklnbmaja gitcode]$ ls
ReadMe
[milavm-5wklnbmaja gitcode]$ cat ReadMe
Hello Git
[milavm-5wklnbmaja gitcode]$ git reset --hard db2ce217bd898c59522f748672436dd7e17541d2 //--hard回退到历史最新的commit
HEAD is now at db2ce21 modify ReadMe
[milavm-5wklnbmaja gitcode]$ ls
file1 file2 file3 ReadMe
[milavm-5wklnbmaja gitcode]$ git log --prettyoneline //我们可以查看到日志也恢复了
db2ce217bd898c59522f748672436dd7e17541d2 modify ReadMe
58f5185f2050dccbcaff6b8861eea844288105cd 添加file1-3
99d14bd9e71e882ac90c60249a4b9b13709d7900 测试
[milavm-5wklnbmaja gitcode]$ cat ReadMe //文件内容也恢复了
Hello Git
Hello Tx这里假设我们丢失了上面的log结果也就是说我们找不到所有的commit id了这时候我们还有一个命令git reflog我们发现reflog还是为我们保存了每一次的commit id
[milavm-5wklnbmaja gitcode]$ git reflog
99d14bd HEAD{0}: reset: moving to 99d14bd9e71e882ac90c60249a4b9b13709d7900
db2ce21 HEAD{1}: reset: moving to db2ce217bd898c59522f748672436dd7e17541d2
99d14bd HEAD{2}: reset: moving to 99d14bd9e71e882ac90c60249a4b9b13709d7900
db2ce21 HEAD{3}: commit: modify ReadMe
58f5185 HEAD{4}: commit: 添加file1-3
99d14bd HEAD{5}: commit (initial): 测试
[milavm-5wklnbmaja gitcode]$ git log --prettyoneline
99d14bd9e71e882ac90c60249a4b9b13709d7900 测试4.5git撤销修改
工作区暂存区版本库解决方式有修改无修改无修改git checkout -- [filename] 执行的效果就是将工作区中的修改撤销掉有修改有修改无修改git reset HEAD git checkout -- [filename] :执行的效果先将暂存区中的修改撤销到和当前版本库一致然后再将工作区的修改撤销有修改有修改有修改前提条件暂未push(提交到远程仓库)git reset --hard HEAD^:执行之后的效果就是将三个区域的修改同步为上一次版本库的版本
补充 对于git reset HEAD命令 git reset HEAD //回退到当前版本
git reset HEAD^ //回退到上一次版本
git reset HEAD^^ //回退到上上一次版本
...删除文件
git的git rm fileName命令这里我们可以看到使用这个命令git直接帮我们把变动直接更新到了暂存区我们只需要执行以下commit命令就可以更新到版本库了当然也可以手动删除但是需要先执行add再执行commit才可以更新到暂存区和版本库。
[milavm-5wklnbmaja gitcode]$ ls
file1 file2 file3 ReadMe
[milavm-5wklnbmaja gitcode]$ git rm file3
rm file3
[milavm-5wklnbmaja gitcode]$ ls
file1 file2 ReadMe
[milavm-5wklnbmaja gitcode]$ git status
# On branch master
# Changes to be committed:
# (use git reset HEAD file... to unstage)
#
# deleted: file3
#
[milavm-5wklnbmaja gitcode]$ git commit -m delete file3
[master feb6306] delete file31 file changed, 0 insertions(), 0 deletions(-)delete mode 100644 file3
[milavm-5wklnbmaja gitcode]$ git status
# On branch master
nothing to commit, working directory clean5.分支管理
5.1查看分支
git branch:可以看到这里我们只有一个分支master前面的*代表的就是HEAD
[milavm-5wklnbmaja gitcode]$ git branch
* master5.2创建本地分支
git branch 分支名 例如这里我们创建一个叫做dev的分支
[milavm-5wklnbmaja gitcode]$ git branch dev
[milavm-5wklnbmaja gitcode]$ git branchdev
* master5.3切换本地分支
git checkout 分支名 注意这里和之前的撤销操作不一样撤销对应的是:
git checkout --,这里的执行效果就是将本地分支从master切换到dev
[milavm-5wklnbmaja gitcode]$ git checkout dev
Switched to branch dev
[milavm-5wklnbmaja gitcode]$ git branch
* devmaster具体场景
我们这里在dev分支中对Readme文件做一些修改然后到master分支去看看
[milavm-5wklnbmaja gitcode]$ ls
file1 file2 ReadMe
[milavm-5wklnbmaja gitcode]$ vim ReadMe //对ReadMe文件进行修改
[milavm-5wklnbmaja gitcode]$ cat ReadMe //查看ReadMe文件内容
Hello Git
Hello Tx
change from dev
[milavm-5wklnbmaja gitcode]$ git add ReadMe //将ReadMe文件的修改提交到暂存区
[milavm-5wklnbmaja gitcode]$ git commit -m md ReadMe //将修改提交到版本库
[dev 31a9f0a] md ReadMe1 file changed, 1 insertion()
[milavm-5wklnbmaja gitcode]$ git status
# On branch dev
nothing to commit, working directory clean
[milavm-5wklnbmaja gitcode]$ cat ReadMe
Hello Git
Hello Tx
change from dev--------------------------------------------- //接下来切换到master分支看看[milavm-5wklnbmaja gitcode]$ git checkout master //切换分支
Switched to branch master
[milavm-5wklnbmaja gitcode]$ ls
file1 file2 ReadMe
[milavm-5wklnbmaja gitcode]$ cat ReadMe //查看master分支下的ReadMe内容
Hello Git //我们发现是不一样
Hello Tx5.4合并分支
git merge 分支名 : 将对应命令中的分支合并到当前所在的分支例如这里我们想将dev的change合并到master
[milavm-5wklnbmaja gitcode]$ git checkout master //首先我们切换到master
Already on master
[milavm-5wklnbmaja gitcode]$ git merge dev //执行合并分支的命令
Updating feb6306..31a9f0a
Fast-forward //这里的Fast-forward是快进模式的意思ReadMe | 1 1 file changed, 1 insertion()
[milavm-5wklnbmaja gitcode]$ cat ReadMe //查看一下master分支的ReadMe文件的内容
Hello Git
Hello Tx
change from dev
Fast-forward快进模式因为这里直接将master当前最新的commit id直接切换为了dev的最新commit id,所以整个合并的速度非常的快我们可以查看一下这两个分支对应的commit id发现是一模一样的
[milavm-5wklnbmaja gitcode]$ cat .git/refs/heads/master
31a9f0a550e020137f5cb9bb9d9d56d2751b569d
[milavm-5wklnbmaja gitcode]$ cat .git/refs/heads/dev
31a9f0a550e020137f5cb9bb9d9d56d2751b569d5.5删除分支
git branch -d 分支名注意删除对应的分支不能是当前分支
[milavm-5wklnbmaja gitcode]$ git checkout dev
Switched to branch dev
[milavm-5wklnbmaja gitcode]$ git branch -d dev //当前在dev分支尝试删除dev分支
error: Cannot delete the branch dev which you are currently on.
[milavm-5wklnbmaja gitcode]$ git checkout master //切换到master分支
Switched to branch master
[milavm-5wklnbmaja gitcode]$ git branch -d dev //删除dev分支
Deleted branch dev (was 31a9f0a).
[milavm-5wklnbmaja gitcode]$ git branch //查看本地仓库的分支
* mastergit branch -D 分支名 代表强制删除分支,上面的-d选项只能删除我们没有进行提交的分支我们需要删除提交过的分支的时候就不能采用上面的命令了。
[milavm-5wklnbmaja gitcode]$ git checkout -b dev1 //创建并切换到分支dev1
Switched to a new branch dev1
[milavm-5wklnbmaja gitcode]$ ls
file1 file2 ReadMe
[milavm-5wklnbmaja gitcode]$ vi ReadMe //修改ReadMe
[milavm-5wklnbmaja gitcode]$ git add ReadMe //提交修改
[milavm-5wklnbmaja gitcode]$ git commit -m mod ReadMe
[dev1 1ab15ef] mod ReadMe1 file changed, 1 insertion(), 1 deletion(-)
[milavm-5wklnbmaja gitcode]$ git checkout master
Switched to branch master
[milavm-5wklnbmaja gitcode]$ git branch -d dev1 //尝试删除dev1分支发现失败
error: The branch dev1 is not fully merged.
If you are sure you want to delete it, run git branch -D dev1.
[milavm-5wklnbmaja gitcode]$ git branch -D dev1 //确认一定要删除使用-D选项
Deleted branch dev1 (was 1ab15ef).5.6合并冲突
5.6.1冲突的产生
场景这里我们创建了一个新的分支dev1在dev1和master中对ReadMe中的同一行进行了修改
[milavm-5wklnbmaja gitcode]$ git checkout -b dev1 //创建并切换到新的分支
Switched to a new branch dev1
[milavm-5wklnbmaja gitcode]$ git branch
* dev1master
[milavm-5wklnbmaja gitcode]$ ls
file1 file2 ReadMe
[milavm-5wklnbmaja gitcode]$ vi ReadMe //修改ReadMe中的文件
[milavm-5wklnbmaja gitcode]$ git add ReadMe
[milavm-5wklnbmaja gitcode]$ git commit -m change ReadMe from dev1 //提交到版本库
[dev1 534b774] change ReadMe from dev11 file changed, 1 insertion(), 1 deletion(-)[milavm-5wklnbmaja gitcode]$ git checkout master //切换到master分支
Switched to branch master
[milavm-5wklnbmaja gitcode]$ ls
file1 file2 ReadMe
[milavm-5wklnbmaja gitcode]$ vim ReadMe //修改同样的行
[milavm-5wklnbmaja gitcode]$ git add ReadMe
[milavm-5wklnbmaja gitcode]$ git commit -m change ReadMe from master
[master 3508c78] change ReadMe from master1 file changed, 1 insertion(), 1 deletion(-)5.6.2解决冲突并合并
尝试合并这里尝试合并之后git提示我们有合并冲突并告诉我们在哪个文件我们只需要打开文件就可以看到git帮我们把冲突的内容很清晰的划分出来了。
[milavm-5wklnbmaja gitcode]$ git merge dev1 //这里在master分支尝试合并dev1
Auto-merging ReadMe //这里提示了冲突在ReadMe文件
CONFLICT (content): Merge conflict in ReadMe //提示我们解决冲突之后需要重新提交
Automatic merge failed; fix conflicts and then commit the result.
[milavm-5wklnbmaja gitcode]$ cat ReadMe //我们查看ReadMe文件
Hello Git
Hello TxHEAD
change from master //这一行代表在master分支的修改change from dev1 //这一行代表在dev1分支的修改dev1
处理冲突我们只需要将想保留下来的修改留下来剩下的部分删除就好了比如这里我们想留下在master的修改就删除掉dev1中对应的修改 1 Hello Git2 Hello Tx 3 change from master这里我们提交之后再进行合并操作我们发现合并成功了这就是一次冲突的处理
[milavm-5wklnbmaja gitcode]$ git add ReadMe
[milavm-5wklnbmaja gitcode]$ git commit -m fix conflict from ReadMe
[master 234dc10] fix conflict from ReadMe
[milavm-5wklnbmaja gitcode]$ git merge dev1
Already up-to-date.我们发现这里的merge的模式好像不是fast-forward模式因为之前我们的合并如果是fast-forward模式的话合并成功之后会有fast-forward的提示那么其实这里git默认给我们采用了no-ff也就是非fast-forward模式这两种模式有什么区别呢我们可以看到在no-ff模式可以看到这个修改是合并进来的还是commit进来的比fast-forward模式要清晰一些。
我们也可以在合并的时候告诉git我们要选择no-ff模式git merge -no-ff 分支名
//这是no-ff模式
[milavm-5wklnbmaja gitcode]$ git log --graph --abbrev-commit
* commit 234dc10
|\ Merge: 3508c78 534b774
| | Author: mqy mqingyang163.com
| | Date: Sun Jul 28 18:24:04 2024 0800
| |
| | fix conflict from ReadMe
| |
| * commit 534b774
| | Author: mqy mqingyang163.com
| | Date: Sun Jul 28 18:04:29 2024 0800
| |
| | change ReadMe from dev1
| |
* | commit 3508c78
|/ Author: mqy mqingyang163.com
| Date: Sun Jul 28 18:06:50 2024 0800
|
| change ReadMe from master
|
* commit 31a9f0a
| Author: mqy mqingyang163.com
| Date: Sat Jul 27 16:19:42 2024 0800
|
| md ReadMe
|
* commit feb6306
----------------------------------------------------
//fast-forward模式
[milavm-5wklnbmaja gitcode]$ git log --graph --abbrev-commit
* commit 749daa6
| Author: mqy mqingyang163.com
| Date: Sun Jul 28 18:48:03 2024 0800
|
| mod from dev3
|
* commit 234dc10
|\ Merge: 3508c78 534b774
| | Author: mqy mqingyang163.com
| | Date: Sun Jul 28 18:24:04 2024 0800
| |
| | fix conflict from ReadMe
| |
| * commit 534b774
| | Author: mqy mqingyang163.com
| | Date: Sun Jul 28 18:04:29 2024 0800
| |
| | change ReadMe from dev1
| |
* | commit 3508c78
|/ Author: mqy mqingyang163.com
| Date: Sun Jul 28 18:06:50 2024 0800
|
| change ReadMe from master
|
* commit 31a9f0a5.7bug分支
这里假设一个场景
我们基于master分支出了一个dev1但是这时我们不知道master是有bug的我们在dev1中进行开发开发到一半时发现master中是存在bug我们要去紧急处理一下但是这时候我们当前的分支又没有开发完成不想让修改影响到其他分支我们就可以用git stash将未提交的修改存储起来然后再去master分支拉出一个bugfix分支来进行bug的修复修复完成之后我们将bugfix分支合并到master然后再回到dev1继续进行开发则需要将使用git stash中暂存的修改先恢复出来然后进行开发当我们开发完成的时候可以先将master分支合并到dev1然后再将dev1合并到master(这样做的好处是如果有冲突或者造成新的bug我们可以在dev1分支上解决好而不是造成master分支的bug).
这里我们来着重演示一下git stash命令的使用将工作区的修改存入stash
[milavm-5wklnbmaja gitcode]$ git checkout -b dev1 //创建并且切换到dev1分支
Switched to a new branch dev1
[milavm-5wklnbmaja gitcode]$ vim ReadMe //修改ReadMe之中的内容
[milavm-5wklnbmaja gitcode]$ cat ReadMe
Hello Git
Hillo Tx
abc
xyz
[milavm-5wklnbmaja gitcode]$ clear
[milavm-5wklnbmaja gitcode]$ git stash
//然后将工作区当前的修改stash之后再查看一下ReadMe的内容
Saved working directory and index state WIP on dev1: 749daa6 mod from dev3
HEAD is now at 749daa6 mod from dev3
[milavm-5wklnbmaja gitcode]$ cat ReadMe
Hello Git
Hillo Tx
abc如何将stash中的修改恢复到工作区有以下几种方法
使用 git stash pop 这将恢复最近一次暂存的更改并从暂存列表中删除它。 示例执行 git stash pop 命令后暂存的更改将被应用到工作区如果有冲突需要手动解决。 使用 git stash apply 恢复最近一次暂存的更改但不会从暂存列表中删除。 例如如果您想先查看恢复的效果确保没有问题后再决定是否从暂存列表中删除可以先使用 git stash apply 。 如果您暂存了多次更改可以通过指定索引来恢复特定的暂存 git stash apply stash{0} 恢复第一个暂存。 假设您暂存了三次更改索引分别为 stash{0} 、 stash{1} 、 stash{2} 您可以根据需要选择恢复特定的一次暂存。 查看暂存列表 使用 git stash list 可以查看所有暂存的列表包括它们的描述信息以便确定要恢复的具体暂存。 6.git远程操作
6.1创建远程仓库
有很多主流的远程仓库网站这里以GitHub为例
在 GitHub 上创建远程仓库
登录您的 GitHub 账号。点击页面右上角的“”号选择“New repository”新建仓库。为仓库输入名称例如“my_project”。可选填写仓库的描述让其他人更容易理解仓库的用途。选择仓库的可见性例如“Public”公开或“Private”私有。选择是否添加 README 文件、.gitignore 文件等初始化选项。点击“Create repository”创建仓库按钮。
创建完成后您将获得一个远程仓库的 URL例如 https://github.com/your_username/my_project.git 您可以使用这个 URL 来将本地仓库与远程仓库关联。
更详细也可以参考这个视频01-创建远程仓库_哔哩哔哩_bilibili
6.2克隆远程仓库
https
这里使用的是git clone [url] 命令注意这里不能在本地仓库的目录下克隆
[milavm-5wklnbmaja ~]$ git clone https://gitee.com/slow-heating-shaanxi-people/remote-gitcode.git
Cloning into remote-gitcode...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
[milavm-5wklnbmaja ~]$ ls
cloud-backup gitcode install.sh learn other_lib remote-gitcodeSSH 1 生成 SSH 密钥对如果还没有 在本地终端中运行 ssh-keygen -t rsa -C your_emailexample.com 然后按照提示操作。 将公钥添加到您的代码托管平台如 GitHub、GitLab 等的 SSH 密钥设置中。 完成准备工作后您可以按照以下步骤通过 SSH 方式克隆远程仓库 假设您已经在代码托管平台上创建了远程仓库并获取到了 SSH 克隆 URL例如gitgithub.com:username/repository.git 在本地终端中运行以下命令 git clone gitgithub.com:username/repository.git 其中 username 是您的用户名repository 是远程仓库的名称。 运行命令后Git 会将远程仓库克隆到本地的当前目录下并创建一个与仓库名称相同的文件夹。 例如如果远程仓库名为 my_project 则会在当前目录创建一个 my_project 文件夹其中包含了远程仓库的所有内容。
exp输入完对应的ssh-keygen命令之后一直回车就好我们就会在.ssh目录下看到两个文件id_rsa 和 id_rsa.pub第一个是私钥第二个是公钥我们只需要把公钥也就是 id_rsa.pub中的内容配置在对应的远端仓库我们就可以利用ssh来进行克隆仓库啦
[milavm-5wklnbmaja ~]$ ssh-keygen -t rsa -C 1448554339qq.com
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mi/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/mi/.ssh/id_rsa.
Your public key has been saved in /home/mi/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xEWp8V3cHcZjkib4pWslWivDya7E9r8UbB/u0Vp95E 1448554339qq.com
The keys randomart image is:
---[RSA 2048]----
| .o. .oo|
| ..... o|
| o.oo.o .|
| .. .. o|
| S ..oEo|
| . oB..|
| .*. .o|
| . oo.. o|
| ooo. o.|
----[SHA256]-----
[milavm-5wklnbmaja ~]$ cd .ssh/
[milavm-5wklnbmaja .ssh]$ ls
id_rsa id_rsa.pub known_hosts省略配置的过程详细可参看这个视频02-生成公钥-添加公钥_哔哩哔哩_bilibili我们配置好之后就可以进行克隆仓库了
[milavm-5wklnbmaja ~]$ git clone gitgitee.com:slow-heating-shaanxi-people/remote-gitcode.git
Cloning into remote-gitcode...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (4/4), done.
[milavm-5wklnbmaja ~]$ ls
cloud-backup install.sh learn other_lib remote-gitcode6.3向远程仓库进行推送
git push命令例如这里我们创建一个file文件然后将其推送到远端的仓库push这个命令可以理解为两个分支之间的交互也就是将本地的一个分支提交到远端分支。
[milavm-5wklnbmaja remote-gitcode]$ vim file.txt
[milavm-5wklnbmaja remote-gitcode]$ git add file.txt
[milavm-5wklnbmaja remote-gitcode]$ git commit -m add file.txt
[master 88528a7] add file.txt1 file changed, 2 insertions()create mode 100644 file.txt
[milavm-5wklnbmaja remote-gitcode]$ git push origin master //origin是远端仓库master是本地仓库
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 326 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag 584eae8f
To gitgitee.com:slow-heating-shaanxi-people/remote-gitcode.git0227f21..88528a7 master - master6.4拉去远程仓库到本地仓库
git pull命令假设这里远端仓库现在有新的修改我们就可以使用这个命令将远端的修改拉取到我们本地。
git pull origin master:master其中origin master代表要拉取的远程的master分支冒号后面代表要拉取到本地的分支当本地分支名和远程分支名一致的时候可以省略掉本地分支名
git pull origin master这里pull做了两件事①将远程分支拉取到本地②合并到本地的master分支。
hello Git[milavm-5wklnbmaja remote-gitcode]$ git pull origin master:master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From gitee.com:slow-heating-shaanxi-people/remote-gitcode0352d19..3ea527f master - master
Warning: fetch updated the current branch head.
Warning: fast-forwarding your working tree from
Warning: commit 0352d19802fcfde0d92aa376bd09faf4eabecb02.
Already up-to-date.
[milavm-5wklnbmaja remote-gitcode]$ cat file.txt
hello remotehello Git6.5.gitignore文件
.gitignore文件是用于指定Git在版本控制中应忽略哪些文件或目录的配置文件。通过将不需要跟踪的文件或目录列入.gitignore文件中可以保持代码库的整洁并且避免提交一些临时文件、编译生成文件或敏感信息。
.gitignore文件的语法
.gitignore文件的语法非常简单由一行行规则组成。每条规则可以是文件名、目录名或带有通配符的模式。以下是语法规则的详细说明 空行和注释 空行会被忽略用于增加可读性。以#开头的行是注释。 # 这是一个注释匹配文件或目录 直接写文件名或目录名即可匹配对应的文件或目录。 /log.txt # 忽略根目录下的log.txt文件
/temp/ # 忽略根目录下的temp目录及其所有内容通配符 * 匹配零个或多个字符。? 匹配单个字符。[] 匹配指定范围内的单个字符。 *.log # 忽略所有以.log结尾的文件
temp?.txt # 忽略所有以temp加一个字符并以.txt结尾的文件
temp[0-9].txt # 忽略所有以temp加数字0到9并以.txt结尾的文件目录匹配 以斜杠/结尾的模式匹配目录及其所有内容。 /build/ # 忽略根目录下的build目录及其所有内容否定模式 以感叹号!开头的模式表示例外即即使之前的规则匹配也不忽略该文件或目录。 *.log # 忽略所有以.log结尾的文件
!important.log # 但不忽略important.log文件递归匹配 可以使用**表示递归匹配任意数量的子目录。 logs/**/debug.log # 忽略任何子目录下的debug.log文件示例
# 忽略所有 .log 文件
*.log# 忽略所有 .tmp 文件
*.tmp# 忽略 node_modules 目录
node_modules/# 忽略 build 目录及其所有内容
/build/# 忽略所有以 temp 开头并以 .txt 结尾的文件
temp*.txt# 忽略 logs 目录中的所有 .log 文件但保留 logs 目录中的 important.log 文件
logs/*.log
!logs/important.log这些规则可以根据项目的具体需求进行调整以忽略那些不需要跟踪的文件或目录。
git check-ignore -v 文件名 用于检测为什么当前文件被ignore了
7.标签管理
7.1标签有什么用
因为我们每一次commit的时候都会对应一个commit id但是对应的commit id是一串数字不方便我们阅读和查看所有有了标签的概念你可以命名一个标签对应的一个commit id。类似于ip和域名之类的。
7.2如何创建标签
比如这里我们使用git tag命令直接创建一个标签这里的含义是给最新的commit id创建一个标签叫v1.0
[milavm-5wklnbmaja remote-gitcode]$ git tag v1.0
[milavm-5wklnbmaja remote-gitcode]$ git tag
v1.0若是我们想向特定的commit id创建tag
[milavm-5wklnbmaja remote-gitcode]$ git log --prettyoneline --abbrev-commit//查看当前分支的commit id
3ea527f update file.txt.
0352d19 update file.txt.
88528a7 add file.txt
0227f21 Initial commit
[milavm-5wklnbmaja remote-gitcode]$ git tag v0.9 -m 测试版本 3ea527f
//为commit id 3ea527f添加一个叫v0.9的标签并给上注释信息“测试版本”
[milavm-5wklnbmaja remote-gitcode]$ git tag
v0.9
v1.0我们也可以用标签名来查看一些详细信息
git show 标签名这里可以看到对应的日期以及注释信息commit id等等
[milavm-5wklnbmaja remote-gitcode]$ git show v0.9
tag v0.9
Tagger: slow-heating-shaanxi-people 1448554339qq.com
Date: Sun Jul 28 23:12:59 2024 0800测试版本commit 3ea527f253bb17e70708bc1aea065e1cb6d88e98
Author: 慢热的陕西人 1448554339qq.com
Date: Sun Jul 28 14:42:35 2024 0000update file.txt.Signed-off-by: 慢热的陕西人 1448554339qq.comdiff --git a/file.txt b/file.txt
index b33c40a..aeb858b 100644
--- a/file.txtb/file.txt-1,3 1,3 hello remote-hello Git
\ No newline at end of file
hello Git7.3删除标签
删除标签
git tag -d 标签名
[milavm-5wklnbmaja remote-gitcode]$ git tag -d v1.0
Deleted tag v1.0 (was 3ea527f)7.4将标签推送到远程仓库
git push origin 标签名 这里将v0.9这个标签推送到远端仓库
[milavm-5wklnbmaja remote-gitcode]$ git push origin v0.9
Counting objects: 1, done.
Writing objects: 100% (1/1), 188 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag 0342c69a
To gitgitee.com:slow-heating-shaanxi-people/remote-gitcode.git* [new tag] v0.9 - v0.9git push origin --tags 将所有的本地标签都推送到远端
[milavm-5wklnbmaja remote-gitcode]$ git push origin --tags
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag ba4b4aa2
To gitgitee.com:slow-heating-shaanxi-people/remote-gitcode.git* [new tag] v0.8 - v0.8删除远端仓库的标签
git push origin : 要删除的标签名 例如这里我们在本地删除了v0.8的标签之后将这个操作更新到远程仓库。
[milavm-5wklnbmaja remote-gitcode]$ git tag -d v0.8
Deleted tag v0.8 (was 88528a7)
[milavm-5wklnbmaja remote-gitcode]$ git push origin :v0.8
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag bc4e3a91
To gitgitee.com:slow-heating-shaanxi-people/remote-gitcode.git- [deleted] v0.8关于学习git命令推荐一个网站里面有引导和图形化显示对新手非常的友好Learn Git Branching (gitee.com)