github 推送的常见问题以及解决
文章目录
- git add 的时候
- 问题1
- 为什么会发生这种情况?
- Git 的警告含义
- 如何解决?
- 1. **保持 Git 的默认行为(推荐)**
- 2. **禁用自动转换**
- 3. **仅在工作目录中禁用转换**
- 4. **统一使用 LF(跨平台开发推荐)**
- git pull 的时候
- 问题1 允许合并不相关
- 如何解决?
- 1. 允许合并不相关的历史
- 2. 解决冲突(如果有)
- 3. 完成合并
- 注意事项
- 示例
- 问题2 合并填写信息
- 为什么会发生这种情况?
- 你看到的内容
- 如何操作?
- 如果你不想输入提交信息
- 示例
- 总结
- 问题3 文件太大
git add 的时候
问题1
- 问题1:
12786@GWJ MINGW64 /d/BERT_Forest/ET-BERT-Forest (master)
$ git add .
warning: in the working copy of 'ET-BERT/datasets/CSTNET-TLS 1.3/packet/nolabel_test_dataset.tsv', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'ET-BERT/datasets/CSTNET-TLS 1.3/packet/test_dataset.tsv', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'ET-BERT/datasets/CSTNET-TLS 1.3/packet/valid_dataset.tsv', LF will be replaced by CRLF the next time Git touches it
这个警告是因为 Git 检测到你在 Windows 系统上操作文件,而这些文件的行尾符(line endings)是 LF(Line Feed,Unix 风格),但 Git 会自动将它们转换为 CRLF(Carriage Return + Line Feed,Windows 风格)。这是 Git 的默认行为,目的是确保文件在不同操作系统之间的一致性。
为什么会发生这种情况?
- LF 是 Unix/Linux/macOS 系统的行尾符。
- CRLF 是 Windows 系统的行尾符。
- Git 默认会在 Windows 上将 LF 转换为 CRLF,以确保文件在 Windows 上正常显示。
Git 的警告含义
- Git 提示你,下次它处理这些文件时(例如提交、检出或合并),会将文件中的 LF 替换为 CRLF。
- 这个行为是由 Git 的
core.autocrlf
配置控制的。
如何解决?
根据你的需求,你可以选择以下几种方式来处理这个问题:
1. 保持 Git 的默认行为(推荐)
- 如果你主要在 Windows 上开发,并且希望文件在 Windows 上使用 CRLF,可以保持 Git 的默认行为。
- 这个警告只是一个提示,不会影响文件内容或功能。
- 如果你不介意这个警告,可以忽略它。
2. 禁用自动转换
- 如果你希望保留文件的原始行尾符(LF),可以禁用 Git 的自动转换功能。
- 运行以下命令:
git config --global core.autocrlf false
- 这样 Git 就不会自动转换行尾符,文件将保持 LF 格式。
3. 仅在工作目录中禁用转换
- 如果你只想在当前仓库中禁用转换,可以运行:
git config core.autocrlf false
4. 统一使用 LF(跨平台开发推荐)
- 如果你在跨平台开发(例如 Windows 和 Linux),建议统一使用 LF 作为行尾符。
- 你可以运行以下命令:
git config --global core.autocrlf input
- 这样在提交时,Git 会将 CRLF 转换为 LF;在检出时,不会进行任何转换。
git pull 的时候
问题1 允许合并不相关
12786@GWJ MINGW64 /d/BERT_Forest/ET-BERT-Forest (master)
$ git pull origin main
Enter passphrase for key '/c/Users/12786/.ssh/id_rsa':
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 12 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (12/12), 3.60 KiB | 64.00 KiB/s, done.
From github.com:suooous/BERT-Forest
* branch main -> FETCH_HEAD
* [new branch] main -> origin/main
fatal: refusing to merge unrelated histories
这个错误是因为 Git 检测到你尝试合并的两个分支(当前分支和 origin/main
)具有不相关的历史(unrelated histories)。这种情况通常发生在以下场景中:
-
本地仓库和远程仓库是完全独立的:
- 例如,你在本地初始化了一个新的 Git 仓库,而远程仓库是从另一个地方克隆的,或者远程仓库是一个全新的仓库。
-
远程仓库的历史被重写了:
- 例如,远程仓库的历史被强制推送(
git push --force
)过,导致本地和远程的历史不一致。
- 例如,远程仓库的历史被强制推送(
-
本地仓库和远程仓库的初始提交不同:
- 如果两个仓库的初始提交(root commit)不同,Git 会认为它们的历史是不相关的。
如何解决?
如果你确定需要合并这两个不相关的历史,可以使用 --allow-unrelated-histories
选项来强制合并。以下是具体步骤:
1. 允许合并不相关的历史
运行以下命令:
git pull origin main --allow-unrelated-histories
2. 解决冲突(如果有)
- 如果合并过程中出现冲突,Git 会提示你哪些文件有冲突。
- 你需要手动解决这些冲突,然后标记冲突已解决:
git add <冲突的文件>
也可以通过 git add . 确认全部的文件
3. 完成合并
- 解决冲突后,运行以下命令完成合并:
git commit -m "提交说明"
注意事项
-
备份你的工作:
- 在合并不相关的历史之前,建议备份当前的工作目录或创建一个新的分支,以防止数据丢失。
-
确保你真的需要合并不相关的历史:
- 如果本地仓库和远程仓库是完全独立的项目,合并它们可能会导致混乱。
- 如果你只是想将远程仓库的内容拉取到本地,可以考虑以下方法之一:
- 方法 1:将远程仓库的内容拉取到一个新的分支:
git checkout -b new-branch git pull origin main
- 方法 2:将远程仓库的内容覆盖本地仓库:
git fetch origin git reset --hard origin/main
- 方法 1:将远程仓库的内容拉取到一个新的分支:
-
检查远程仓库的历史:
- 如果你不确定远程仓库的历史是否被重写,可以查看远程仓库的提交记录:
git log origin/main
- 如果你不确定远程仓库的历史是否被重写,可以查看远程仓库的提交记录:
示例
假设你确定需要合并不相关的历史,可以按照以下步骤操作:
# 允许合并不相关的历史
git pull origin main --allow-unrelated-histories
# 如果有冲突,解决冲突并标记为已解决
git add <冲突的文件>
# 完成合并
git commit
问题2 合并填写信息
Merge branch 'main' of github.com:suooous/BERT-Forest
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
~ ~ ~ ~ .git/MERGE_MSG [unix] (19:58 25/02/2025) 6,1 All
"/d/BERT_Forest/ET-BERT-Forest/.git/MERGE_MSG" [unix] 6L, 280B
这是 Git 在执行合并操作时,自动打开了一个文本编辑器,要求你为这次合并提交一个合并提交信息(merge commit message)。Git 需要你解释这次合并的原因,尤其是在将一个远程分支(例如 origin/main
)合并到一个本地分支(例如 master
)时。
为什么会发生这种情况?
- 当你运行
git pull
或git merge
时,Git 会自动尝试合并两个分支。 - 如果合并成功,Git 会生成一个合并提交(merge commit),并需要你为这个提交提供一个描述信息。
- Git 会打开默认的文本编辑器(例如 Vim、Nano 或其他配置的编辑器)来让你输入提交信息。
你看到的内容
你看到的内容是 Git 自动生成的合并提交模板,其中包含以下部分:
-
第一行:
Merge branch 'main' of github.com:suooous/BERT-Forest
- 这是 Git 自动生成的合并描述,表示你正在将
main
分支合并到当前分支。
- 这是 Git 自动生成的合并描述,表示你正在将
-
注释部分:
- 以
#
开头的行是注释,Git 会忽略这些行。 - 注释部分提示你需要为这次合并提供一个解释,尤其是当你将一个更新的远程分支合并到一个本地分支时。
- 以
-
编辑器信息:
- 编辑器底部显示了一些关于文件的信息,例如文件路径(
.git/MERGE_MSG
)和编辑器模式(例如[unix]
)。
- 编辑器底部显示了一些关于文件的信息,例如文件路径(
如何操作?
-
输入合并提交信息:
- 在第一行(或空行)输入你对这次合并的描述。例如:
Merge remote-tracking branch 'origin/main' into master to sync with upstream changes.
- 你可以写得更详细,解释为什么要进行这次合并。
- 在第一行(或空行)输入你对这次合并的描述。例如:
-
保存并退出编辑器:
- 如果你使用的是 Vim 编辑器:
- 按
i
进入插入模式,输入提交信息。 - 按
Esc
退出插入模式。 - 输入
:wq
保存并退出。
- 按
- 如果你使用的是 Nano 编辑器:
- 输入提交信息后,按
Ctrl + O
保存,然后按Ctrl + X
退出。
- 输入提交信息后,按
- 如果你使用的是 Vim 编辑器:
-
完成合并:
- 保存并退出编辑器后,Git 会完成合并操作,并生成一个合并提交。
如果你不想输入提交信息
- 如果你不想输入提交信息,可以直接保存一个空文件并退出编辑器,但这样会中止合并操作。
- 如果你想使用默认的合并提交信息,可以直接保存并退出编辑器,Git 会使用自动生成的描述。
示例
假设你正在将 origin/main
合并到 master
,你可以输入以下提交信息:
Merge branch 'main' of github.com:suooous/BERT-Forest
Sync with the latest changes from the upstream repository.
总结
- 这是 Git 在合并操作时要求你输入合并提交信息的正常行为。
- 你需要为合并提交提供一个描述,解释这次合并的原因。
- 保存并退出编辑器后,Git 会完成合并操作。
- 如果你不想输入提交信息,可以直接保存空文件并退出,但这会中止合并操作。
问题3 文件太大
12786@GWJ MINGW64 /d/timeDependent/pm2.5project_newest (master)
$ git push origin master:SCNN
Enter passphrase for key '/c/Users/12786/.ssh/id_rsa':
Enumerating objects: 314, done.
Counting objects: 100% (314/314), done.
Delta compression using up to 16 threads
Compressing objects: 100% (256/256), done.
Writing objects: 100% (304/304), 280.45 MiB | 2.75 MiB/s, done.
Total 304 (delta 55), reused 175 (delta 25), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (55/55), completed with 7 local objects.
remote: error: Trace: bda25821bfc015300c2124b304bc0c033e824616b81b67661b3c9ccd14974364
remote: error: See https://gh.io/lfs for more information.
remote: error: File PM2.5-GNN-main/data/KnowAir.npy is 295.34 MB; this exceeds GitHub's file size limit of 100.00 MB
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
To github.com:liuwt4408/pm2.5project_newest.git
! [remote rejected] master -> SCNN (pre-receive hook declined)
error: failed to push some refs to 'github.com:liuwt4408/pm2.5project_newest.git'
github
允许每个文件最大为100M
出现这个错误的时候,我们可以本地将这个文件删除,然后把对应的
.git
文件一起删除,重新操作即可