Contents

Git 日常操作

Updated on 2021-08-14

由于网络的原因, 有时无法直接提交本地代码到Github上, 这个时候需要设置代理

1
git config --get http.proxy
1
2
# 请使用自己的代理
git config --global http.proxy '127.0.0.1:1081'

如果不想使用代理则可以通过以下方式删除

1
git config --global unset http.proxy

我们经常会遇到这样的场景, fork一个开源项目, 然后自己维护。 但如何将开源项目的更新同步到自己的repo, 这里就涉及两个仓库的同步问题。

思路

  1. 为本地仓库添加两个远程仓库, 这样既可以从原仓库更新又便于push到新的仓中
  2. 从原仓库更新代码到本地
  3. 再把更新后的本地分支push到自己新的远程项目仓库

为了关联之前的repo, 我们需要将之前fork的repo信息添加到本地, 并指定原fork repo仓库的名字为: upstream

1
git remote add upstream https://github.com/uPagge/uBlogger.git

查看远程仓库信息

1
2
3
4
5
6
7
git remote -v 

# out
# origin  https://github.com/dataml-cn/uBlogger.git (fetch)
# origin  https://github.com/dataml-cn/uBlogger.git (push)
# upstream        https://github.com/uPagge/uBlogger.git (fetch)
# upstream        https://github.com/uPagge/uBlogger.git (push)

从原fork项目中更新代码

1
git pull upstream master  
源仓库代码和本地代码可能有冲突, 请先修改后commit, 然后再进行push到新的远程仓库
1
git push origin master

有时候我们的repo会依赖于另外一个repo, 这个时候需要通过submodule引入repo, 而非直接将另外一个repo代码直接copy过来。直接复制过来会存在以下问题:

  1. 增加代码量
  2. 依赖的repo更新比较麻烦
  3. 修改依赖repo的代码, 同步到原仓库比较麻烦

Git Submodule 允许一个git仓库, 作为另一个git仓库的子目录, 并且保持父项目和子项目相互独立。

示例, 在已有repo仓库中添加submodule uBlogger 到子目录themes/uBlogger

1
git submodule add https://github.com/dataml-cn/uBlogger.git themes/uBlogger

原repo下会增加.gitmodules文件, 示例如下:

1
2
3
[submodule "themes/uBlogger"]
	path = themes/uBlogger
	url = https://github.com/dataml-cn/uBlogger.git
  1. 远程仓库不会包含submodule代码, 仅仅包含.gitmodules相关信息
  2. 我们在clone远程仓库时, 需要clone父项目后, 初始化submodule

克隆一个包含子仓库的仓库目录, 并不会clone下子仓库的文件, 只是会克隆下.gitmodule描述文件。通过以下命令进行初始化, 并检出相关代码

1
git submodule update --init --recursive

diff 功能默认并不会显示submodule下的信息, 需要额外设置

1
git config --global diff.submodule log

可以方便的显示子repo的日志信息, 不需要切换到子目录里进行查看

1
git log -p --submodule
1
git submodule update --recursive --remote

父项目存储了它依赖的submodule项目的版本号信息而已, git submodule update并不会将submodule切到任何branch, 默认情况submodule的HEAD是处于游离

  1. 切换分支, 一定要将submodule切换到某个分支, 比如master
  2. 子项目, 提交修改, 并推送到远程仓库
  3. 父项目, 将子项目的版本号, 推送到远程仓库里
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 1. 切换分支
cd ./themes/uBlogger
git checkout master

# 2. 提交submodule信息
git add <your_file>
git commit -m "sub msg"
git push orign master

# 3. 父项目关联新的信息
git add ./themes/uBlogger
git commit -m "parent msg"
git push --recurse-submodules=on-demand

  1. check, 父项目push时检查子项目是否有未提交的内容
  2. on-demand, 尝试自动push改动的子模块
Trusted user pc
Trusted user pc

Комментарии