git中关于工作区,暂存区,本地仓库,远程仓库的一些问题

原理


参考阮一峰的博客:常用 Git 命令清单
git中关于工作区,暂存区,本地仓库,远程仓库的一些问题

  • workspace: 直接写好的代码,以文件形式存在硬盘上的,其实就是保存在workspace工作区;
  • index/stage: git add之后会存入stage/index暂存区
  • repository: git commit之后会存入repository本地仓库;
  • remote: git push 之后会存入remote远程仓库.

如果还是不太明白,可以继续参考:


git中关于工作区,暂存区,本地仓库,远程仓库的一些问题

git中关于工作区,暂存区,本地仓库,远程仓库的一些问题



1. gitignore并从远程git中删除要忽略的目录

参考:idea创建.gitignore并从远程git中删除要忽略的目录(如.idea)

问题描述:

  • remote的git中内容:
    git中关于工作区,暂存区,本地仓库,远程仓库的一些问题
  • .gitignore中的内容:
    d2l_zh_jupyter/self_exercise/.ipynb_checkpoints/
    
  • 本地git仓库的内容:
    git中关于工作区,暂存区,本地仓库,远程仓库的一些问题

可以看到,

  • 虽然我的.gitignore文件中包含了这个文件夹,但是remote的git仓库还是有这个文件夹,没有删除。但是其文件内容确实和本地不同。
  • 这是因为我是上传过一段时间之后,才创建的.gitignore文件,所以有些问题。
# 停止追踪指定文件,但该文件会保留在工作区(如果是文件夹,需要迭代移除,需要加上参数-r)
git rm --cached -r d2l_zh_jupyter/self_exercise/.ipynb_checkpoints/
git add .gitignore
git commit -m "gitignore提交删除ipynb_checkpoints" 
git push origin master

执行以上操作,虽然workspace工作区中文件仍然存在,但是不会追踪(忽略),则上传之后,remote端的文件夹也会消失


2. 上传超过100MB的文件报错

git中关于工作区,暂存区,本地仓库,远程仓库的一些问题
参考:处理GitHub不允许上传大于100M文件问题

github上传文件时,超过50M会警告,超过100M直接拒绝

如果依然想要上传这个大文件,可以参考:git large file storage,这是git官方为了大文件专门另外搞得一个工具


3. Your branch is ahead of ‘origin/master’ by N commits

参考:git large file storage,由于存在那个大文件,所以需要从上次commit中删除那个大文件,才可以继续执行push

# 先把那个不合规的文件 从暂存区里删除
 git rm --cached /Users/Dora/Desktop/XXX/XXX/my.txt
# 执行完这步后,这个大文件将会从你的commit记录里移除,然后就可以git push把本地代码push到github上了
 git commit --amend -CHEAD

BUT。。。由于我在上传的过程中因为没有按照正常方式操作,所以显示了有两个没有完成的commits,可以使用git status和git log来查看上传的分支情况等

$ git status
On branch main
Your branch is ahead of 'origin/main' by 2 commits.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   .gitignore

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        "4. \351\253\230\347\255\211\346\225\260\345\255\246 \347\254\2547\347\211\210 \344\270\213\345\206\214 \345\220\214\346\265\216\345\244\247\345\255\246.pdf"

no changes added to commit (use "git add" and/or "git commit -a")

参考:

结合这部分图理解。
git中关于工作区,暂存区,本地仓库,远程仓库的一些问题

  • workspace: 直接写好的代码,以文件形式存在硬盘上的,其实就是保存在workspace工作区;
  • index/stage: git add之后会存入stage/index暂存区
  • repository: git commit之后会存入repository本地仓库;
  • remote: git push 之后会存入remote远程仓库.

简单来说,出现这个提示信息是因为你对本地的master(仓库)做了一些改变,但是没有把它传到远端。根据自己远端和本地仓库的情况选择不同的处理方式:

  1. 在一个良好的工作流中,远端仓库的master副本应该是完好的,本地存放的master应该只是远端的一个副本(远端和本地仓库内容应该一样。。。),在这种工作流中不会出现这种提示。
  2. 如果是另一种工作流,本地发生了改变,那就直接git push origin(假设origin是你的远端)
  3. 如果本地的改变是错误的,那就移除,同时重置本地的master到和远程一致的状态,使用git reset --hard origin/master

以我的repo为例,在本地git仓库中运行:

$ git log
commit e7dad275beef801b602655f60fba68451ae03f05 (HEAD -> main)
Author: huangs <XXX@XXXX.com>
Date:   Sun Jan 2 11:10:15 2022 +0800
    首次上传
commit 88e010f7784bdce51e049de44ee34a60db306794
Author: huangs <XXX@XXX.com>
Date:   Sun Jan 2 00:23:41 2022 +0800
    首次上传
# 这个是从github上clone的时候带的。(是github上创建项目的时候,因为加入了README和.gitignore文件所以填写的)
commit 247a7060f4f2a0b209d2deba07411b36adf5035e (origin/main, origin/HEAD)
Author: CastleDream <35064479+CastleDream@users.noreply.github.com>
Date:   Sat Jan 1 16:05:03 2022 +0800
    Initial commit

$ git branch -v
* main e7dad27 [ahead 2] 首次上传

可以看到,原始的远端的内容其实是:origin/HEAD,所以我使用的命令应该是

!!!!!!!
注意,执行这个命令之后,在这个节点之后改变的内容都会消失!(就像系统镜像一样)

$ git reset --hard origin/HEAD
HEAD is now at 247a706 Initial commit

如果发现自己需要的文件没有备份,可以恢复到最新的一次commit的内容
下面的e7dad27来自git logcommit e7dad275beef801b602655f60fba68451ae03f05(一般前7位数就可以了)

$ git reset --hard e7dad27
Updating files: 100% (17/17), done.
HEAD is now at e7dad27 首次上传

然后就会恢复了。参考:撤销 git reset --hard HEAD~1


但是目前看到,似乎如果不希望git status中再出现这个Your branch is ahead of 'origin/master' by 3 commits,好像只能reset到原始状态

$ git reset --hard origin/HEAD
HEAD is now at 247a706 Initial commit
$ git status
On branch main
Your branch is up to date with 'origin/main'.

所以只能先自己备份修改过的东西,然后重置,确认status没问题之后,再把备份中的内容copy过来。重新上传。

上一篇:一篇文章说明白Git使用规范,收藏慢慢看


下一篇:机器人系统仿真——URDF语法详解之join