Git语句学习

参考学习了廖雪峰的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顺手记的,格式可能辣眼。

        *不一定对,写来仅用于纪念爱过的日子。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值