Git

什么是Git

Git是用C语言开发的分布式版本控制系统,所谓版本控制系统,就是可以储存一个文件在不同时间的版本,记录每次文件的改动,可以根据需要,随时切换到之前的版本(比如在编写Word文档的过程中,能记录下你每一次保存下来的记录,如果你对于现在的修改不满意,就可以回退到之前保存的版本)。

分布式vs集中式

中央服务器 是否需要联网 安全性
集中式 需要 需要
分布式 不需要 不需要

Git安装

Linux安装
sudo apt-get install git

windows下通过Git官网下载即可

Macos下可以通过HomeBrew安装(前提安装HomeBrew)
brew install git

安装完成后,需要配置用户和邮箱,就可以愉快的使用Git了
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
这个配置的是全局用户名和邮箱,当然还可以针对当个仓库配置用户名和邮箱
git config user.name "gitlab’s Name"
git config user.email "gitlab@xx.com"

配置完成可以用git ocnfig --list查看

远程仓库一般支持两种协议:SSH和HTTPS,SSH协议只认机器,HTTPS协议只认账号;也即为:如果使用SSH操作远程仓库的话,我们需要使用公钥和私钥对来做权限的认证,如果使用HTTPS操作远程仓库,则需要使用账号密码来做权限的认证。无论是公钥私钥对,还是账号密码,都只做权限的认证;但是远程仓库里需要记录这些提交记录是由谁来完成的;所以我们需要给本地的git设置用户名和邮箱,用于从本地仓库向远程仓库提交记录时,在远程仓库记录下这些操作是由谁来完成的。

为什么需要配置用户名和端口?
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址(名字和邮箱都不会进行验证),这样远程仓库才知道哪次提交是由谁完成的。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。

配置的用户名和邮箱对push代码到远程仓库有什么影响?

首先,配置的用户名和邮箱对push代码到远程仓库时的身份验证没有作用,即不用他们进行身份验证;他们仅仅会出现在远程仓库的commits里。

其次,按正常操作来说,你应该配置你的真实用户名和邮箱,这样一来在远程仓库的commits里可以看到哪个操作是你所为。

最后,这个用户名和邮箱是可以随便配置的(不提倡),如果你配置的邮箱是github里真实存在的邮箱,则commits里显示的是这个邮箱对应的账号;如果配置的邮箱是一个在github里不存在的邮箱,则commits里显示的是你配置的用户名。

Git初始化

使用命令git init初始化(建议创建空目录初始化,当然非空项目也可以),初始化完成之后,会有一个 .git 的文件夹,该文件是一个隐藏文件,可通过ls -a查看
image

Git的目录结构

image

  • Git分为工作目录,缓存区(暂存区),本地仓库,远程仓库

Git本地操作流程

  1. 创建文件 touch git_test.txt

  2. 把创建的文件添加到缓存区,git add git_test.txt,如果有多个文件,可以使用git add .代表所有的文件,如果已经使用git add添加到暂存区,之后后悔了,可以使用git reset HEAD <filename>取消,也可以使用git reset HEAD,这个是整体回到上一次操作

  3. 把缓存区的文件添加到本地仓库 git commit -m "创建了一个新的文件git_text.txt" -m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录

其他常见的Git命令

git status-->让我们掌握仓库当前的状态,如创建的新文件未添加到缓存区,添加到了缓存区未提交到本地仓库image

image

git diff < file >-->查看文件当前的改动,如我新加了一行hello git
image

git restore <filename>如果我不想要保存我刚刚新添加的hello git,可以用这个放弃修改,注意的是,这个只能撤销工作区的修改,如果提交到了暂存区,不能用这个
image

git checkout -- <filename> 也是撤销修改,作用和上一条一样

git reset --hard HEAD^-->返回上次提交的版本,没啥好说的,注意的是的提交到了本地仓库才算一个版本

