文章目录

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_rsa
和id_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/可以删除一个远程标签。