git教程,git学习,git常见报错,一文理解git的原理及学会git的基本操作,git常见踩坑集合,git与github,git的运用,学git,这一篇就够了,git与gitee。必备知识。

git基本原理及推送github基本操作及常见踩坑问题

git什么是git


Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

git的基本原理

我们先来了解一下没有连接远程仓库时,git在本地的工作原理,有以下几个概念:

  • 工作区: 就是你在电脑里能看到的目录。

  • 版本库: 工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

  • 暂存区(缓存区): 英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
    下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

  • 图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。
  • 图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。
  • “HEAD” 实际是指向 master 分支的一个"游标"
  • 可以理解为index就是缓存区,master+HEAD+objects就是本地仓库,可以这么简单理解,如下图:

接下来我们来学习一下本地操作的基本命令,请确保你的电脑上已经下载好git,并能够访问github,如果不能访问github,可以使用gitee或则gitlab代替!

关于git本地仓库的基本命令

  1. git init

git init的作用是在一个工作区的文件夹下初始化本地仓库,执行该命令后会在对应文件夹下生成.git文件夹,里面就是上面讲的版本库的所有内容,如下图所示:

文件中的内容和上面所讲的各个概念是一一对应的,大家可以打开文件夹自行查看里面的内容,目录结构如下图:

  1. git add
git add 的作用是添加文件到缓存区,主要有下面两个参数

git add .会将当前目录下所有修改过的文件和新文件添加到暂存区,但不包括被删除的文件,这是常用的。

git add . 

git add *会将当前目录下所有修改过的文件、新文件以及被删除的文件添加到暂存区。

git add *

实例:以我本机为例子,将hello_world文件夹和Like a star.docx文件拖入test目录下与.git位于同级目录,然后执行 git add .命令和git status命令就是可看到刚才的操作,这两个文件或文件夹已经放入缓存区了,如果要往深了说就是,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。。

  1. git commit -m “本次提交的描述”

git commit也就是提交的意思。提交之后会将你修改到缓存区的内容提交/同步到本地仓库中,也就是master分支中,更底层就是,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。注意:github现在的默认分支是main,-m的意思就是添加提示信息。提交后会看到如下信息,同样可以使用git status查看状态。

  1. 其他命令
git reset HEAD # 暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

git rm --cached <file> # 直接从暂存区删除文件,工作区则不做出改变

git checkout . 或者 git checkout -- <file> # 用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。

git checkout HEAD . 或者 git checkout HEAD <file> # 用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

关于git与远程仓库的基本原理

当涉及到远程仓库时,情况又会复杂一些,因此我们需要了解几个基本的概念:

  • 本地仓库:可以理解我电脑的本地仓库,在没有连接远程分支前,你所有的提交和修改都是在本地仓库
  • 缓存器:概念同上,用于参数缓存本地的修改。
  • 远程仓库:是基于分布式git发展起来的,是存储在网络上的 Git 仓库,GitHub、GitLab 和 Gitee 都是远程仓库托管服务,它们都基于 Git 实现,都是常见的远程仓库。

其实:Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull,后面会详细介绍。

请大家仔细查看这张图,根据操作命令的英文理解git与远程git仓库的基本流程:

说明:
  • workspace:工作区
  • staging area:暂存区/缓存区
  • local repository:版本库或本地仓库
  • remote repository:远程仓库

一个简单的操作实例:

git init 
git add .
git commit
  • git init -初始化仓库
  • git add . -添加文件到暂存区
  • git commit -将暂存区的文件添加到本地仓库

关于git远程仓库的基本命令

  1. git clone

git clone我认为是最好用的一个命令,他的作用是将指定地址的项目拷贝到你的当前文件夹下,这样我们就可以在github上找大佬的项目克隆下来学习了。

git clone 远程仓库的地址

这里我以github为例,选择一个项目连接后,我选择https链接,然后复制链接。注意:不要连校园网,如果使用SSL连接一定不要用校园网。如果开了代理,一定要注意设置git端口和代理端口一致,建议在github上配置key,通过ssh连接,就不会有那么多麻烦事。

关于代理的配置:
# 查看当前git的全局配置
git config --global -l #查看全局配置

# 为Git全局配置HTTP代理 
git config --global http.proxy http://127.0.0.1:代理的端口号
* Git 发出的所有 HTTP 请求(例如克隆存储库或获取更新)都将通过端口 (localhost)上的指定代理服务器进行路由xxx。

# HTTPS请求配置代理
git config --global https.proxy http://127.0.0.1:代理的端口号

# 如果你不再使用代理,可以用取消设置代理配置
git config --global --unset http.proxy

查看当前计算机代理配置的端口可以参考如下图片:

克隆完成后就可以在当前文件夹查看下载的项目:

  1. git remote

