参考学习了廖雪峰的Git教程:简介 - Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)
前情提要
# Git 分布式开发系统
使用c语言开发
支持多种协议,包括http,但ssh协议速度最快
# 集中式vs分布式
集中式(如CVS和SVN),版本库在中央服务器上。易出现版本库损坏,提交文件不完整问题。
分布式(git),版本库在每个成员电脑上。有安全性(不易损坏),不受带宽和网速限制。
# git 安装(windows)
1.直接装直接用
安装之后直接回到电脑桌面右键 选择git bash here(在这里打开git命令行窗口)

2.如果接到vscode内,要进行环境变量的配置
在vscode内使用Git
参考了这个博文:解决问题:电脑已安装了git,vscode识别不到_vscode检测不到git-CSDN博客




(区别于D:\git\Git\mingw64\bin)(是D:/git/Git/bin/git.exe)

点击reload 此时git就连接到vscode了

在vscode中修改代码 然后用内置的git传到本地仓库
修改之后左边会显示changes

在vscode中新建文件

也会显示有修改

点击+ 暂存更改 显示这样

点击提交

弹出文件

此时需要在第一行输入详细信息(你这次修改的标题就行了!)
Update index_test.html and add index_test.js
点击文件排列右边的 √commit
提交成功之后,左边会变成推送pull


下面这个直接关掉弹窗就好

完成

在vscode使用git命令行
直接输入bash.exe的路径即可

查看简单的日志
git log --graph --pretty=oneline --abbrev-commit

对git的跟踪


# 名词解析
工作区(working directory)(即项目目录)
版本库/本地仓库(repository)(即项目目录的.git文件)
暂存区(index或者stage)(index 是一个文件(通常位于 .git/index)记录了当前工作目录中所有被跟踪文件的快照)
(stage通常指的是将更改添加到暂存区的过程)
分支(branch;master:主分支)
HEAD:是指向当前分支的指针
远程仓库(Remote Repository):托管在服务器上的版本库
# 符号解析
单个短横线 -:用于指定命令行选项。例如:git add -A(添加所有更改)
双横线 --:
主要用于两种情况:
①明确区分选项和随后的参数,特别是当参数可能与选项混淆时。例如,使用 -- 来区分选项和文件名:git checkout -- filename
这里 -- 告诉 Git,接下来的 filename 不是一个分支名或引用,而是一个文件名,即使它与某个分支名相同。
②用于长选项,这些选项通常是单词或更长的短语,例如:git push --force
这里 --force 是一个长选项,表示强制推送更改。
组合使用 - 和 --:
在某些情况下,Git 命令允许使用单个短横线来代替双横线后的长选项。例如,git push --force 可以简写为 git push -f。但是,使用 -- 可以提高命令的可读性,尤其是在复杂的命令行中。
本地库的git操作
# 每台机器用git之前都要先配置名字、邮箱(global参数:在这台机器上所有的git仓库都使用该配置)
git config --global user.name "YourName"
git config --global user.email "email@example.com"

![]()
# 创建本地仓库(创建版本库)
//新建文件夹作为项目文件目录
mkdir learngit
//转到文件夹目录
cd learngit
//查看当前目录,确定是不是在目标目录
pwd
//把这个文件目录变成Git可以管理的仓库(建好之后多一个.git文件)
git init
//查看文件(连带隐藏文件都显示)
ls -ah

# add、commit、push、pull、check在版本库的目录下进行项目的git操作
//在项目目录中对文件进行增删改以及修改权限等操作后

//要把对这个文件的操作提交到暂存区
git add readme.txt
//才能把暂存区的更改记录作为一个新的提交,commit到本地仓库(添加时,commit message的部分作为commit这个动作的标题或者说明)
git commit -m "commit message"

//如果想修正上一次的提交信息(--amend 只能用于修正当前HEAD指针所指向的最近一次提交)(amend:修正;修改)
//输入git commit --amend打开文本框
//1.删除或注释掉现有的提交信息 add index.js,可以将其替换为 # add index.js,这样 Git 就不会使用它作为提交信息
//2.在文件的第一行,输入你想要作为提交信息的新标题
git commit --amend -m "commit message2"
git push
第一次会弹出以下窗口



