git
1.定义
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
2.基本操作
Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:本地仓库/版本库
- remote repository:远程仓库
说明:
- repository就是一个仓库,里面存储的就是我们的项目代码、数据和文件;
- workspace就是你写代码的当前目录,你写代码、改代码都直接作用于上;
- staging area就是暂存区,你觉得你这个模块写完了,应该不会变了,就可以staging一下,相反,你觉得你写的代码有问题,可以从本地分支check out一下,就类似于ctrl+z到上一次commit;
- 当你实现了某一个功能,你可能就需要把所有的需要提交的文件编程staging的状态,然后提交到你本地的repository里面,也就是commit;
- 如果你发现你污染了工作区的某一个文件,且这个文件没有被你staging,那么你可以从local repository中checkout一下;
- 使用push将本地仓库代码push到远程,使用pull将远程仓库的代码更新至本地。
2.1克隆仓库
初始化 Git
1 |
|
克隆默认分支代码
1 |
|
克隆 master 分支代码
1 |
|
设置提交代码时的用户信息:
1 |
|
查看分支
查看所有分支:
1
git branch
查看远程分支:
1
git branch -r
查看所有本地和远程分支:
1
git branch -a
合并分支
将其他分支合并到当前分支:
1
git merge [branch name]
例如,切换到 main 分支并合并 [branch name] 分支:
1
2
git checkout main
git merge [branch name]
2.2创建新分支
为了避免直接在 main 或 master 分支上进行开发,通常会创建并切换到一个新的分支:
1 |
|
2.3暂存
将修改过的文件添加到暂存区,以便进行下一步的提交操作:
1 |
|
2.4提交
将暂存区的更改提交到本地仓库,并添加提交信息:
1 |
|
查看提交历史
1
git log
限制显示的提交数:
1
git log -n <number>
例如,显示最近的 5 次提交:
1
git log -n 5
显示自指定日期之后的提交:
1
git log --since="2024-01-01"
显示指定日期之前的提交:
1
git log --until="2024-07-01"
只显示某个作者的提交:
1
git log --author="Author Name"
恢复和回退
Git 提供了多种方式来恢复和回退到之前的版本,不同的命令适用于不同的场景和需求。
以下是几种常见的方法:
- **
git checkout
**:切换分支或恢复文件到指定提交。- **
git reset
**:重置当前分支到指定提交(软重置、混合重置、硬重置)。- **
git revert
**:创建一个新的提交以撤销指定提交,不改变提交历史。- **
git reflog
**:查看历史操作记录,找回丢失的提交。(1)git checkout:检查出特定版本的文件
git checkout 命令用于切换分支或恢复工作目录中的文件到指定的提交。
恢复工作目录中的文件到某个提交:
将 file.txt 恢复到 76eac54 提交时的版本:
1
git checkout 76eac54 -- file.txt #76eac54是当前要恢复的commit id
切换到 76eac54 提交提交时的版本:
1git checkout 76eac54
这种方式切换到特定的提交时,处于分离头指针(detached HEAD)状态。
(2)git reset:重置当前分支到特定提交
git reset 命令可以更改当前分支的提交历史,它有三种主要模式:–soft、–mixed 和 –hard。
–soft:只重置 HEAD 到 76eac54 提交,保留暂存区更改。
1git reset --soft 76eac54
–mixed(默认):重置 HEAD 到 76eac54 提交,取消暂存区更改。
1git reset --mixed 76eac54
–hard:重置 HEAD 到 76eac54 提交,丢弃所有更改。
1
2
3
4
5
6
git reset --hard 76eac54 #76eac54是当前要恢复的commit id
git reset --hard head #当前版本
git reset --hard HEAD^ #回退到上一个版本
git reset --hard HEAD^^ #回退到上上一个版本
git reset --hard HEAD~3 #回退到往上3个版本
git reset --hard HEAD~10 #回退到往上10个版本(3)git revert:撤销某次提交
git revert 命令创建一个新的提交,用来撤销指定的提交,它不会改变提交历史,适用于已经推送到远程仓库的提交。
撤销 76eac54 提交:
1git revert 76eac54
(4)git reflog:查看历史操作记录
git reflog 命令记录了所有 HEAD 的移动。即使提交被删除或重置,也可以通过 reflog 找回。
1git reflog
利用 reflog 可以找到之前的提交哈希,从而恢复到特定状态。例如:
1git reset --hard HEAD@{3}
2.5推送
将本地的提交推送到远程仓库:
1 |
|
2.6拉取最新更改
在推送本地更改之前,最好从远程仓库拉取最新的更改,以避免冲突:
1 |
|
为什么要先拉取?
Git要求在推送之前先拉取的原因是为了避免冲突。当多个开发人员同时修改同一个文件或代码时,可能会发生冲突。为了解决这种冲突,Git采用了合并(Merge)的方式。而在进行合并之前,我们需要先获取最新的更改。
假设有两个开发人员同时从远程仓库克隆了一个项目,并分别对同一文件进行了修改。如果其中一个开发人员直接推送自己的更改而不经过拉取过程,那么另一个开发人员在拉取最新更改后将会面临冲突。
使用示例来解释这个概念更容易理解。假设我们有两个开发人员A和B,他们共同在一个项目中工作。他们分别从远程仓库克隆了项目,并开始进行开发。
- A完成了对文件A的修改,并将更改推送到主线分支。
- 即使B将自己的更改推送到主线分支之前执行了拉取操作,B还是会得到一个合并冲突的错误提示,因为他的更改和A的更改发生冲突。
通过拉取最新更改,B将能检测到并解决冲突。这样,在合并的过程中就可以保持项目的一致性和完整性。
2.7删除分支
如果不再需要新功能分支,可以将其删除:
1 |
|
强制删除未合并的分支:
1 |
|
或者从远程仓库删除分支:
1 |
|
3.Git 远程仓库(Github)
本例使用了 Github 作为远程仓库
由于你的本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的,所以我们需要配置验证信息:
使用以下命令生成 SSH Key:
1 |
|
接着一路回车,直到结束。 会显示已经生成了.ssh的文件夹。在你的电脑中找到文件夹C:\Users\ useraccount
/.ssh/id_rsa.pub,用记事本打开,复制全部内容。
打开自己的 Github 主页,点击右上角的头像,点击Settings。
点击SSH and GPG keys,然后点击New SSH keys。
找到SSH keys的设置选项,点击New SSH key 把id_rsa.pub里面的信息复制进去。
Title 可以随便起一个名字,Key 填写上一步复制的公钥内容,然后点击Add SSH key
最后执行下面的命令,测试一下 Git 参数是否配置成功。出现Hi username! You've successfully authenticated, but GitHub does not provide shell access.
,说明配置成功。
1 |
|
点New创建新的分支
点Create respository创建完成
本地仓库右键→显示更多选项→Open Git Bash Here
初始化 Git
1 |
|
当前目录会出现一个.git文件
配置用户名和电子邮件地址
1 |
|
1 |
|
网上的git教程有的用main分支举例,有的用master分支举例,原因在于,github建立远程仓库时的默认分支是main,实际上是通过倒数1、3行实现的,代码如下:
1
2
3
4
5
6
7
>echo "# Visualization" >> README.md
>git init
>git add README.md
>git commit -m "first commit"
>git branch -M main #创建新的分支main
>git remote add origin https://github.com/Sulawesi02/Visualization.git
>git push -u origin main #将新分支main推送到github而建立本地仓库时的默认分支是master,所以两种分支其实区别不大,但我觉得提交master分支更顺手一点(提交main分支需要额外在本地创建并切换到main分支,别的区别不大)