Git详解

发布于:2025-05-14 ⋅ 阅读:(13) ⋅ 点赞:(0)


在这里插入图片描述

Step1 GIt的安装和配置

Linux

sudo apt install git

windows
点击 git下载
安装过程中几个注意的地方,没写默认就行
在这里插入图片描述
第一个框是选择是否创建桌面快捷方式,根据自己的需求勾选,我选择创建
第二个框Chek…updates 是每天检查是否有更新,Add…Terminal是添加Git Bash到Windows终端,也是根据个人需求选择,我没有勾选
红框外的是默认选择,不要动
选择好后点击Next

编辑器选择
在这里插入图片描述
在这里插入图片描述
Git配置

git config --global user.name "Your Name"
git config --global user.email "email@example.com"

Step2 初始化工作空间

通过git init命令把这个目录变成Git可以管理的仓库:

git init

在这里插入图片描述
目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的

  • 工作区: 在你电脑里看到的目录在这里插入图片描述

  • 暂存区: 在.git文件夹内的index中 (二进制记录)

  • 版本库: 指的整个.git文件夹 (也认为是本地仓库)

添加文件到Git仓库,分两步:
首先我们输入git status查看当前状态(提示当前位于主分支master,红色字体表示当前文件没有添加)
在这里插入图片描述
使用命令git add <file>,注意,可反复多次使用,添加多个文件;
在这里插入图片描述
现在我们将工作区的代码add到了暂存区,下面通过使用命令git commit -m <message>提交到本地仓库当前分支。
要随时掌握工作区的状态,使用git status命令。message输入你提交的提示信息
在这里插入图片描述
如果git status告诉你有文件被修改过,用git diff可以查看修改内容。
比如说,我新建一个readme.txt文档,我先用git add readme.txt 添加到暂存区,之后,我再打开readme.txt修改,增加了一行test
,如图,使用命名,可以查看出差异性
在这里插入图片描述

Step3 常用操作

在这里插入图片描述

版本回退

不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
我们使用给git log查看提交日志信息,如下显示了最近我进行了第一次提交

navtech@navtech-virtual-machine:~/Drone_Rural_Logistics$ git log
commit 60669a7645fa933772669b1c3162ed272e74aae9 (HEAD -> master)
Author: wind <147018942@qq.com>
Date:   Mon May 12 16:26:48 2025 +0800
    the first commit Drone_Rual_Logistics

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上–pretty=oneline参数:git log --pretty=oneline
看到的一大串类似60669a7645fa933772669b1c3162ed272e74aae9的是commit id(版本号),这个是用于版本回退的钥匙
下面演示了回退到上一个版本:

git reset --hard HEAD^
HEAD is now at e475afc add distributed

–hard参数有啥意义?–hard会回退到上个版本的已提交状态,而–soft会回退到上个版本的未提交状态,–mixed会回退到上个版本已添加但未提交的状态。现在,先放心使用- -hard。
上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

--soft会回退到上个版本的未提交状态,--mixed会回退到上个版本已添加但未提交的状态
如果,后悔了,只要这个终端没关闭,输入git log查看提交日志,得到提交版本号,然后
git reset --hard 版本号
如果终端关闭后悔了

git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file

git reflog查看命令历史,以便确定要回到未来的哪个版本。

撤销修改

git checkout -- file可以丢弃工作区的修改
例如:
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

  • 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
  • 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区

删除文件

一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
git checkout -- test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

Step4 远程仓库

在这里插入图片描述

  • 第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
    ssh-keygen -t rsa -C "youremail@example.com"
    你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

  • 第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
在这里插入图片描述

git remote add origin git@github.com:用户名/仓库名称.git

远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

git push -u origin master

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令:

git push origin master

删除远程库
如果添加的时候地址写错了,或者就是想删除远程库,可以git remote rm <name>命令。使用前,建议先用git remote -v查看远程库信息

git remote rm origin

从远程克隆到本地(就不需要本地git init初始工作空间了)

git clone git@github.com:用户名/远程仓库名.git

多个远程库
使用多个远程库时,我们要注意,git给远程库起的默认名称是origin,如果有多个远程库,我们需要用不同的名称来标识不同的远程库。
仍然以learngit本地库为例,我们先删除已关联的名为origin的远程库:
git remote rm origin
然后,先关联GitHub的远程库:
git remote add github git@github.com:michaelliao/learngit.git
注意,远程库的名称叫github,不叫origin了。
接着,再关联Gitee的远程库:
git remote add gitee git@gitee.com:liaoxuefeng/learngit.git
同样注意,远程库的名称叫gitee,不叫origin。
在这里插入图片描述

