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

git新建库与本地库同步

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

  1. 新建远程仓库
    git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第1张图片新建远程仓库必须要使用仓库提供的api,也就是仓库门户网站,例如gitee,github,gitlab等。在上图中使用gitee网址中新建了一个test仓库,默认生成一个master分支,新建仓库时里面必须要有文件,这是git得要求。

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

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

  • git config --global user.name "xiaoxu"
  • git config --global user.email [email protected]
  • git init
  • touch README
  • git add .
  • git commit -m "message"
  • git remote add XXX
  • ...

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

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

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

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第2张图片
git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第3张图片在这里插入图片描述
上传步骤就在本地初始化了一个仓库,但是git还未对新建的文件追踪。除了上述初始化外还可以从远程仓库直接克隆到本地git clone xxx

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第4张图片
远程test仓库被克隆下来,包含初始化额文件:
git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第5张图片

上述两种均可创建本地仓库,但是第二种是更方便的,如果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缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第6张图片> git status命令可以看到默认创建的mater分支和缓存区中的new file,当然也显示了git rm --cached命令后续在讲。

git commit命令推送到本地仓库

在这里插入图片描述>本地仓库非常重要,因为线上的仓库内容都来自本地仓库。

推送本地仓库融合到远程仓库git push命令
git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第7张图片然后就出错了,这里可能想到本地库只有README文件,而线上库可不止,而且文件内容也不一样。
git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第8张图片在这里插入图片描述
那么把线上的pull一下merge后再推送呢?然而如下:

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第9张图片
又出现一大堆提示,而且文件也没拉下来,这里既不可以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缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第10张图片可以看到文件下存在一个.git文件表示存在git仓库,并且配置和远程一模一样,文件也都一样。

vi hello
git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第11张图片git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第12张图片
git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第13张图片git add加入git追踪后git commit提交到本地仓库,甚至都不需要git pull一下就能直接git push而且是成功上传。
git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第14张图片git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第15张图片

建议

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

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

|     
|     缓存   =========》   本地仓库    =========》   远程仓库
|

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

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第16张图片甚至都没有git add , git rm , git rebase , git restore 等其它命令。

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

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第17张图片甚至会贴心使用不同的颜色区分,如下main.go

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第18张图片
当点击左下角的always add后就可以使其不再弹出了,但是有遇到一个问题,如果创建的文件不想添加到git追踪中该如何操作呢?

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

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

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

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

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

# 此为注释 – 将被 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已经检测到文件被删除了,如下
git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第19张图片
git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第20张图片
远程仓库的hello文件还存在,如下图:

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第21张图片git commit提交到本地仓库

在这里插入图片描述git push提交到远程仓库
git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第22张图片结果发现main.go成功提交,但是hello任然在远程仓库中,
git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第23张图片说明本地仓库还存在hello文件,本地仓库文件是从缓存区提交的,那么缓存区也还存在,可见直接删除文件并不会销毁git得文件追踪。

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

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

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

如下对比,直接删除

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第25张图片git rm移除缓存区后再次提交,删除过程和记录也被提交,如下:
git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第26张图片
再次推送到远程仓库

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第27张图片
可以看到远程删除过程也同步了,本地仓库的删除merge到远程仓库,hello文件消失

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第28张图片
在提交记录里面查看也记载了hello被删除了

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第29张图片
和本地如初一折

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

git reset命令

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

再次新建hello文件并缓存

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第31张图片
git reset命令取消缓存

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第32张图片
现在测试回溯上一个版本功能,如下查看hello内容为hello
git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第33张图片git add后追加内容,再次git add,如下

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

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

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第35张图片如上图所示重新git add到缓存区,此时修改的部分也添加到缓存区了。git reset一次查看,如下

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)_第36张图片git reset后hello回到了没被git追踪的状态。

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

git restore命令

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

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

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

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

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

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

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

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

你可能感兴趣的:(#,Git,git)