登陆之后点击绿色按钮
回到命令窗口发现提交成功

刷新一下github页面

提交成功
在GitHub上修改代码


点击commit change之后填写修改信息 再点击commit change
回到之前页面发现已经修改成功


拉取(pull)github修改好的代码
回到git命令窗口
git pull

刷新vscode页面
可以看见已经更新!

checkout找回工作区误删文件(从本地仓库检出)


假装误删了index.js文件
git命令窗口输入
git checkout index.js

此时查看vscode编辑器
找回index.js文件了

# 查看仓库状态
git status
//查看具体的修改内容(difference)
git diff readme.txt
//查看commit提交的历史记录(显示由近及远的commit日志)
git log
//查看历史记录简洁版
//--pretty:一个选项,用来指定输出格式。--pretty 选项允许自定义如何显示提交信息。
//oneline:--pretty 选项的一个值,它告诉 Git 将每个提交显示在单独的一行上。格式:<commit hash> <commit message> id+提交标题信息
git log --pretty=oneline
//查看近5次提交
git log --pretty=oneline -5
# 回退上一个版本(将当前分支的HEAD指针重置到上一个提交commit)
//git reset:这是Git中的一个命令,用于重置当前HEAD指针到指定的状态。
//--hard:这个选项告诉Git重置暂存区(index)和工作目录(working directory),使得它们与HEAD指向的提交状态完全一致。
git reset --hard HEAD^
//回退到上n个版本
git reset --hard HEAD~n
//回退到指定版本号(版本号不用写全,git自动补齐)
//先查看提交记录log
git log --pretty=oneline
git reset --hard 版本号
//或者如果把窗口关掉了,找不到log,可以查看命令历史记录(reflog 记录了仓库中所有引用的变动历史。reflog:reference log,引用日志。
git reflog

# 查看文件内容
//cat:concatenate
cat readme.txt
//查找文件中带有关键词的行
cat readme.txt | grep "关键词"

# 查看某文件在工作区和版本库里最新版本的区别(常用于检查是否提交成功)
git diff --cached readme.txt
//如果发现确实有忘记的修改,就可以继续git add 文件名再git commit -m "message"


# add或者commit错误的修正处理
准备提交前(add后),发现add错了。处理方式:

//1.删掉再add新的
git reset HEAD readme.txt
//取消暂存区的所有修改
git reset --hard HEAD^

//2.把文件恢复(回退)到上一个状态(上一个commit或者add的状态)
git checkout -- readme.txt
//注意!如果这里没有“--”,会变成切换到某某分支
//3.把暂存区的add撤销掉,再把工作区的撤掉
//先回退版本(HEAD默认最新版本的commit)
git reset HEAD readme.txt
//把暂存区的修改回退到工作区
git checkout -- readme.txt
已经提交了(commit后),发现add错了。处理方式:
//回退版本(前一个版本)
git reset --HEAD^
//或者先查看提交记录log,再按照版本号回退
git log --pretty=oneline
git reset --HEAD 版本号
//或者直接撤销提交(它会创建一个新的提交来逆向之前的提交)
git revert
把文件的修改add到暂存区了,但是在工作区删掉了文件。处理方式分两种情况讨论:
//1.确实要删掉该文件(注意:手动删除之后使用git rm和git add的效果是一样的)
git rm test.txt
git commit -m "remote test.txt"
//2.删错了文件,要找回(使用版本库的版本替换工作区的版本,checkout只能“还原”到最新版本)
git checkout -- test.txt
远程库与本地库连接
# SSH密钥(secure shell:一种加密的网络协议)配置步骤:
//1.在本地生成SSH密钥对(在cmd命令行操作)
ssh-keygen -t ed25519 -C "your_email@example.com"
//此命令会在/.ssh目录下创建两个文件,分别是私钥(id_ed25519)和公钥(id_ed25519.pub)
//2.把SSH公钥复制到github远程仓库(new ssh key)
# 已有仓库,要关联另一个仓库(两种情况)
# 已有本地仓库,要关联(remote)远程库



