原理
参考阮一峰的博客:常用 Git 命令清单
- workspace: 直接写好的代码,以文件形式存在硬盘上的,其实就是保存在
workspace工作区
; - index/stage: git add之后会存入
stage/index暂存区
; - repository: git commit之后会存入
repository本地仓库
; - remote: git push 之后会存入
remote远程仓库
.
如果还是不太明白,可以继续参考:
1. gitignore并从远程git中删除要忽略的目录
参考:idea创建.gitignore并从远程git中删除要忽略的目录(如.idea)
问题描述:
- remote的git中内容:
- .gitignore中的内容:
d2l_zh_jupyter/self_exercise/.ipynb_checkpoints/
- 本地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的文件报错
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")
参考:
- *的回答——Your branch is ahead of ‘origin/master’ by 3 commits
- 解决Your branch is ahead of ‘origin/master’ by N commits问题
- 【git 使用】【git常见错误处理一】状态不一致:Your branch is ahead of ‘origin/master’ by 2 commits
结合这部分图理解。
- workspace: 直接写好的代码,以文件形式存在硬盘上的,其实就是保存在
workspace工作区
; - index/stage: git add之后会存入
stage/index暂存区
; - repository: git commit之后会存入
repository本地仓库
; - remote: git push 之后会存入
remote远程仓库
.
简单来说,出现这个提示信息是因为你对本地的master(仓库)做了一些改变,但是没有把它传到远端。根据自己远端和本地仓库的情况选择不同的处理方式:
- 在一个良好的工作流中,远端仓库的master副本应该是完好的,本地存放的master应该只是远端的一个副本(远端和本地仓库内容应该一样。。。),在这种工作流中不会出现这种提示。
- 如果是另一种工作流,本地发生了改变,那就直接
git push origin
(假设origin是你的远端) - 如果本地的改变是错误的,那就移除,同时重置本地的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 log
的commit 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过来。重新上传。