git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)

git新建库与本地库同步

gitee使用教程,git的下载与安装接不在叙述了。

  1. 新建远程仓库 新建远程仓库必须要使用仓库提供的api,也就是仓库门户网站,例如gitee,github,gitlab等。在上图中使用gitee网址中新建了一个test仓库,默认生成一个master分支,新建仓库时里面必须要有文件,这是git得要求。

另外第一次生成时候可能还会出现一个教程,一些配置命令:

git创建一个仓库的初始化操作

  • git config --global user.name "xiaoxu"
  • git config --global user.email xiaoxu@example.com
  • git init
  • touch README
  • git add .
  • git commit -m "message"
  • git remote add XXX
  • ...

git config --list查看更多命令gitee教程

其中实现本地仓库绑定远程仓库同步的就是git remote add了。

初始化本地仓库并绑定远程仓库地址后,就可以实现上传文件并同步文件了:

上传步骤就在本地初始化了一个仓库,但是git还未对新建的文件追踪。除了上述初始化外还可以从远程仓库直接克隆到本地git clone xxx

远程test仓库被克隆下来,包含初始化额文件:

上述两种均可创建本地仓库,但是第二种是更方便的,如果gitee门户网站配置了的话,本地仓库就无需任何配置,但是如果是克隆的别人的仓库,就需要修改配置。

git文件追踪

初始化仓库的两种方式与区别

git init创建完仓库后就需要对文件实现追踪,使用的git命令是git add将需要上传的文件添加到git缓存区,就实现了追踪了。

可以使用git status查看追踪状态,只有被git追踪的文件才会被上传。类似于vsode,idea只是ide,不管如何在其中修改代码,都不会改变git缓存区中的文件,当删除了编辑器的文件,git缓存区任然存在,必须通过其它文件清楚缓存区文件,但是一般情况下类似于idea,goland实现vcs绑定git后都自动绑定了删除命令,无需人为操作。在编辑器中删除某些文件自动同步到git缓存区和本地仓库

在上一节新建仓库后,通过git add命令添加文件到git缓存区实现git链路追踪:

> git status命令可以看到默认创建的mater分支和缓存区中的new file,当然也显示了git rm --cached命令后续在讲。

git commit命令推送到本地仓库

>本地仓库非常重要,因为线上的仓库内容都来自本地仓库。

推送本地仓库融合到远程仓库git push命令 然后就出错了,这里可能想到本地库只有README文件,而线上库可不止,而且文件内容也不一样。 那么把线上的pull一下merge后再推送呢?然而如下:

又出现一大堆提示,而且文件也没拉下来,这里既不可以pull,又不可以push是什么情况呢?

这是由于两个仓库不同源,git的链路追踪是独立的,因此两个不同的git链路追踪不可使用git命令融合,只有同源的链路追踪才可以使用git得命令。

本地仓库和远程仓库有不同的开始点,也就是两个仓库没有共同的commit出现,无法提交,此时我们需要allow-unrelated-histories

显然这才初始化的过程中是不合理的,git官方也提供了响应的更改使得不同源的可以融合,更改命令如下:

git pull origin master --allow-unrelated-histories 通过上面的更改,在git pull一次后,线上被merge到本地仓库中,代码融合,实现了同源。这时再pull就可以了,提交上去的本地仓库也是融合了的。

在克隆时候仓库名会以文件的格式生成,因此直接克隆下来的是一个文件下,对文件的操作需要进入该文件里:

  • cd test

可以看到文件下存在一个.git文件表示存在git仓库,并且配置和远程一模一样,文件也都一样。

vi hello git add加入git追踪后git commit提交到本地仓库,甚至都不需要git pull一下就能直接git push而且是成功上传。

==建议==:

建议都使用git clone命令创建本地仓库,因为是直接把线上克隆下来都是完全一样的,但是克隆别人的仓库需要修改配置可能麻烦点,自己仓库时非常方便的,如下test1文件中就是克隆完成的。

缓存、本地仓库、远程仓库同步问题

diff 复制代码
|     
|     缓存   =========》   本地仓库    =========》   远程仓库
|

首先在使用idea,goland等ide时如果初始化了git仓库并实现了远程仓库连接(同源配置成功)后,用ide打开文件,会自动实现git得绑定,除了git commit,git pull,git push命令外其它都是自动化实现了,无需人为操作,但是是ide在后台执行了命令。如下:

甚至都没有git add , git rm , git rebase , git restore 等其它命令。

git add命令在创建文件时就执行了,如果第一次使用可能会提示一下,有view files, always add , do not ask again的选项,如下:

甚至会贴心使用不同的颜色区分,如下main.go

当点击左下角的always add后就可以使其不再弹出了,但是有遇到一个问题,如果创建的文件不想添加到git追踪中该如何操作呢?

  1. 在这里不总是添加,点击View Files选择添加,使创建文件时手动选择。
  2. 直接关闭弹窗,都不添加,使用git add在terminal指定添加
  3. always add后在缓存中添加但是不上传到本地仓库,同步远程时也自然不会上传到远程。