ssh:https://github.com/choeyyy/lucky.git
git remote add origin https://github.com/choeyyy/lucky.git
//再把本地仓库的内容推送(push)到远程库(第一次提交需要输入"-u",-u这个选项是 --set-upstream-to 的简写形式。)
//命令做了两件事1.将本地的 master 分支推送到远程仓库,并创建(如果不存在)或更新(如果已存在)远程的 master 分支。2.设置远程的 master 分支作为本地 master 分支的上游分支。
git push -u origin master
//之后的提交
git push origin master
//查看远程库
git remote -v
# 已有远程库,要克隆(clone)到本地仓库
git clone git@github.com:用户名/项目名.git
或者
git clone '在github上的仓库地址'

因为什么文件都没有 所以这里会出现警告
这时候文件已经下载到桌面上了

# 慎用!删除远程库(删除本地对远程仓库的引用)
git remote rm origin

分支
# 在没创建其他分支的情况下,HEAD指针指向当前分支(默认是master主分支),而默认的master分支自动指向最新的commit提交版本
# 有关在新的分支的操作
//查看分支
git branch
//新建并切换分支
git checkout -b dev
//或者这样新建并切换分支
git switch -c dev
//或者分两步:新建+切换分支
git branch dev
git checkout dev
//或者可以这样切换
git switch dev
# 在新分支下提交修改
//建议先查看当前分支(打*号的)
git branch
//在新分支中操作
git add readme.txt
git commit -m "message"
//回到主分支master
git switch master
//合并(merge)分支
git merge dev

//合并完之后可以删除分支
git branch -d dev
# 解决两个分支的merge合并冲突
//情况说明:当两个分支都对同一部分代码进行了更改,并且这些更改不兼容时,Git 无法自动合并这些更改,从而导致合并冲突。这通常发生在以下情况:
//1.两个开发者在不同的分支上修改了相同的代码行。(比如switch到dev上对文件.txt进行修改+add+commit;再切换到master,同样对文件.txt进行不同的修改+add+commit;在两个分支都有新提交commit的情况下,进行merge合并分支会出现冲突conflict。)
//2.一个开发者在分支上删除了文件,而另一个开发者修改了该文件。
//解决步骤:
//查看文件.txt内容(git会把文件冲突的地方标记出来
<<<<<<< HEAD
// 在当前分支上的更改
=======
// 尝试合并的分支上的更改
>>>>>>> branchB)
cat 文件.txt
//进行文本编辑之后(比如nano path/to/your/file.txt打开编辑),再添加到暂存区
git add 文件.txt
//提交修改,此时这个commit合并了两个分支的修改
git commit -m "提交信息"
//选做内容:
//选做:可以删除之前的分支
git branch -d dev
//注意:合并分支时,git使用了fast forward的形式,此时删除分支会丢分支信息。
//想要在分支历史上保留分支信息且删掉分支,要切换到--no-off的形式。
git merge --no-ff -m "分支信息" dev
//此时git log --graph可以见到分支合并图还有记录
//查看分支图
--graph:这个选项以ASCII图形的方式展示分支和合并的历史,使能直观地看到分支结构。
--pretty=oneline:这个选项使每个提交显示在单独的一行上,并且只显示提交的简短信息。
--abbrev:这个选项使输出的提交id哈希值缩短为7个字符,而不是完整的40个字符。
--commit:这个选项强制git log显示所有匹配的提交,即使它们没有出现在任何分支或标签上。
git log --graph --pretty=oneline --abbrev --all

//选做:可以把当前分支推送到远程仓库
git push origin dev
# 在当前分支的工作没做完,被要求去另一个分支工作(比如修复bug)。使用stash(储藏)可以在不同分支或任务之间快速切换,同时保留不想立即提交的更改。(这两个分支最好不要同时修改同一个文件)

