我的 git 实战记录
1. 将本次提交追加到上一次提交
1.1. 情景描述
有些时候,我提交东西太勤快了,导致有部分内容没有提交上去。分为两种情况:
- 已经 push 远程仓库
- 还没有 push 到远程仓库
1.2. 已经 push到远程仓库
先 git add
提交修改的文件,就是下面的操作了
`git commit --amend` # 修改上一次的提交
# 进入提交信息编辑界面
# 修改保存退出
# 推送 (本地分支:远程分支)
git push origin master:master
# 如果推送不上去,就用这个命令
git push -f origin master:master
然后,我们就提交,有可能普通提交上不去,那么我们就强制提交。
1.3. 未 push 到远程仓库
先git add提交修改的文件,就是下面的操作了
git commit --amend # 修改上一次的提交
# 进入提交信息编辑界面
# 修改保存退出
1.4. 参考博客
- git 提交过的追加提交
- git commit --amend
2. git upstream
2.1. 情景描述
在一些提交的时候,我们需要提交到 upstrem,这个时候我们就需要知道什么是 upstream.
有时候一些提交需要我们提交到 upstream.
那我们要了解 orgin 和 upstream
2.2. orgin
在使用过程中经常可以看到origin这个名词,origin(原点)这次词是从哪来的呢?
要查看当前配置有哪些远程仓库,可以用git remote命令,它会列出每个远程库的简短名字。在克隆完某个项目后,至少可以看到一个名为 origin 的远程库,git 默认使用这个名字来标识你所克隆的原始仓库。
这就是 origin 的由来,如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 这个标识名下。
upstream
upstream 这个名词是在github的Fork功能上衍生出来的。
对于一些有名的开源项目(这里我选的是spring-framework项目),我们常常会把把这些项目Fork到自己的github上,然后再从自己的github把这个项目clone到本地,这时用git remote -v命令查看一下远程仓库的情况,可以看到:
$ git remote -v
origin https://github.com/Flamingo93/spring-framework.git (fetch)
origin https://github.com/Flamingo93/spring-framework.git (push)
upstream https://github.com/spring-projects/spring-framework.git (fetch)
upstream https://github.com/spring-projects/spring-framework.git (push)
从输出可以看出upstream与origin是并列的关系,他们都是远程仓库的名字,只不过origin是你所克隆的原始仓库的默认名字,upstream是fork的原项目的远程仓库的默认名字。
可以用git fetch [remote-name]
命令从远程仓库抓取数据到本地:
$ git fetch origin #抓取在你的GitHub仓库上新的提交数据到本地仓库
$ git fetch upstream #抓取在著名开源项目的GitHub仓库上新的提交数据到本地仓库
3. git submodule
3.1. 添加当前submodule
使用https 格式,不要使用ssh格式
git submodule add https://github.com/username/repository
我们添加的module可以在 .git/modules
里面看到。
3.2. 删除submodule
git rm --cached <submodule path>
3.3 当我克隆远程仓库,更新我的submodule
当我一开始克隆了我以前的远称仓库,我就遇到一些问题就是git submodule update
没有用
那么是为什么呢?
我发现是我里面用的 git 远程格式是 ssh 格式,我也不知道为啥,反正改成 https 就好了。
然后我们就要修复git submodule 里面的路径,让我们打开文件 vim .gitmodules
git submodule init && git submodule update
下面的<path>
是这个远程相对于.git 的路径。
[submodule <path>]
path = <path>
url = <remote_repository_url>
而且我们还要删除一些我们已经错误的submodule
就用 git rm --cached <submodule_path>
git submodule sync
然后我们就用 git submodule update –init
来跟据.gitmodule
来更新submodule.
ok,解决问题!!!
github克隆项目中的子模块submodule时遇到的问题
4. 当我们 fork 了一个项目,在本地修改,想提交进入自己的 fork 仓库
一般我们还在原仓库进行修改,那么我们推送上去的还是原仓库,那么我们想要推送进自己的仓库,那么我们就需要修改 git remote
使用 git remote -v
$ git remote -v
origin git@github.com:looniink/hotelManage.git (fetch)
origin git@github.com:looniink/hotelManage.git (push)
然后,我fork的 orgin 是:
git@github.com:Leiyi548/hotelManage.git(fetech)
git@github.com:Leiyi548/hotelManage.git(push)
然后修改
方法一、直接修改:
git remote set-url origin git@github.com:Leiyi548/hotelManage.git
方法二、删除再修改:
git remote rm origin
git remote add origin git@github.com:Leiyi548/hotelManage.git
修改好了,我们就能直接 git push
5. 本地建立了新分支,推送到远程去
- 使用
git branch
查看本地分支:
$ git brach
* coc
main
可以看到我们本地分支这里有两个分支,一个是 coc,一个是 main分支,当前我处于coc分支。
- 使用
git branch -r
查看远程分支:
$ git branch -r
origin/HEAD -> origin/main
origin/mainB
- 使用
git branch -a
查看所有分支:
$ git branch -a
* coc
main
remotes/origin/HEAD -> origin/main
remotes/origin/coc
remotes/origin/main
将新建立的 coc 分支推送到远端
git push origin coc
然后我们去远程仓库,看coc就推送上去了。
6. git 提交文件大于100mb
有些时候,我会用git来提交东西,有时候,我提交的东西过大,那么我就无法提交……
解决这个问题,运行如下命令即可:
使用Git LFS
- 在官网 https://git-lfs.github.com/下载 git-lfs-windows-v2.8.0.exe 并安装。
- 新开一个bash命令行输入git lfs install安装
- 跟踪你要push的大文件
git lfs track "/path/filename"
,这时会生成一个.gitattributes文件。 - 这里很重要,一定要先将上一步生成的.gitattributes文件上传到仓库也就是要上传三部曲
然后我们再运行 git push
,就可以了。
更详细的信息请看解决GitHub上传大于100M文件失败
在 windows 使用 wsl2 操作 git
如果您在Windows、WSL 或容器之间使用相同的存放库资料夹,请务必设定一致的行尾。
由于Windows和 Linux 使用不同的预设行尾端,Git 可能会报告大量修改过的档桉,除了其行尾端之外没有差异。 若要避免发生这种情况,您可以使用档桉或在Windows端全域停用行结束转换 .gitattributes 。 请参阅此VS Code文档,以解决 Git 行结尾问题。
那么我们在我们的项目的根目录创建一个 .gitattribute,因为这个文件对其他人也有用!
* text=auto eol=lf
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf
上面的设置含义是:
将会让所有都以 lf 来进行换行,除了windows的特定文件
7. 参考博客
- origin vs upstream - Git名词解释
- 解决GitHub上传大于100M文件失败