Git - 上传文件到远程仓库完整流程
# Git - 上传文件到远程完整流程
笔记
本文适用于 GitHub / GitLab / Gitee / 码云 等平台,并且你已经安装了 Git Bash 并注册了远程仓库账号。
为什么不用IDEA或其它可视化工具提交?
- IDEA 提交 & Push 需要进行 界面更新、状态检查、可视化处理,这些都会 增加响应时间。
- 每次提交或推送前,IDEA 会重新检查文件状态,查看哪些文件被修改或删除,并在 UI 界面上 实时渲染 这些变化。
最快的方式:直接在终端执行 git push
,避免 IDEA 额外的处理步骤。
# 🌟 1. 配置 Git 基本信息
在首次使用 Git 之前,你需要配置用户名和邮箱,这是 Git 记录提交者信息的方式。
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
2
✅ 解释:
--global
代表全局生效,所有 Git 仓库都会使用这个信息。- 如果只想在某个项目内生效,可以去掉
--global
,Git 只会对当前仓库生效。
💡 查看当前 Git 配置信息
git config --list
# 🌟 2. 创建本地仓库
如果你已有本地项目,可跳过
mkdir
和cd
这两步。
mkdir my-project # 创建一个新的文件夹
cd my-project # 进入该目录
git init # 初始化 Git 仓库
2
3
✅ 解释:
mkdir my-project
:创建一个新的目录(可换成你的项目名)。cd my-project
:进入目录。git init
:初始化 Git 仓库,这将创建一个.git
隐藏目录,Git 用它来跟踪文件。
💡 检查当前目录是否为 Git 仓库
ls -a
如果能看到 .git
目录,说明初始化成功!
# 🌟 3. 关联远程仓库
默认情况下远程仓库通常需要先在对应的平台(如 GitHub、GitLab、Gitee 等)手动创建,然后复制仓库的 HTTPS 或 SSH 地址再与本地仓库进行关联。
远程命令
操作 | 命令 |
---|---|
添加远程仓库并起别名 | git remote add 别名 远程地址 |
修改远程仓库别名 | git remote rename 旧别名 新别名 |
查看所有远程仓库 | git remote -v |
删除远程仓库 | git remote remove 远程仓库别名 |
修改远程仓库地址 | git remote set-url 远程仓库别名 新的远程仓库地址 |
# 🔹 使用 HTTPS 方式
git remote add origin https://github.com/你的用户名/你的仓库名.git
# 🔹 使用 SSH 方式
(适用于已配置 SSH Key 的用户)
git remote add origin git@github.com:你的用户名/你的仓库名.git
✅ 解释:
git remote add origin
:将本地仓库与远程仓库关联,origin
是远程仓库的默认别名(你可以改成别的,比如github
)。- HTTPS 适合初学者,SSH 适合长期使用。
- 如果你已经添加过远程仓库,需使用
git remote remove origin
或git remote rm origin
命令先删除再重新添加!
💡 检查远程仓库是否添加成功
git remote -v
会显示类似以下内容:
origin https://github.com/你的用户名/你的仓库名.git (fetch)
origin https://github.com/你的用户名/你的仓库名.git (push)
2
✅ 解释:
origin
:远程仓库的默认别名(你可以改成别的名字,比如github
)。fetch
:表示从远程仓库拉取(下载)代码。push
:表示向远程仓库推送(上传)代码。
🔸 修改远程仓库地址
修改 origin
绑定的新地址
git remote set-url origin https://github.com/你的用户名/你的新仓库.git
✅ 如果你使用 SSH,修改为:
git remote set-url origin git@github.com:你的用户名/你的新仓库.git
# 🔹 关联多个远程仓库
有时候,我们需要将代码推送到多个远程仓库,比如 GitHub 和 Gitee,同时维护多个平台。
🔸 添加多个远程仓库
git remote add github https://github.com/你的用户名/你的仓库.git
git remote add gitee https://gitee.com/你的用户名/你的仓库.git
2
✅ 检查多个远程仓库是否添加成功
git remote -v
会显示类似以下内容,说明我们已经成功关联多个远程仓库了:
github https://github.com/你的用户名/你的仓库.git (fetch)
github https://github.com/你的用户名/你的仓库.git (push)
gitee https://gitee.com/你的用户名/你的仓库.git (fetch)
gitee https://gitee.com/你的用户名/你的仓库.git (push)
2
3
4
# 🌟 4. 添加文件到 Git
现在,Git 还不知道要上传哪些文件,我们需要手动添加它们。
git add . # 添加当前目录下所有文件
✅ 解释:
git add .
:将 当前目录下所有文件 添加到暂存区(staging area
)。你也可以单独添加某个文件,比如:
git add 文件名
1
💡 检查 Git 暂存区状态
git status
如果一切正常,你会看到类似:
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README.md
2
3
# 🌟 5. 提交代码 & 查看提交历史
你需要为提交写一条描述性的 commit 信息。
git commit -m "首次提交项目" # 提交到本地库,附带提交信息
✅ 解释:
-m "首次提交项目"
:-m
代表 message,指定提交信息,说明你这次提交的目的或内容。。
💡 查看提交历史
git log --oneline # 一行显示一个版本信息(版本号简写)
示例输出:
在 Git 中,查看日志、分支、diff 等信息时,通常会进入一个分页器(如
less
),你可以使用以下方式退出:q
退出
📌 适用于:
git log
git diff
git branch -r
git show
git reflog
# 🌟 6. 推送代码到远程仓库
- 首次推送时,需要手动指定
main
或master
分支。- Git 的远程分支通常不需要手动创建,本地创建好分支后,推送到远程时会自动创建对应的远程分支。
git branch -v # 查看本地所有分支及其最新提交记录
git branch -m main # # 修改当前分支的名称未main
git push -u origin main # 将本地 main 分支推送到远程 main 分支,并设置默认推送
2
3
✅ 解释:
git branch -v
:查看本地所有分支及其最新提交记录,*
代表当前分支。git branch -M main
:有些 Git 版本默认master
,但现在推荐使用main
。git push -u origin main
:origin
指向远程仓库。main
指向本地当前分支。-u
参数会 记住这个分支的关联,以后只需git push
即可。
💡 后续推送
如果以后有新的提交,只需执行以下命令
git push
# 🌟 7. 验证上传是否成功
方法 1:Git Bash 检查远程分支
git branch -r
如果看到 origin/main
,说明推送成功!
方法 2:在 GitHub / GitLab / Gitee 查看
- 打开 远程仓库地址,刷新网页,看看文件是否已经上传!
# 🌟 8. 分支操作
# 🔹切换分支
# 切换到main分支
git checkout main
# 切换上一个分支
git checkout -
# 强制切换, 但是要小心,如果文件未保存修改会直接覆盖掉
git checkout -f main
# -t, 切换远端分支, 如果用了 git remote 添加一个新仓库就需要用 -t 进行切换
git checkout -t upstream/main
2
3
4
5
6
7
8
9
10
11
在克隆时使用 --depth=1
切换其他分支,比如切换 dev 分支:
git clone --depth=1 https://github.com/xjh22222228/git-manual.git
# 切换 dev 分支
git remote set-branches origin 'dev'
git fetch --depth=1 origin dev
git checkout dev
2
3
4
5
6
除了使用 git checkout
还有另一种方式切换那就是 git switch
, 在 Git 版本 2.23
引入, 主要用于切换和创建分支。
# 切换到 develop 分支
git switch develop
# 切换到上一个分支
git switch -
# 强制切换到 develop 分支,并抛弃本地所有修改
git switch -f develop
# 创建分支并切换
git switch -c newBranch
# 强制创建分支
git switch -C newBranch
# 从前3次提交进行创建新的分支
git switch -c newBranch HEAD〜3
# -t, 切换远端分支, 如果用了 git remote 添加一个新仓库就需要用 -t 进行切换
git switch -t upstream/main
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 🔹创建分支
# 创建一个名为 develop 本地分支
git branch develop
# 强制创建分支, 不输出任何警告或信息
git branch -f develop
# 创建本地 develop 分支并切换
git checkout -b develop
# 创建远程分支, 实际上创建本地分支然后推送到远端
git checkout -b develop
git push origin develop
# 创建一个空的分支, 不继承父分支,历史记录是空的,一般至少需要执行4步
git checkout --orphan develop
git rm -rf . # 这一步可选,如果你真的想创建一个没有任何文件的分支
git add -A && git commit -m "提交" # 添加并提交,否则分支是隐藏的 (执行这一步之前需要注意当前工作区必须保留一个文件,否则无法提交)
git push --set-upstream origin develop # 推送到远程
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 🔹删除分支
注意:删除分支不能删除当前分支,先切换到其他分支再删除。
# 删除本地分支
$ git branch -d <branchName>
# 大写 D 强制删除未完全合并的分支
# 等价 git branch --delete --force <branchName>
$ git branch -D <branchName>
# 删除远程分支
$ git push origin :<branchName>
$ git push origin --delete <branch-name> # >= 1.7.0
2
3
4
5
6
7
8
9
10
# 🔹重命名分支
# 重命名当前分支, 通常情况下需要执行3步
# 1、修改当前分支名称
git branch -m <branchName>
# 2、将重命名分支推送到远程
git push -u origin new_branch
# 3、删除远程旧分支
git push origin --delete old_branch
# 重命名指定分支
git branch -m old_branch new_branch
2
3
4
5
6
7
8
9
10
# 🔹切换分支注意事项
切换分支之前,如果暂存区(staging area)或工作区(working directory)里有未提交的更改,切换分支后会有以下几种情况:
✅ 1. 未提交但已 git add
的更改(暂存区)
切换分支后仍然保留,不会丢失(前提是切换的目标分支没有冲突的更改)。
git checkout feature-login # 先切换到 feature-login 分支
echo "修改了一些代码" >> index.js
git add index.js # 添加到暂存区
git checkout main # 切换到 main 分支
2
3
4
✅ 结果:
index.js
的变更仍然在 暂存区,不会丢失。- 但如果
main
分支没有index.js
,可能会报错,需要git stash
或git commit
处理。
❌ 2. 未 git add
的更改(工作区)
切换分支后可能会报错,或者更改仍然保留,甚至导致冲突!
git checkout feature-login # 先切换到 feature-login
echo "修改了一些代码" >> index.js # 但未执行 git add
git checkout main # 直接切换到 main
2
3
⚠ 可能遇到的情况
如果
index.js
在main
也存在,Git 可能会让你切换并保留修改。如果
index.js
在main
分支没有,Git 可能会报错:error: Your local changes to the following files would be overwritten by checkout: index.js Please commit your changes or stash them before you switch branches.
1
2
3如果两个分支对
index.js
有不同的修改,Git 可能会报冲突!
✅ 解决方案
如果不想提交但想保留更改(推荐):
git stash git checkout main git stash pop # 切换回 main 后恢复改动
1
2
3如果不想保留更改(放弃未提交的修改):
git checkout -f main # 强制切换(丢失未提交的修改!)
1如果希望提交后再切换:
git add . git commit -m "保存修改" git checkout main
1
2
3
📌 3. 结论
状态 | 切换分支后会消失吗? | 解决方法 |
---|---|---|
已 git add (暂存区) | 不会消失(仍然存在) | 直接切换,无需处理 |
未 git add (工作区) | 可能导致报错或冲突 | git stash 存起来,或 git commit 后再切换 |
存在冲突(两个分支修改了相同文件) | 可能报错,无法切换 | 先 git stash 或 git commit 解决冲突 |
🚀 最佳实践:
- 如果有未提交的更改,建议
git stash
后再切换分支,避免冲突! - 如果想要清理未提交的改动,可以用
git checkout -f 分支名
或git reset --hard
(谨慎使用)。
# 🌟 9. 如果仓库已有代码,如何拉取最新代码?
如果远程仓库已经有文件,你本地还没有,需要先拉取远程代码:
git pull origin main --allow-unrelated-histories
✅ 解释:
git pull origin main
:从远程仓库的main
分支拉取代码并合并到本地。--allow-unrelated-histories
:如果你的本地仓库和远程仓库没有共同历史,Git 可能会报错,加上这个参数可以避免问题。
# 🌟 10. 忽略不想提交的文件
如果你有一些文件不想提交,比如
node_modules
、log
文件等,可以创建.gitignore
文件。
# 将 "node_modules/" 目录添加到 .gitignore,防止提交 node_modules 依赖文件
echo "node_modules/" >> .gitignore
# 将 ".env" 文件添加到 .gitignore,防止提交环境变量文件,避免泄露敏感信息
echo ".env" >> .gitignore
# 将 .gitignore 文件添加到 Git 暂存区
git add .gitignore
# 提交 .gitignore 文件,并添加提交说明
git commit -m "添加 .gitignore 规则,忽略 node_modules 和 .env 文件"
# 推送到远程仓库
git push origin main # 这里的 `main` 改成你的实际分支名称
2
3
4
5
6
7
8
9
10
11
12
13
14
🌟 前端 Vue + 后端 Spring Boot 项目的通用 .gitignore
模板
该 📂.gitignore
文件适用于 Vue 前端项目 和 Spring Boot 后端项目,可以防止提交无用的文件,保持 Git 仓库整洁。
# 🚀 通用忽略规则
.DS_Store
Thumbs.db
*.log
*.swp
*.swo
*.swn
.idea/
.vscode/
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
dist/
out/
temp/
tmp/
*.pid
*.seed
*.key
# 💻 Vue 前端项目
node_modules/
dist/
public/
!.gitkeep
coverage/
.eslintcache
.env.local
.env.development.local
.env.test.local
.env.production.local
# 📦 Vue CLI 自动生成的文件
package-lock.json
yarn.lock
pnpm-lock.yaml
# ⚡ TypeScript
*.tsbuildinfo
# 🛠️ Vue 编译缓存
.vuepress/dist/
.vuepress/.temp/
.husky/
# 🏗️ Webpack & Vite
*.cache
.vite/
.nuxt/
.next/
# 🏢 IntelliJ IDEA/WebStorm
.idea/
*.iml
# 🌍 后端 Spring Boot 项目
target/
*.war
*.jar
*.ear
# 🔥 Maven
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/application.properties
!**/src/main/**/application.yml
!**/src/main/**/application-*.properties
!**/src/main/**/application-*.yml
!.gitkeep
# 🏗️ Gradle
.gradle/
build/
.gradle-cache/
*.gradle
gradle-app.setting
gradle-wrapper.jar
gradlew
gradlew.bat
# ☁️ 运行时 & 配置文件
logs/
nohup.out
*.log
*.out
*.swp
*.swo
*.swn
hs_err_pid*
*.pid
*.seed
*.key
*.pem
# 🚫 重要的环境变量和安全配置
.env
.env.local
.env.development
.env.test
.env.production
config/*.json
config/*.yaml
config/*.yml
config/*.xml
secrets/
keys/
# 🚀 Docker & Kubernetes
Dockerfile
docker-compose.yml
.dockerignore
.kube/
# 💾 数据库 & 缓存
*.sqlite
*.sqlite3
*.db
*.data
*.cache
*.log
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
📌 说明
分类 | 作用 |
---|---|
通用 | 忽略 .DS_Store (Mac 文件)、Thumbs.db (Windows 缓存文件)、*.log (日志文件) |
Vue 前端 | 忽略 node_modules/ 、dist/ (打包产物)、.env.* (环境变量文件)、coverage/ (单元测试覆盖率) |
Spring Boot 后端 | 忽略 target/ (编译目录)、*.jar/*.war (打包文件)、.mvn/ (Maven 配置) |
Maven & Gradle | 忽略 build/ 、.gradle/ (Gradle 缓存)、.mvn/ (Maven Wrapper 缓存) |
运行时文件 | 忽略 logs/ (日志目录)、nohup.out (后台运行输出)、hs_err_pid* (JVM 崩溃日志) |
环境变量 | 忽略 .env 配置文件,避免泄露敏感信息 |
Docker/K8s | 忽略 Dockerfile 、docker-compose.yml 以及 .dockerignore |
数据库 | 忽略 *.sqlite 、*.db (数据库文件)、*.cache (缓存文件) |
1️⃣ 在项目根目录创建 .gitignore
文件
touch .gitignore
2️⃣ 复制上述内容到 .gitignore
3️⃣ 提交 .gitignore
文件
git add .gitignore
git commit -m "添加通用的 .gitignore 规则"
git push origin main
2
3
# 🌟 11. Git 操作常见错误及解决方案
错误信息 | 可能原因 | 解决方案 |
---|---|---|
fatal: remote origin already exists. | 远程仓库已关联 | git remote remove origin 重新添加 |
error: failed to push some refs | 远程仓库比本地仓库更新 | git pull --rebase origin main 然后 git push |
fatal: not a git repository | 目录没有初始化 Git | git init 重新初始化 |
Permission denied (publickey). | SSH Key 未配置 | ssh-keygen -t rsa 生成 SSH Key 并添加到 GitHub |
# 🎯 12. 完整 Git 操作流程
💡 完整 Git 操作流程
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
mkdir my-project
cd my-project
git init
git remote add origin https://github.com/你的用户名/你的仓库名.git
git add .
git commit -m "首次提交"
git branch -M main
git push -u origin main
2
3
4
5
6
7
8
9
10
11
12
13
14
📌 后续提交
git add .
git commit -m "更新代码"
git push
2
3
🚀 至此,已经完成了完整的 Git 文件上传流程!🎉
# 📌 13. 本地更新远程删除的文件
# 1️⃣ 远程删除文件后,本地默认不会变
如果你在远程仓库(如 GitHub、GitLab)删除了文件,本地不会受到影响,除非你手动同步远程仓库。
🚀 git pull
默认只会同步远程仓库的新增和修改,而不会自动删除远程删除的文件。如果远程分支上删除了文件,你需要手动执行特定命令才能让本地同步删除。
# 2️⃣ 如何同步远程删除的文件?
如果想让本地同步远程的删除操作,你需要执行:
git pull --prune
或:
git pull origin main --prune
📌 解释
git pull
:从远程获取最新的更改并合并到本地--prune
:删除本地已被远程删除的文件或分支
# 3️⃣ 强制让本地同步远程删除
如果你想让本地完全同步远程,包括被删除的文件,可以使用:
git fetch --prune
git reset --hard origin/main
2
📌 解释
git fetch --prune
:获取远程最新变更,并清理已经删除的分支和文件git reset --hard origin/main
:强制重置本地分支,使其与远程main
分支完全一致
⚠️ 警告
git reset --hard
会覆盖本地的所有未提交更改!谨慎使用!
# 4️⃣ 远程删除后如何让本地保留文件?
如果你不想让本地被远程删除的文件影响,可以:
git pull --no-ff --no-commit
📌 解释
--no-ff
:不进行快进合并,保留历史--no-commit
:获取更改但不自动提交,你可以检查后再决定是否删除本地文件
📌 结论
✅ 默认情况下,远程删除的文件不会影响本地
✅ 如果希望同步远程删除的文件,需要 git pull --prune
✅ 如果想让本地强制与远程一致,可使用 git reset --hard origin/main
🔹 建议:在执行 git reset --hard
之前,先 git status
和 git diff
检查本地改动,避免误删重要文件! 🚀