//在当前分支输入
git stash
//转到master 新建分支来修复bug
git switch master
//新建分支devbug(或者git checkout -b devbug)
git switch -c devbug
//改+add+commit,把bug修好之后,回到master,合并+删除分支
git switch master
git merge --no-ff -m "合并信息" devbug
//切回dev干活
git switch dev
//查看工作现场
git stash list
//恢复工作现场,3个处理方法:
//1.恢复+删除stash(可删可不删)
git stash apply//把stash里面的保存的工作状态应用到当前的工作目录
git stash drop//默认删除最近保存的stash
//2.恢复同时删除(pop,弹出。弹出" stash 中的更改到工作目录)
git stash pop
//3.恢复指定的stash
git stash list//先查看stash的索引
git stash apply stash@{0}//或者直接或 git stash pop stash@{索引}
git stash drop stash@{0}//删除指定stash
//再看stash,看不见内容了
git stash list

//如果之前在另一个分支进行修改,此时的当前分支是没有应用到那次修改的
//要把那个不同的提交复制到当前分支
//先查看分支,确定是在当前分支
git branch
//再找那次修改的commit id
git log --oneline
或者git reflog
//从主分支复制特定提交到当前分支
git cherry-pick 提交id
//此时,git自动给当前分支进行了提交(且是新的commit),故不用在当前分支上再commit
# 强制删除没有被合并的分支
git branch -D dev
# 推送分支到远程仓库
git push origin dev
# 创建远程origin的分支到本地
git checkout -b dev origin/dev
# 将本地分支上的文件修改推送到远程仓库步骤
git checkout dev
修改文件
git add readme.md
git commit -m "修改信息"
这是远程仓库的dev分支存在的情况:
git push origin dev
如果不存在,输入这个:
git push --set-upstream origin dev
//意为创建远程的 dev 分支+设置本地 dev 分支跟踪远程的 dev 分支
# 解决冲突:同在dev的两个机器同时push,上传对同一个文件的不同修改
//1.先拉取远程库的最新提交
git pull
//若失败,有可能是因为本地dev和远程dev没有连接,要输入:
git branch --set-upstream dev origin/dev
//2.再在本地操作
//查看文件.txt内容(git会把文件冲突的地方标记出来
<<<<<<< HEAD
// 在当前分支上的更改
=======
// 尝试合并的分支上的更改
>>>>>>> branchB)
cat 文件.txt
//进行文本编辑之后(比如nano path/to/your/file.txt打开编辑),再添加到暂存区
git add 文件.txt


//提交修改,此时这个commit合并了两个分支的修改
git commit -m "解决冲突"
//3.把更改推送到远程仓库
git push origin dev
# 把本地没有被push的分支提交历史整理成直线(变基)(多人在同一个分支上协作时,很容易出现冲突。)
//查看分支图
git log --graph
//变基
git rebase
//再查看分支图
git log --graph
tag标签
# 标签(tag):版本库的快照(和指针差不多,指向某次commit;但和分支不同,分支可以活动,tag不可以)
//创建tag
//1.切换到要打标签的分支上
git branch//查看
git switch dev
//2.创建标签tag,3种方式
//①给最新的commit创建标签
git tag v1.0//会默认把tag打在最新的commit上
git tag//查看标签(是按照字母排序的)
//②给指定的commit创建标签
git log --pretty=oneline --abbrev -commit//先查看commit的id
git tag v2.0 目标commit的id
git tag//查看标签
//③创建带有说明的标签tag(-a指定tag名字,-m指定标签内容)
git log//先查看commit的id
git tag -a v3.0 -m "version3.0" 目标commit的id
git tag//查看标签



# 查看tag标签信息
//查看标签(是按照字母排序的)
git tag
//查看指定标签具体信息
git show v2.0

# 删除标签
//删除本地标签
git tag -d v1.0
//记得删除远程标签
git push origin :refs/tags/v1.0
//完事之后去github看看
# 推送标签
//推送指定标签
git push origin v1.0
//推送全部标签
git push origin --tags
其他(待补充)
# 不正常关闭git窗口,可能第二次打开会被锁文件
//删除锁文件
rm .git/index.lock
写在后面
*文章提到的两个博文教程:
廖雪峰的Git教程:简介 - Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)
在vscode内使用Git
解决问题:电脑已安装了git,vscode识别不到_vscode检测不到git-CSDN博客
*用vscode顺手记的,格式可能辣眼。
*不一定对,写来仅用于纪念爱过的日子。




504

被折叠的 条评论
为什么被折叠?