这个命令的作用就是操作相关的远程仓库的,remote就是远程的意思,常用的有以下几个:

添加远程版本库:
git remote add <remote_name> <remote_url>
  • <remote_name>:要添加的远程仓库的名称。通常,远程仓库的名称为 origin,但你也可以自定义一个名称。
  • <remote_url>:远程仓库的 URL。它可以是一个指向远程 Git 仓库的 HTTPS、SSH 或 Git 协议链接。
查看当前仓库中配置的远程仓库列表以及它们的 URL:
git remote -v
其他命令:
git remote rm name # 删除远程仓库
git remote rename old_name new_name # 修改仓库名
  1. git push

git push 命令用于从将本地的分支版本上传到远程并合并。
######命令格式如下:

git push <添加的远程主机名> <本地分支名>:<远程分支名>
如果本地分支名与远程分支名相同,则可以省略冒号:
git push <添加的远程主机名> <本地分支名>
实例:

以下命令将本地的 main 分支推送到 origin 主机的 main 分支。

git push origin main
# 这是等价的,因为本地分支和远程分支都叫main
git push origin main:main

# 如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数,force有强力的意思:
git push --force origin main

# 删除主机的分支可以使用 --delete 参数,以下命令表示删除 origin 主机的 master 分支:
git push origin --delete main

我还是以test文件夹为例,在github上,我新建了一个项目,没有添加readme.md文件,现在我使用一些操作命令将我的修改提交到新建的项目上:项目初始如下:

现在我将我本地的test文件夹中的修改提交到远程仓库。

Ps: 尽量在github添加密钥后通过ssh连接,通过https会出出现很多问题,因为有ssl验证

  1. git pull

git pull 命令用于从远程获取代码并合并本地的版本。
git pull 其实就是 git fetchgit merge FETCH_HEAD 的简写

命令格式:
git pull <远程主机名> <远程分支名>:<本地分支名>
# 如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull <远程主机名> <分支名>
实例:
# 将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。
git pull origin master:brantest
# 分支名都是master
git pull origin master
# 添加 --rebase 选项,你告诉 Git 在合并远程更改时使用 rebase 操作,而不是传统的合并操作。这可以帮助你保持一个更加整洁的提交历史。可能会改写提交历史
git pull --rebase test main

我还是以test项目作为演示,我在github的项目中添加一个readme文件,然后同步到本地仓库,这种情况用于第一次提交后,在github对项目进行了修改,下一次在本地又修改后需要提交的情况,这时候就需要先让远程仓库的代码同步到本地仓库,再进行修改提交。

  1. git分支管理:

Git 分支实际上是指向更改快照的指针。
有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系统家族里区分出来。

几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。

使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

有关分支的基础命令
# 从远程仓库 "origin" 中获取最新的提交、分支等信息,但不会自动合并到你的当前工作目录。这里的 [alias] 是指远程仓库的别名
git fetch [alias]

# 将远程仓库alias的branch分支合并到我当前所在的本地分支上
git merge [alias]/[branch]

# git switch,git checkout切换(并创建)分支,-c是-create的简写,-b是-branch的简写。
git checkout branch # 创建分支
git checkout -b branch # 创建并切换到新分支
git checkout - # 快速切换到前一个分支

git switch branch # 创建分支
git switch -c branch # 创建并切换到新分支
git switch - # 快速切换到前一分支

git branch # 显示所有分支并查看当前所在分支

git branch (new_branch_name) # 创建新的分支
git branch -d (branchname) # 删除分支

git merge <branch_name> # 将该分支合并到当前所在的分支上。

分支合并冲突

当两个分支中有相同名字的文件且文件中的内容不同时就会产生冲突,这个时候需要我们手动修改文件的内容,然后git add,git commit重新提交,期间可以通过git diff查看文件状态。

实例:
$ git merge change_site
Auto-merging runoob.php
CONFLICT (content): Merge conflict in runoob.php
Automatic merge failed; fix conflicts and then commit the result.

$ cat runoob.php     # 打开文件,看到冲突内容
<?php
<<<<<<< HEAD
echo 1;
=======
echo 'runoob';
>>>>>>> change_site
?>

我们将前一个分支合并到 master 分支,一个合并冲突就出现了,接下来我们需要手动去修改它。

$ vim runoob.php 
$ cat runoob.php
<?php
echo 1;
echo 'runoob';
?>
$ git diff
diff --cc runoob.php
index ac60739,b63d7d7..0000000
--- a/runoob.php
+++ b/runoob.php
@@@ -1,3 -1,3 +1,4 @@@
  <?php
 +echo 1;
+ echo 'runoob';
  ?>

在 Git 中,我们可以用 git add 要告诉 Git 文件冲突已经解决