建议:建议都选always add添加到缓存无所谓的,通过.gitignore文件配置一下不上传到本地仓库就可以了。不限麻烦也可以手动操作。

文件 .gitignore 的格式规范如下:

perl 复制代码
所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
可以使用标准的 glob 模式匹配。
匹配模式最后跟反斜杠(/)说明要忽略的是目录。
要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。

shell 复制代码
# 此为注释 -- 将被 Git 忽略
    # 忽略所有 .a 结尾的文件
    *.a
    # 但 lib.a 除外
    !lib.a
    # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
    /TODO
    # 忽略 build/ 目录下的所有文件
    build/
    # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
    doc/*.txt

ide自动完成了大多是的工作,那么离开ide使用命令该如何处理呢?

git缓存区删除文件并清除文件跟踪

git将git add到缓存区的内容移除使用git rm 。如果直接删除文件不管git追踪会发生什么呢?

如果直接删除可以看到git已经检测到文件被删除了,如下 远程仓库的hello文件还存在,如下图:

git commit提交到本地仓库

git push提交到远程仓库 结果发现main.go成功提交,但是hello任然在远程仓库中, 说明本地仓库还存在hello文件,本地仓库文件是从缓存区提交的,那么缓存区也还存在,可见直接删除文件并不会销毁git得文件追踪。

git rm 命令从缓存区移除指定文件

git rm 就是rm + git reset的合体,本地文件也一起删了,但是git reset只移除git追踪不会删除本地文件

如下对比,直接删除

git rm移除缓存区后再次提交,删除过程和记录也被提交,如下: 再次推送到远程仓库

可以看到远程删除过程也同步了,本地仓库的删除merge到远程仓库,hello文件消失

在提交记录里面查看也记载了hello被删除了

和本地如初一折

==git reset命令==

git reset命令也是可以将暂存区的文件取消暂存另外还可以切换到指定版本,git reset HEAD切换到上一个版本。

再次新建hello文件并缓存

git reset命令取消缓存

现在测试回溯上一个版本功能,如下查看hello内容为hello git add后追加内容,再次git add,如下

git已经检测出来hello文件被修改了modified,但是可以看到modified hello部分是在Changes not staged for commit中的,也就是修改部分还没被git跟踪。

如上图所示重新git add到缓存区,此时修改的部分也添加到缓存区了。git reset一次查看,如下

git reset后hello回到了没被git追踪的状态。

git reset HEAD 是回溯到上一版本。

==git restore==命令

git restore命令是撤销的意思,文件从未被git追踪撤销,回到被追踪的状态,就是说git reset的逆命令,该命令有git restore <file>it restore --staged <file>两种常用的用法。

前者用户撤销未被git追踪切没有在工作区修改的撤销,(撤销修改了的文件不会报错,但没反应)后者撤销被移除git追踪且修改的文件(保留修改)。

没有直接的命令可以操作本地仓库,这是由于本地仓库是远程仓库的一个分支,如果随便修改可能造成无法融合代码,所以对文件的所有修改和变动都记录再缓存中,确定后再将需要融合的代码提交到本地仓库。

例如需要删除一个多余的文件,就需要在缓存区中先删除文件,再提交到本地仓库,git追踪记录删除的过程,提交后git系统自动应用删除记录,从而使本地仓库也同步进行。

案例:commit了words文件,需要删除它,并同步到远程仓库?

  • git rm hello (或者git reset)
  • git commit

上述两部直接同步了,应为缓存区的操作会被记录并在git commit 时自动应用,本地仓库是没有直接命令修改的,开发者对缓存区操作,操作被git系统记录,并在下一次git commit时自动应用。

相关推荐
redreamSo3 小时前
房产票据价值模型:7张票拆解一套房的真正价值,推演未来涨跌
程序员
荔枝吻3 小时前
【保姆级喂饭教程】Windows下安装Git Flow
windows·git·git flow
ai小鬼头6 小时前
AIStarter 3.2.0更新!一键离线导入+高速下载,熊哥教你轻松玩转AI工具
人工智能·程序员·github
云和数据.ChenGuang7 小时前
git中的指令解释
git
Engandend7 小时前
Flutter与iOS混合开发交互
flutter·ios·程序员
码路工人7 小时前
【Markdown-00】前言:为什么是 Markdown?
程序员·markdown·电子书
小Lu的开源日常8 小时前
在 macOS 上设置 SSH 和 Git
git·macos·ssh
eleven_h8 小时前
ERROR: Permission to Splode/pomotroid.git deni
git
浅墨momo9 小时前
将你的Shopify App部署到fly.io上
前端·程序员
WZF-Sang9 小时前
计算机网络基础——1
网络·c++·git·学习·计算机网络·智能路由器