这篇文章将会 介绍基本的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
2
git config user.name 'username' #设置用户名
git config user.email 'email@example.com' #设置邮箱

设置用户名与邮箱不用于身份验证,仅用于标注每一次提交的用户是谁, 建议与远程仓库的邮箱一致.(远程仓库的概念将会在下文介绍)

创建一个仓库 (git init)

我们可以使用以下命令, 来初始化(创建)一个仓库.

1
git init

在创建完毕之后 会提示 Initialized empty Git repository in XXX 且会在当前目录下创建一个名为 .git 的文件夹.

绑定远程仓库 (git remote)

通常情况下 我们会将本地仓库与远程仓库绑定,用于多人协作或备份.
常见的有Githubgitee.
当然你也可以使用Giteagitlab来搭建自己私有的Git平台.

我们可以使用多种协议来绑定远程仓库(一般建议使用ssh协议):

1
2
3
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 来迅速创建一个密钥:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 xcsoft@xcsoftsMBP
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中:
add new ssh key

在导入公钥后 我们可以编辑~/.ssh/config(不存在则创建)来制定私钥对应的服务器:

1
2
3
4
Host ssh.github.com                #别名 
HostName ssh.github.com #服务器地址 以Github为例
User git #用户名 指定为git
IdentityFile ~/.ssh/Github_rsa #私钥位置

在创建完该文件后, 可以尝试使用命令 ssh -T ssh.github.com来测试是否配置正确.

git remote 相关命令

1
2
3
git remote add [名称] [远程仓库地址] #用于添加远程仓库
git remote remove [名称] #用于移除远程仓库
git remote rename [旧名称] [新名称] #用于重命名远程仓库

Git 三大分区

Git 一般分为三大区域, 即 工作区 暂存区 版本库 这部分可能对于新手较难理解

来自CSDN 用户 GabrielPanda

工作区 (Working Directory)

工作区是直接编辑的地方,肉眼可见,直接操作。

暂存区(Stage 或 Index)

数据暂时存放的区域. git add操作会将 工作区的改动提交至这里

版本库(commit History)

存放已经提交的数据. git push操作,就是把这个区的数据 push 到远程仓库。

通常下使用Git的流程

  • 通常情况下, 我们在 工作区编辑完文件后,使用以下命令先将文件提交至暂存区
1
2
3
git add <文件>   # 添加指定文件到暂存区
git add <目录> # 添加指定目录下所有文件 到 暂存区
git add . # 添加当前目录下所有文件 到 暂存区
  • 当你在工作区删除了文件时, 突然发现暂存区这个文件还在? 这个时候 可以使用:
1
2
3
4
git rm <文件>      # 从 暂存区和工作区 删除文件
git rm -r <目录> # 从 暂存区和工作区 删除目录
git rm -rf <目录> # 从 暂存区和工作区 强制删除目录
# 注意 如果你只想从暂存区删除文件 可以添加参数`--cached`
  • 最后, 将所有文件 从暂存区推送至 版本库
1
git commit -m "提交说明" # 将文件从暂存区提交至 版本库
  • 如果你觉得这一次的操作 与上一次的操作相关,可以将本次修改推送至上一次的提交
1
git commit -m "提交说明" --amend
  • 提交完成之后 如果绑定了远程仓库 可以使用
1
git push <远程仓库名称> <本地分支名称>:<远程分支名称> # 来推送到远程仓库

标签

tag指定了某一次的commit id用于标注,给某次提交加上一个标签
使用以下命令创建一个标签

1
2
3
git tag <标签名称> -m '标签说明' # 创建一个标签

git push <远程仓库> --tags # 将本地标签推送至远程仓库

远程操作

git fetch 常用于更新远程仓库信息

1
2
git fetch <远程仓库名称>              # 拉取所有分支
git fetch <远程仓库名称> <远程分支名称> # 拉取指定分支

git pull 常用于拉取远程仓库并合并

1
2
git fetch <远程仓库名称> <远程分支名称>:<本地分支名称> # 拉取指定分支与本地指定分支合并
git fetch <远程仓库名称> <远程分支名称> # 拉取指定分支与 当前 分支合并

git push 用于 提交版本库至远程仓库

1
2
3
git push <远程仓库名称> <本地分支名称>:<远程分支名称> # 推送到远程仓库

git push <远程仓库名称> :<远程分支名称> # 删除远程仓库指定分支
  • 扩展: git pull 相当于 git fetch + git merge

分支操作

分支可以说是 Git 的精髓 , 很多操作会围绕分支展开 , 对于刚接触Git的用户 可能会难以理解分支操作

git checkout

git checkout 相关命令常用于管理分支

1
2
3
4
git checkout -b <分支名称> # 用于新建分支 并切换到该分支
git checkout <分支名称> # 用于切换分支
git checkout <commit id> # 用于切换到指定的commit id (commit id是使用git后每次提交产生的唯一id)
git checkout tags/<tag> # 用于切换到指定tag

git checkout 还可以用于从暂存区恢复文件, 或从指定记录/分支恢复文件

1
2
3
git checkout -- <文件路径/名称>             #从暂存区恢复文件
git checkout <分支名称> -- <文件路径/名称> #从指定分支恢复文件
git checkout <commit id> -- <文件路径/名称> #从指定commit ID恢复文件

git branch

git branch 相关命令 常用于分支操作(与git checkout配合)

1
2
3
4
5
6
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分支

我们使用以下命令来合并分支

1
2
git merge <分支名称>  # 将指定分支 合并到 当前分支 并自动生成提交记录
git merge --no-commit <分支名称> # 将指定分支 合并到 当前分支 但不生成提交记录

比较差异

常使用 git diff 相关命令比较差异

1
2
3
4
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 函数, 小明先将该记录提交至了你们的远程仓库, 这个时候, 你再次提交时 便会发现提交失败(当然你可以强制提交,但不建议)
    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
2
3
4
5
6
7
8
9
10
<?php
<<<<<HEAD
function A () {
echo 'a';
}
=====
function A () {
echo 'b';
}
<<<<<< xxxxxxx
  • 在修改完毕后, 留下认为较优或混合:
    1
    2
    3
    4
    <?php
    function A () {
    echo 'a';
    }
    最后 提交你的修改, 并push到远程仓库

参考

Git三大分区的概念

阮一峰 Git 教程