$ git status -s
UU runoob.php
$ git add runoob.php
$ git status -s
M  runoob.php
$ git commit
[master 88afe0e] Merge branch 'change_site'

现在我们成功解决了合并中的冲突,并提交了结果。

  1. git标签

当项目达到一个重要阶段时,我们希望永远记住那个特别的提交快照,我们就可以用git tag来给他打标签。标签和软件项目的版本号是一一对应的!

git tag

git tag指令主要有三个,git tag,git tag -a tag_name,git tag tag_name

git tag  # 显示所有的标签
git tag tag_name # 创建一个轻量级标签,也就是不带附注的标签。这种标签只是一个指向特定提交的引用,不包含额外的信息。
git tag -a tag_name #创建一个带有附注的标签。使用 -a 选项可以创建一个带有附注的标签,这意味着你可以添加一些描述性的信息,比如版本发布说明、变更内容等。创建带有附注的标签时,Git 会打开文本编辑器以便你输入标签的信息。
# 创建标签并指定标签信息命令
git tag -a <tagname> -m "runoob.com标签"
git show tag_name # 显示标签的附注信息
git tag -d tag_name # 删除标签

git与github

Git 并不像 SVN 那样有个中心服务器。
目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员能够连接的服务器上。


git与github交互思路就如上方的图所示,我们需要将远程仓库的最新内容通过pull合并到我们本地的分支上,在我们本地进行二次修改后或在本地新增文件后通过push到github上,我们直接通过一个实例来理解!我的目标任务是

  1. 我的本地仓库和github仓库初始文件如下:

  1. 我在github上的dev分支下创建了一个test.c文件,然后又在本地仓库的main分支下创建了一个test_main.c文件,现在我的目标是把远程分支dev中的内容和本地分支dev中的内容和本地main分支中修改的内容合并到main分支,然后提交到github上,我们进行以下操作:
  • 首先,将远程的main分支的最新内容和本地main分支的最新内容同步,注意文件相同名称的内容需要一致,不然会有冲突:
  • 切换到本地的dev分支,从远程仓库的dev分支pull合并内容。
  • 合并本地的main分支和dev分支,如下图:
  • 向远程仓库的main分支push合并后的main本地分支:

一些git会用到的命令

git ls-files # 要查看本地 Git 仓库中的文件目录
git status # 查看仓库当前的状态,显示有变更的文件。
git log # 显示 Git 仓库提交历史
git branch # 显示所有分支并查看当前所在分支
git commit -am:这个命令会将所有已经被 Git 管理的文件(已经被添加到暂存区的文件)的更改一起提交。它会自动将已经被修改的文件添加到暂存区(使用 git add . 的效果),然后进行提交。这个命令适合于你已经对文件做了修改,并且希望一次性将这些修改提交到版本库
git diff:查看显示工作目录中尚未暂存的变更,也就是尚未使用 git add 添加到暂存区的变更。
git diff --stagedgit diff --cached 可以显示已经暂存但尚未提交的变更,也就是暂存区和最后一次提交之间的差异。
git log --oneline # 以列表形式输出提交历史信息

报错解决方案及踩坑合计

  • 第一个大坑,校园网会屏蔽22端口和限制,和使用xshell不能通过校园网连接云服务器一个道理,如果经常出现clone不下来,超时的问题或则无法push的问题,请切换为手机热点,这样能解决99%的问题!
  • 第二个大坑,尽量不要使用https进行clonepush操作,因为有ssl证书校验,就算连上了,每次也需要输入密码,账号登录,我推荐使用密钥进行ssh连接,可以参考这篇文章,2分钟完成Github配置ssh密钥
  • 在开启代理的情况下使用git,注意git的端口要和你代理的端口一下,否则会出现fatal: unable to access ‘https://github.com/xxx/xxx.git/’: Failed to connect to github.com port 443: Timed out错误。解决方案,添加git的代理配置:参考这一篇文章:“git cloen” https连接问题
  • 每个分支每次提交都需要add和commit后才能生效,才能在对应分支下看到对应的文件或文件夹。
  • 当你在github上新建仓库的时候,新加了一个readme文件,这个时候需要将github的远程仓库git pull到本地仓库保持一致后才能git psh,这个时候,可能会报错:To github.com:RunPiBoss/Guitar_Tab.git ! [rejected] main -> main (non-fast-forward) error: failed to push some refs to 'github.com:RunPiBoss/Guitar_Tab.git',就是远程分支中有本地分支中没有的东西,这个时候需要执行git pull 连接名 分支名--allow-unrelated-histories,意思是允许没有历史管理的远程分支拉取合并。

恭喜你,到目前为止你已经掌握了git和github的基本使用了。你可以尝试将自己的项目上传到github进行练习了。🌈

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值