Git教程

工作流程

简图

解释

  • workspace:

工作区,程序员进行开发改动的地方,是你当前看到的,也是最新的。

平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作

实际中就是.git文件夹所在的那个大文件夹

  • index:暂存区

.git目录下的index文件, 暂存区会记录git add添加文件的相关信息(文件名、大小、timestamp…),不保存文件实体, 通过id指向每个文件实体。可以使用git status查看暂存区的状态。暂存区标记了你当前工作区中,哪些内容是被git管理的。

当你完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过git add先提交到暂存区,被git管理。

  • repository:本地仓库

保存了对象被提交 过的各个版本,比起工作区和暂存区的内容,它要更旧一些。

git commit后同步index的目录树到本地仓库,方便从下一步通过git push同步本地仓库与远程仓库的同步。

在实际上其实就是.git文件夹,其中有stage(暂存区),master(Git自动创建的第一个分支),HEAD(指向master的一个指针)等

  • remote:远程仓库

远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。

小结

任何对象都是在工作区中诞生和被修改;

任何修改都是从进入index区才开始被版本控制;

只有把修改提交到本地仓库,该修改才能在仓库中留下痕迹;

与协作者分享本地的修改,可以把它们push到远程仓库来共享。

安装

安装好git后设置本机全局用户名和邮箱:

git config –gobal user.name “XX”
git config –gobal user.email “xx”

本地操作

创建仓库

相关命令:

cd XX:进入某文件夹

mkdir XX:新建文件夹

pwd :显示当前目录

git init:把当下目录变成git可以管理的仓库

修改和上传文件

git add XXX:将XXX添加到暂存区里面去

git commit -m”XX”:将暂存区里的文件上传到仓库里面,并写注释XX

git status:检查状态,看是否有文件没有提交

显示:nothing to commit, working tree clean,则没有要提交的文件

显示:Changes not staged for commit,则有要提交的修改过后的文件

git diff XX.x:在XX.x文件被修改后但没有add到仓库里时可以用此命令来看XX.x文件的修改情况

文件版本回退,撤销修改,删除文件

git log:查看历次commit到仓库的情况和记录

cat XX.XX:查看XX.XX文件

git reflog 得到历次修改的版本号和注释(这就体现了写注释的重要性)

git reset –hard 版本号:将文件恢复到版本号所指的文件情况下

git reset –hard HEAD~X:将文件退回到前X个版本

git checkout –XX.xx:撤销XX.xx文件在工作区所做的修改, 让其回到和暂存区一样的状态

rm X.x:将X.x文件从文件目录(工作区)中删掉

远端操作

基础设置

SSH加密设置

在用户主目录下找到.ssh文件夹

如果没有id_rsa(私匙,不可泄露),id_rsa.pub(公匙)两个文件则输入命令:

ssh-keygen -t rsa –C “youremail@example.com

来生成密匙

与github连接

打开settings中的SSH Keys界面,将公匙文件中的文字复制到Key框中,单击AddKey即可

在github上创建仓库

点击新建仓库按钮后填写仓库名字

点击创建

上传操作

git remote add origin +地址:创建本地仓库和存储库的链接

git remote rm origin:删除远程地址(上传文件时运行add origin命令是如果报错说已经存在远端则就用这个命令给他把远端删除,再add origin并进行第一次推送)

git push -u origin master :第一次将本地的内容推送到远程

git push origin master:第二次及以后的推送

克隆操作

git clone + 地址:从…地址处克隆仓库放在当前文件夹下

分支操作

创建和合并分支

刚刚开始时候的分支是master(其实github好像是main分支,但为了统一,不妨就设为master吧)

git checkout -b Name 创建名称为Name的分支并切换到 Name分支

这条命令相当于如下两条命令:

git branch dev:新建名称为dev的分支

git checkout dev:转移到名称为dev的分支

git branch:查看当前的分支情况

git merge XX:将XX分支合并到当前分支上

git branch -d name:删除名称为name的分支

如果分支和master发生冲突,则需要改成一样的才能够合并

分支管理策略

一般搞一个非常稳定的分支master,然后搞一个分支dev,在dev里面工作好后再合并到master分支上,不能够再master分支上工作

合并分支的不同模式

Fast-forward模式:很快,但会丢掉分支信息

禁用Faster-forward模式合并name分支:

git merge -no-ff -m “注释” name

多人合作

查看远端情况

git remote 查看远端情况

git remote -v 查看远端详细情况

推送分支

git push origin XX:推送到XX分支上

一般只推送主分支master

如果两个人推送同一个文件的不同版本,那么就会出现矛盾,这时考虑把第一个推送上去的人的文件抓取过来然后把两个文件改到一样就行

抓取分支

git clone命令把远程的要开发的分支分到本地来

git pull:把最新的提交从当前所在分支抓下来

其他操作

git config –global http.sslVerify “false”:解除ssl验证

git credential-manager uninstall + git credential-manager install:删除用户名,从而可以重新输入密码

git config –global –unset https.proxy:取消https代理

git config –global –unset http.proxy:取消http代理