这篇文章将会 介绍基本的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)

通常情况下 我们会将本地仓库与远程仓库绑定,用于多人协作或备份.
常见的有Githubgitee.
当然你也可以使用Giteagitlab来搭建自己私有的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中:
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 一般分为三大区域, 即 工作区 暂存区 版本库 这部分可能对于新手较难理解

来自CSDN 用户 GabrielPanda

工作区 (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到远程仓库

参考

Git三大分区的概念

阮一峰 Git 教程

Last modification:September 17th, 2021 at 03:56 pm
If you think my article is useful to you, please feel free to appreciate