简单使用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你是谁):
git config user.name 'username' #设置用户名
git config user.email '[email protected]' #设置邮箱
设置用户名与邮箱不用于身份验证,仅用于标注每一次提交的用户是谁, 建议与远程仓库的邮箱一致.(远程仓库的概念将会在下文介绍)
创建一个仓库 (git init)
我们可以使用以下命令, 来初始化(创建)一个仓库.
git init
在创建完毕之后 会提示 Initialized empty Git repository in XXX
且会在当前目录下创建一个名为 .git 的文件夹.
绑定远程仓库 (git remote)
通常情况下 我们会将本地仓库与远程仓库绑定,用于多人协作或备份.
常见的有Github、gitee.
当然你也可以使用Gitea、gitlab来搭建自己私有的Git平台.
我们可以使用多种协议来绑定远程仓库(一般建议使用ssh协议):
git remote add [名称] ssh://host/username/repo #使用ssh协议
# 或
git remote add [名称] http(s)://url/username/repo #使用http协议
需要注意: 如果使用ssh协议 需要生成ssh密钥 而 使用 http协议 需要输入用户名与密码来推送与拉取
ssh 密钥 相关知识
使用ssh密钥 需要了解基本的 Linux知识
密钥一般用于 免密登录服务器 或 使用Git 等场景
我们使用命令 ssh-keygen
来迅速创建一个密钥:
➜ test git:(master) ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/xcsoft/.ssh/id_rsa): ./Github_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ./Github_rsa
Your public key has been saved in ./Github_rsa.pub
The key fingerprint is:
SHA256:zxEvUsUTTLN/6EXJDHw7RFfTzqcBxNxPurT5ll2/ppI [email protected]
The key's randomart image is:
+---[RSA 3072]----+
| BB+.o=|
| .B+=o*|
| o .ooXo|
| . o .+==|
| S o ..o*=|
| + o .=o.|
| o . ..=|
| E o=|
| ..oo.|
+----[SHA256]-----+
Enter file in which to save the key (xxx)
这里指定了生成文件的目录与名称 比如我这里就将文件保存在了 当前目录下 命名为 Github_rsa
这里的passphrase
可以指定该密钥的密码 当然也可以留空,
在创建完密钥后 你可以在你指定的文件夹里找到两个文件,一个为私钥文件,一个为公钥文件(后缀为.pub)
我们可以将公钥内容完整复制到Github后台的Add new SSH key
中:
在导入公钥后 我们可以编辑~/.ssh/config
(不存在则创建)来制定私钥对应的服务器:
Host ssh.github.com #别名
HostName ssh.github.com #服务器地址 以Github为例
User git #用户名 指定为git
IdentityFile ~/.ssh/Github_rsa #私钥位置
在创建完该文件后, 可以尝试使用命令 ssh -T ssh.github.com
来测试是否配置正确.
git remote 相关命令
git remote add [名称] [远程仓库地址] #用于添加远程仓库
git remote remove [名称] #用于移除远程仓库
git remote rename [旧名称] [新名称] #用于重命名远程仓库
Git 三大分区
Git 一般分为三大区域, 即
工作区
暂存区
版本库
这部分可能对于新手较难理解
工作区 (Working Directory)
工作区是直接编辑的地方,肉眼可见,直接操作。
暂存区(Stage 或 Index)
数据暂时存放的区域. git add
操作会将 工作区的改动提交至这里
版本库(commit History)
存放已经提交的数据. git push
操作,就是把这个区的数据 push 到远程仓库。
通常下使用Git的流程
- 通常情况下, 我们在 工作区编辑完文件后,使用以下命令先将文件提交至暂存区
git add <文件> # 添加指定文件到暂存区
git add <目录> # 添加指定目录下所有文件 到 暂存区
git add . # 添加当前目录下所有文件 到 暂存区
- 当你在工作区删除了文件时, 突然发现暂存区这个文件还在? 这个时候 可以使用:
git rm <文件> # 从 暂存区和工作区 删除文件
git rm -r <目录> # 从 暂存区和工作区 删除目录
git rm -rf <目录> # 从 暂存区和工作区 强制删除目录
# 注意 如果你只想从暂存区删除文件 可以添加参数`--cached`
- 最后, 将所有文件 从暂存区推送至 版本库
git commit -m "提交说明" # 将文件从暂存区提交至 版本库
- 如果你觉得这一次的操作 与上一次的操作相关,可以将本次修改推送至上一次的提交
git commit -m "提交说明" --amend
- 提交完成之后 如果绑定了远程仓库 可以使用
git push <远程仓库名称> <本地分支名称>:<远程分支名称> # 来推送到远程仓库
标签
tag指定了某一次的commit id用于标注,给某次提交加上一个标签
使用以下命令创建一个标签
git tag <标签名称> -m '标签说明' # 创建一个标签
git push <远程仓库> --tags # 将本地标签推送至远程仓库
远程操作
git fetch 常用于更新远程仓库信息
git fetch <远程仓库名称> # 拉取所有分支
git fetch <远程仓库名称> <远程分支名称> # 拉取指定分支
git pull 常用于拉取远程仓库并合并
git fetch <远程仓库名称> <远程分支名称>:<本地分支名称> # 拉取指定分支与本地指定分支合并
git fetch <远程仓库名称> <远程分支名称> # 拉取指定分支与 当前 分支合并
git push 用于 提交版本库至远程仓库
git push <远程仓库名称> <本地分支名称>:<远程分支名称> # 推送到远程仓库
git push <远程仓库名称> :<远程分支名称> # 删除远程仓库指定分支
- 扩展:
git pull
相当于git fetch
+git merge
分支操作
分支可以说是 Git 的精髓 , 很多操作会围绕分支展开 , 对于刚接触Git的用户 可能会难以理解分支操作
git checkout
git checkout 相关命令常用于管理分支
git checkout -b <分支名称> # 用于新建分支 并切换到该分支
git checkout <分支名称> # 用于切换分支
git checkout <commit id> # 用于切换到指定的commit id (commit id是使用git后每次提交产生的唯一id)
git checkout tags/<tag> # 用于切换到指定tag
git checkout 还可以用于从暂存区恢复文件, 或从指定记录/分支恢复文件
git checkout -- <文件路径/名称> #从暂存区恢复文件
git checkout <分支名称> -- <文件路径/名称> #从指定分支恢复文件
git checkout <commit id> -- <文件路径/名称> #从指定commit ID恢复文件
git branch
git branch 相关命令 常用于分支操作(与git checkout配合)
git branch <分支名称> # 用于新建分支
git branch -d <分支名称> # 用于删除分支
git branch -D <分支名称> # 用于强制删除分支
git branch -m <旧分支名称> <新分支名称> # 重命名分支
git branch -a # 查看本地所有分支
git branch -r # 查看远程所有分支
git merge
git merge 常用与合并分支
- 我们想象一个场景, 当我们在写一个项目时(通常为dev分支), 遇到某个Bug, 可以创建一个
bugFix
分支, 来修复这个bug而不影响当前分支, 在修复完毕后, 将bugFix
分支合并到dev
分支
我们使用以下命令来合并分支
git merge <分支名称> # 将指定分支 合并到 当前分支 并自动生成提交记录
git merge --no-commit <分支名称> # 将指定分支 合并到 当前分支 但不生成提交记录
比较差异
常使用 git diff 相关命令比较差异
git diff <文件> # 比较当前文件和暂存区文件差异 git diff
git diff <commit id1> <commit id2> # 比较两次提交之间的差异
git diff <分支1> <分支2> # 比较两个分支的差异
git diff --cached # 比较暂存区和版本库差异
冲突解决
在以上分支操作中, 可能不完全一帆风顺, 往往会遇到许多冲突
- 我们假设一个场景, 你完成了dev分支中index.php的 A 函数, 而你的协作者
小明
也修改了dev分支中index.php的 A 函数, 小明先将该记录提交至了你们的远程仓库, 这个时候, 你再次提交时 便会发现提交失败(当然你可以强制提交,但不建议)
git pull <远程仓库> <远程分支> # 更新远程分支到本地 并 尝试合并
接下来 会提示 存在冲突的文件
...
Auto-merging index.php
CONFLICT (content): Merge conflict in index.php
Automatic merge failed; fix conflicts and then commit the result.
这个时候你需要手动解决 冲突, 打开冲突文件, 会找到冲突标记 如:
<?php
<<<<<HEAD
function A () {
echo 'a';
}
=====
function A () {
echo 'b';
}
<<<<<< xxxxxxx
- 在修改完毕后, 留下认为较优或混合:
<?php
function A () {
echo 'a';
}
最后 提交你的修改, 并push到远程仓库
参考
版权属于:XCSOFT
本文链接:https://blog.xsot.cn/archives/git.html
本博客所有原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明原文链接。