git reset --hard < commit id >-->返回你想返回的文件版本

git log --pretty=oneline-->查看commit id
image

git reflog -->用来记录每一次的命令
image

git diff HEAD -- <file>可以查看工作区和版本库里最新版本的区别

git checkout -- file 可以把工作区的修改全部撤销掉:
两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
git reset HEAD file可以把暂存区的修改撤销掉,重新放到工作区中。HEAD表示最新版本

rm file将工作区文件删掉 #仅删除工作区
git rm file 从版本库将文件删掉,并且需要git commit   #删除工作区,并删除版本库
若是误删,用git checkout -- file将文件恢复到最新版。仅对rm有效
删除文件之后,如果用 rm删除,需要git add .,git commit -m "删除文件xxx",如果用git rm filename删除,只需要git commit -m "删除文件xxx"就可以了

Git添加远程仓库

  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_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

  2. 使本地仓库和远程库关联起来:
    git remote add origin git@github.com:githubxxx/xxxx.git
    Origin 是远程库的名字,可以改成别的。 改名命令:git remote rename origin xx

第一次把本地库的所有内容推送到远程库上时的操作:
git push -u origin master
此后每次提交使用:git push origin master

已有远程库,使用命令克隆一个本地库:
git clone git@github.com:xxx/xxxxx.git

分支管理

创建分支:git checkout -b dev (dev为分支的名字,你可以随便起)

git checkout -b dev 表示创建并切换--->相当于--->git branch dev && git checkout dev两条命令

git switch -c dev--->也可以用来创建并切换新的分支

git branch--->可以用来查看当前分支

删除分支:
git branch -d dev

合并分支:合并某分支到当前分支:
git merge < file >

解决冲突:
当主分支和次分支都修改了部分内容,此时将无法快速合并这时可以直接查看,并将冲突修改后方可合并
git log --graph --pretty=oneline --abbrev-commit--->将提交版本整理成图形

分支管理策略:
git merge file 是一种fast forward合并,这种合并看不出来曾经做过合并

git merge --no-ff -m " xxxx" + dev 是一种普通的合并,能看出合并历史。

bug分支:
git stash 将手头进行的工作现场储存下来,之后就可以放心的去修bug了

修bug时,要首先跳到bug所在分支,并在那个分支上创建一个分支用来修bug,修完之后将其合并。

返回原来干活的分支,git stash list查看存放的工作现场。
git stash apply恢复,但stash内容不删除。
git stash drop来删除
git stash pop 在恢复的同时也将stash内容删除了
若存放了多个现场,用git stash apply stash@{0}来指定恢复

若主分支和次分支同时存在相同的bug,那么可用git cherry-pick (序列号)来复制这个bug的修改

feature 分支

开发一个新的feature,最好新建一个分支;如果要丢弃一个没有被合并过的分支可以通过git branch -D file 强行删除
多人协作

git remote查看远程库信息,git remote -v来显示更详细的信息;

推送分支git push origin master推送主分支

git push origin dev推其他分支

git clone 只能克隆master分支,要想把其他分支也整到本地则需git checkout -b dev origin/dev

git pull用来抓取,若git pull 失败请仔细看git给的提示
git branch --set-upstream (branch-name) origin/(branch name)建立关联

rebase
git rebase branch-name操作可以把本地未push的分支提交历史整理成直线

rebase的目的是是我们在 查看历史提交的变化时更容易

标签管理

打标签
git tag <name>就可以打一个标签
git tag name commit-id-->对特定的提交打标
git tag 查看标签
git show name查看标签信息
git tag -a name -m "xxxx" commit-id创建带有说明的标签

删除标签
git tag -d name 这能删除本地标签
git push origin :refs/tags/tag-name

推送标签
git push origin <tag-name>
一次性推送所有标签:git push origin --tags

posted @ 2022-08-08 17:12  森森成长日记  阅读(124)  评论(0编辑  收藏  举报