Step5 分支管理

理论

Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向
在这里插入图片描述
从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变
在这里插入图片描述
dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并
在这里插入图片描述
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支

实操

创建并合并分支

git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

git branch dev
git checkout dev

git branch命令查看当前分支
切换到master主分支,再用merage合并dev分支

git checkout master
git merge dev

合并完成即可删除dev分支

 git branch -d dev

另一种切换并创建分支的写法(容易见名知意)没有-c就是单纯的切换

git switch -c dev

解决合并冲突

新建分支feature1 对一个地方进行修改并commit,切换为主分支master,再对同一个地方进行修改commit,因此,产生了不在同一条时间线的分支了,合并的时候就可能会冲突。
在这里插入图片描述
冲突的时候,用git merage feature1会有冲突的提示信息
git status也可以告诉我们冲突的文件
怎么解决?
直接打开提示的冲突文件,会有如下的分别对应冲突文件哪些地方冲突的内容信息,两个分支的冲突内容

<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

修改为如下信息:

Creating a new branch is quick and simple.

然后再add这个文件到暂存区,以及commit到仓库,现在本质上已经指向了同一个地方了,就可以合并了
在这里插入图片描述
git log --graph --pretty=oneline --abbrev-commit

分支管理策略

合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

git merge --no-ff -m "merge with no-ff" dev

–no-ff参数,表示禁用Fast forward
然后可以用git log --graph --pretty=oneline --abbrev-commit看分支历史

  • master分支是非常稳定,仅用来发布新版本,平时不能在上面干活;
  • dev分支不稳定,到某个时候,比如1.0版本发布时,再把dev分支合并到master上发布
  • 每个人都有自己的分支,比如Tom,Bob之类的,时不时往dev分支合并
    在这里插入图片描述

BUG分支

如果遇到BUG,你需要修改,但是当前状态还不想提交,可以用git stash把当前工作现场储藏起来,后续可以恢复。

git stash
Saved working directory and index state WIP on dev: f52c633 add merge

首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支

git checkout -b issue-101

修改完bug之后,再commit,之后,会有如下提示信息,切换到master分支合并,以及删除issue-101分支即可

[issue-101 4c805e2] fix bug 101
 1 file changed, 1 insertion(+), 1 deletion(-)

修复完bug之后,再回到dev分支,继续干活,用git status发现当前工作区是干净的,刚才的工作现场需要我们恢复一下,先用git stash list看下,有哪些状态,比如stash@{0}: WIP on dev: f52c633 add merge

git switch dev

两种恢复方式:

  • git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
  • git stash pop,恢复的同时把stash内容也删了:
    可以多次stash,并用,git stash list 查看有哪些工作现场可以恢复,使用如下命令指定恢复哪个工作现场:
git stash apply stash@{0}

Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支
git cherry-pick 4c805e2
提交后提示:

[master 1d4b803] fix bug 101
 1 file changed, 1 insertion(+), 1 deletion(-)

Git自动给dev分支做了一次提交,注意这次提交的commit是1d4b803,它并不同于master的4c805e2,因为这两个commit只是改动相同,但确实是两个不同的commit。用git cherry-pick,我们就不需要在dev分支上手动再把修bug的过程重复一遍。

Feature分支

开发一个新功能,最好新建一个分支;

如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

多人协作

多人协作的工作模式通常是这样:

  • 首先,可以尝试用git push origin 推送自己的修改;
  • 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  • 如果合并有冲突,则解决冲突,并在本地提交;
  • 没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
  • 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to=origin/<branch-name> <branch-name>

git push 远程库 本地分支例如:

git push origin dev

打标签

标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

  • 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
  • 命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
  • 命令git tag可以查看所有标签。

删除标签

  • 命令git push origin 可以推送一个本地标签;
  • 命令git push origin --tags可以推送全部未推送过的本地标签;
  • 命令git tag -d 可以删除一个本地标签;
  • 命令git push origin :refs/tags/可以删除一个远程标签。

资料

git教程
教程


网站公告

今日签到

点亮在社区的每一天
去签到