git新建库与本地库同步
gitee使用教程,git的下载与安装接不在叙述了。
- 新建远程仓库
新建远程仓库必须要使用仓库提供的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文件中就是克隆完成的。
缓存、本地仓库、远程仓库同步问题
|
| 缓存 =========》 本地仓库 =========》 远程仓库
|
首先在使用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追踪中该如何操作呢?
- 在这里不总是添加,点击View Files选择添加,使创建文件时手动选择。
- 直接关闭弹窗,都不添加,使用git add在terminal指定添加
- 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.txtdoc/*.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
时自动应用。