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
查看
Git的目录结构
- Git分为工作目录,缓存区(暂存区),本地仓库,远程仓库
Git本地操作流程
-
创建文件
touch git_test.txt
-
把创建的文件添加到缓存区,
git add git_test.txt
,如果有多个文件,可以使用git add .
代表所有的文件,如果已经使用git add
添加到暂存区,之后后悔了,可以使用git reset HEAD <filename>
取消,也可以使用git reset HEAD
,这个是整体回到上一次操作 -
把缓存区的文件添加到本地仓库
git commit -m "创建了一个新的文件git_text.txt"
-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录
其他常见的Git命令
git status
-->让我们掌握仓库当前的状态,如创建的新文件未添加到缓存区,添加到了缓存区未提交到本地仓库
git diff < file >
-->查看文件当前的改动,如我新加了一行hello git
git restore <filename>
如果我不想要保存我刚刚新添加的hello git
,可以用这个放弃修改,注意的是,这个只能撤销工作区的修改,如果提交到了暂存区,不能用这个
git checkout -- <filename>
也是撤销修改,作用和上一条一样
git reset --hard HEAD^
-->返回上次提交的版本,没啥好说的,注意的是的提交到了本地仓库才算一个版本
git reset --hard < commit id >
-->返回你想返回的文件版本
git log --pretty=oneline
-->查看commit id
git reflog
-->用来记录每一次的命令
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添加远程仓库
-
创建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
是公钥,可以放心地告诉任何人。 -
使本地仓库和远程库关联起来:
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