admin 管理员组

文章数量: 887021

版本控制

目录

  • 安装Git
  • 创建仓库
    • 初始化一个裸仓库
    • 从中央服务器的数据拉倒本地来
  • git的原理---git的四个区域
  • 实操
    • 用add加到暂存区中
    • 再从暂存区放到本地仓库
    • 通过git log查看提交信息
    • 推送到远端仓库
  • 逆向操作
    • 从暂存区退到工作区
    • 从本地仓库退回
      • reset命令参数说明
  • 整理操作
    • 修改上次的提交
    • 使用git rebase整理多次提交
      • 实例:
    • 解决冲突
      • 实例
  • 补充
  • 创建新分支

安装Git

Git安装连接
无脑下一步即可

创建仓库

安装完成后,在电脑上找一个地方新建文件夹,进入,在当文件夹下,右键->选择"Git Bash Hare"

当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会
使用这些信息,并且它会写入到你的每一次提交中,不可更改:

git config --global user.name “username”
git config --global user.email 1xxxxxx@gmail.com

初始化一个裸仓库

git init --bare

其中–bare就是声明一个裸仓库

请注意,这里"裸"仓库跟普通仓库是不同的,区别在于:
裸仓库一般是是远端或者中央使用,里面是看不到代码的(比如远端仓库被攻击,就算黑客拿到git属于,依然看不到代码),只有一些版本信息
普通仓库类似于本地仓库,里边是有代码的

从中央服务器的数据拉倒本地来

刚刚创建的裸仓库就是一个中央仓库,拉倒本地,执行如下命令,注意,这里命令执行环境是本机,也就是说裸仓和本地都在一台主机上
同样,新建一个文件夹,右键->“Git Bash Here”

git clone F:/All_Code/git-remote repo-a
//克隆  来自xxx/(注意用反斜杠)  repo-a是别名


非本机远端仓库

git clone 用户名@ip:/path/...

git的原理—git的四个区域


Workspace: 工作区,就是你平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。也就是本地仓库
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

实操

在repo-a文件夹(本地仓库)下创建一个.c文件

作为第一次版本

#inlcude <stdio.h>int main()
{return 0;
}

用add加到暂存区中

git add hello.c


可以通过下面命令查看当他文件的状态

git status

再从暂存区放到本地仓库

执行

git commit hello.c -m "first commit"
//""中的内容是提交的说明.可以自定义内容

通过git log查看提交信息

执行

git log


分别说明图中的内容

1.40位的字符串,提交文件的时候,通过哈希算法,生成一个哈希值,用来代表本次提交.
2.HEAD表示当前最新提交的指针,->master代表当前的分支(可以创建多个)
3.用户名,邮箱 : 唯一标识 , 本次是谁提交的
4.日期
5.本次提交的注释,这次做了那些工作...

推送到远端仓库

执行

git push origin master
//origin : 别名
//master : 分支


推送成功,怎么查看呢,由于远程仓库中没有代码文件,这时候,我们可以在创建一个本地仓库,来模拟你的同事,或是其他人访问远程仓库,看看刚刚代码有没有创建成功.
同创建repo-a的步骤,创建一个repo-b

执行

可以看到,hello.c已经成功克隆到repo-b,这也说明repo-a成功push到远端仓库了


逆向操作

以上提交成功,这里都是正向操作,很多时候可能提交错误等等原因,需要逆向操作,比如怎么从暂存区退到工作区,从远程仓库退回来等等,下面看操作

从暂存区退到工作区

创建一个world.c方便演示,代码随便写

先放到暂存区

git add world.c

现在退回去
执行

 git restore -S world.c

这样就退回去了

用git status查看状态

git status

从本地仓库退回

还是,先提交上去

git add world.c
git commit world.c -m "first commit world.c"

好,现在已经提交到本地仓库了
查看一下本地仓库的状态

执行

git reset head~1
//head~1 : 退回1个版本,默认是1 ,可以使用reflog查看差多少版本

成功从本地仓库退回

reset命令参数说明

git reset --mixed head~1  //缺省值,退回到工作区中,依然可以看到上次更改的内容
git reset --soft head~1  //退到暂存区
git reset --hard head~1	 //直接抹除上一次的提交,包括你的更改内容,也会被删掉

整理操作

修改上次的提交

修理操作: 修改上次的注释

git commit --amend

此功能可以用于附加到上一次提交
在上次提交之后更新内容,比如修改内容很少,可以不用新增一次提交记录,执行此命令,可以将更新附加到上一次(只能用于最近的一次提交)


使用git rebase整理多次提交

如果想要整理以前的一些提交可以使用如下命令:

实例:

第一次更改,加了一个wor

#inlcude <stdio.h>int main()
{printf("Hello Wor");return 0;
}

第二次更改,加了一个ld

#inlcude <stdio.h>int main()
{printf("Hello World");return 0;
}

提交到本地仓库并加上注释,如下图,下面我想合并这两个操作

git rebase -i f3ee693
//^:前一个版本, ~:后一个版本
//f3ee693是7位哈希值
//f3ee693表示,整理f3ee693之后的所有版本,但不包括f3ee693

下图可以方便理解此行代码

执行后

讲pick改成s,表示这个提交跟上一个合并

使用:x 保存并退出,关于x和wq的区别,可以百度
这时候会弹出一个新的文本,如下图

如下图,把两行合并成一行,addworld,同样用:x退出

git log查看

合并成功


如果有多个提交,比如pick下有多个s,或是其他更改参数,可以使用如下命令进行继续提交(会自动弹出)

git rebase --continue

解决冲突

通过repo-b模拟你的同事和你共同修改一个world.c文件

实例

下面用repo-b修改

#inlcude <stdio.h>int main()
{printf("Hello world");return 0;
}

添加一行

#inlcude <stdio.h>int main()
{printf("Hello world");printf("I am repo-b");return 0;
}

提交到远端

git add world.c
git commit world.c -m "add I am repo-b"

同时, repo-a也修改一下,保存

#inlcude <stdio.h>int main()
{printf("Hello world");printf("I am repo-a");return 0;
}

提交前,一般都会用pull拉下来(拉下来的内容中有repo-b的修改)新的代码,这时候冲突就产生了

git commit world.c -m "test" //先commit
git pull

如图

产生冲突文件




自己可以权衡删哪个,或者都要,如下

删掉多余部分即可,提交命令如下

git add world.c
git commit  //系统可以识别出你当前是在解决冲突
//执行后会弹出, 用于记录本次更新的注释//提交到远程仓库
git push origin master

完成
在repo-b下,重新git pull下来,可以看到,repo-b中也被修改了.

补充

Angular 团队的规范
message的格式:

 <type>(<scope>): <subject><BLANK LINE> <body> <BLANK LINE> <footer>
Type指:
feat: 新特性
fix: 修改问题
refactor: 代码重构
docs: 文档修改
style: 代码格式修改, 注意不是 css 修改
test: 测试用例修改
chore: 其他修改, 比如构建流程, 依赖管理.

创建新分支

创建一个develop分支

git branch develop

选择分支

git checkout develop

选择一个bug/timer分支,如果不存在就创建,使用-b参数

git checkout -b bug/timer

合并到master
在bug/timer分支下修改一点代码,随便打印一行

#inlcude <stdio.h>int main()
{printf("Hello world");printf("I am repo-a");printf("I am repo-b");printf("我修改了一个timer类型的bug");return 0;
}
git add world.c
git push origin bug/timer  //上传到远端仓库

检查无误后,合并到master

//先切换到master
git checkout master
//合并
git merge bug/timergit push

合并完成,并推送到了远端仓库

本文标签: 版本控制