简单使用Git管理项目
这篇文章将会 介绍基本的Git使用 与 远程仓库操作
何为Git
Git是一个优秀的分布式版本控制软件,他可以协助你完成项目开发。
Git可以用于合作开发,且易于合并/比较多人的开发进度。
Git与Svn的区别
Git与Svn都是版本管理控制软件, 相比于Svn,Git是分布式存储的, 更加安全。
Git是按照元数据方式存储,而Svn按照文件。
Git的分支控制有益,这一点比Svn要好很多。
开始使用Git
一般情况下Linux系统都会自带Git,当然你也可以使用Linux自带的apt或yum一键安装,而Windows可能需要自行安装,您可以访问Git官网下载安装: https://git-scm.com/downloads. 本篇文章将会主要一Linux为主进行介绍, Windows基本一致(仅目录习惯可能存在差异)
在下载完毕之后我们可以使用一下命令来设置您的个人信息(告诉Git你是谁):
1 | git config user.name 'username' #设置用户名 |
设置用户名与邮箱不用于身份验证,仅用于标注每一次提交的用户是谁, 建议与远程仓库的邮箱一致.(远程仓库的概念将会在下文介绍)
创建一个仓库 (git init)
我们可以使用以下命令, 来初始化(创建)一个仓库.
1 | git init |
在创建完毕之后 会提示 Initialized empty Git repository in XXX
且会在当前目录下创建一个名为 .git 的文件夹.
绑定远程仓库 (git remote)
通常情况下 我们会将本地仓库与远程仓库绑定,用于多人协作或备份.
常见的有Github、gitee.
当然你也可以使用Gitea、gitlab来搭建自己私有的Git平台.
我们可以使用多种协议来绑定远程仓库(一般建议使用ssh协议):
1 | git remote add [名称] ssh://host/username/repo #使用ssh协议 |
需要注意: 如果使用ssh协议 需要生成ssh密钥 而 使用 http协议 需要输入用户名与密码来推送与拉取
ssh 密钥 相关知识
使用ssh密钥 需要了解基本的 Linux知识
密钥一般用于 免密登录服务器 或 使用Git 等场景
我们使用命令 ssh-keygen
来迅速创建一个密钥:
1 | ➜ test git:(master) ssh-keygen |
Enter file in which to save the key (xxx)
这里指定了生成文件的目录与名称 比如我这里就将文件保存在了 当前目录下 命名为 Github_rsa
这里的passphrase
可以指定该密钥的密码 当然也可以留空,
在创建完密钥后 你可以在你指定的文件夹里找到两个文件,一个为私钥文件,一个为公钥文件(后缀为.pub)
我们可以将公钥内容完整复制到Github后台的Add new SSH key
中:
在导入公钥后 我们可以编辑~/.ssh/config
(不存在则创建)来制定私钥对应的服务器:
1 | Host ssh.github.com #别名 |
在创建完该文件后, 可以尝试使用命令 ssh -T ssh.github.com
来测试是否配置正确.
git remote 相关命令
1 | git remote add [名称] [远程仓库地址] #用于添加远程仓库 |
Git 三大分区
Git 一般分为三大区域, 即
工作区
暂存区
版本库
这部分可能对于新手较难理解
工作区 (Working Directory)
工作区是直接编辑的地方,肉眼可见,直接操作。
暂存区(Stage 或 Index)
数据暂时存放的区域. git add
操作会将 工作区的改动提交至这里
版本库(commit History)
存放已经提交的数据. git push
操作,就是把这个区的数据 push 到远程仓库。
通常下使用Git的流程
- 通常情况下, 我们在 工作区编辑完文件后,使用以下命令先将文件提交至暂存区
1 | git add <文件> # 添加指定文件到暂存区 |
- 当你在工作区删除了文件时, 突然发现暂存区这个文件还在? 这个时候 可以使用:
1 | git rm <文件> # 从 暂存区和工作区 删除文件 |
- 最后, 将所有文件 从暂存区推送至 版本库
1 | git commit -m "提交说明" # 将文件从暂存区提交至 版本库 |
- 如果你觉得这一次的操作 与上一次的操作相关,可以将本次修改推送至上一次的提交
1 | git commit -m "提交说明" --amend |
- 提交完成之后 如果绑定了远程仓库 可以使用
1 | git push <远程仓库名称> <本地分支名称>:<远程分支名称> # 来推送到远程仓库 |
标签
tag指定了某一次的commit id用于标注,给某次提交加上一个标签
使用以下命令创建一个标签
1 | git tag <标签名称> -m '标签说明' # 创建一个标签 |
远程操作
git fetch 常用于更新远程仓库信息
1 | git fetch <远程仓库名称> # 拉取所有分支 |
git pull 常用于拉取远程仓库并合并
1 | git fetch <远程仓库名称> <远程分支名称>:<本地分支名称> # 拉取指定分支与本地指定分支合并 |
git push 用于 提交版本库至远程仓库
1 | git push <远程仓库名称> <本地分支名称>:<远程分支名称> # 推送到远程仓库 |
- 扩展:
git pull
相当于git fetch
+git merge
分支操作
分支可以说是 Git 的精髓 , 很多操作会围绕分支展开 , 对于刚接触Git的用户 可能会难以理解分支操作
git checkout
git checkout 相关命令常用于管理分支
1 | git checkout -b <分支名称> # 用于新建分支 并切换到该分支 |
git checkout 还可以用于从暂存区恢复文件, 或从指定记录/分支恢复文件
1 | git checkout -- <文件路径/名称> #从暂存区恢复文件 |
git branch
git branch 相关命令 常用于分支操作(与git checkout配合)
1 | git branch <分支名称> # 用于新建分支 |
git merge
git merge 常用与合并分支
- 我们想象一个场景, 当我们在写一个项目时(通常为dev分支), 遇到某个Bug, 可以创建一个
bugFix
分支, 来修复这个bug而不影响当前分支, 在修复完毕后, 将bugFix
分支合并到dev
分支
我们使用以下命令来合并分支
1 | git merge <分支名称> # 将指定分支 合并到 当前分支 并自动生成提交记录 |
比较差异
常使用 git diff 相关命令比较差异
1 | git diff <文件> # 比较当前文件和暂存区文件差异 git diff |
冲突解决
在以上分支操作中, 可能不完全一帆风顺, 往往会遇到许多冲突
- 我们假设一个场景, 你完成了dev分支中index.php的 A 函数, 而你的协作者
小明
也修改了dev分支中index.php的 A 函数, 小明先将该记录提交至了你们的远程仓库, 这个时候, 你再次提交时 便会发现提交失败(当然你可以强制提交,但不建议)接下来 会提示 存在冲突的文件1
git pull <远程仓库> <远程分支> # 更新远程分支到本地 并 尝试合并
1
2
3
4...
Auto-merging index.php
CONFLICT (content): Merge conflict in index.php
Automatic merge failed; fix conflicts and then commit the result.
这个时候你需要手动解决 冲突, 打开冲突文件, 会找到冲突标记 如:
1 |
|
- 在修改完毕后, 留下认为较优或混合: 最后 提交你的修改, 并push到远程仓库
1
2
3
4
function A () {
echo 'a';
}