图解git四大分区2.png
1. 推送到远程仓库
将本地项目初始化到远程dev branch上
> cd <my_local_repo>
> git init
> git checkout -b dev # create a new branch dev
> git add .
> git commit -m "First commit"
> git remote add origin <my_remote_origin_url>
> git push -u origin dev
> git log --since="2018-01-01" --before="2021-01-22" --author="yuchensun" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'
拷贝一个仓库的内容到另一个仓库
git clone --bare https://github.com/exampleuser/old-repository.git # 产生叫old-repository.git的文件夹
cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git
查看仓库远程地址
> git remote get-url origin
修改仓库远程地址
> git remote set-url origin <remote_origin_url>
2. 将远程信息同步到本地
git fetech
3. merge
合并分支A到B
> git checkout A
Switched to branch 'A'
> git pull origin A # 确保本地A分支已经更新到最新
From <your_git_repo_origin>
* branch A -> FETCH_HEAD
Already up to date.
> git checkout B
Switched to branch 'B'
> git pull origin B
From <your_git_repo_origin>
* branch B -> FETCH_HEAD
Already up to date.
> git merge A
Auto-merging ...
CONFLICT (content): Merge conflict in ...
(打开VSCode手动解决冲突)
4. 回滚删除某一次提交(不小心上传了密钥时使用)
(把当前进度备份保存好)
git reset --hard <commit_id> // 将HEAD指向要删除的提交的前一次提交
git push origin HEAD --force // 强制推送到远端,想要删除的提交就会被抹去
(将最新进度拷贝回本地仓库)
git push origin dev // 重新提交最新进度
5. cherry-pick
单独挑选需要的commit合并入当前分支
git checkout master
git cherry-pick <commit_id>
单独需要的commit区间合并入当前分支
git checkout master
git cherry-pick commit_id_1..commit_id_100
# 左开右闭,包含commit_id_100,不包含commit_id_1
cherry-pick默认梅摘取一个commit就会提交一次生成一个新的commit id,如果希望摘取所有后自己手动commit,则可以使用参数-n
git checkout master
git cherry-pick -n commit_id_1..commit_id_100
git commit -m "pick features"
6. diff
比较不同
git diff (<file_path>)
: 当工作区有改动,暂存区为空,diff的对比是“工作区与最后一次commit提交的仓库的共同文件”;当工作区有改动,暂存区不为空,diff对比的是“工作区与暂存区的不同文件”,可指定文件
git diff --staged / git diff --cached
: 显示暂存区(已add但未commit文件)和最后一次commit(HEAD)之间的所有不相同文件的增删改
git diff branch1/commit_id branch2/commit_id (<file_path>)
: 比较两个branch/commit最后一次commit的文件的详细差异,可指定文件
git diff branch1/commit_id branch2/commit_id --stat
: 罗列出两个branch/commit最后一次commit所有有差异的文件(简要)
7. 分支
查看所有分支
git branch -a
查看所有远程分支
git branch -r
查看所有本地分支到远程分支的映射
git branch -vv
新建分支
# 新建远程分支同名的本地分支
git checkout <local_branch_name>
# 只创建本地新分支,不会关联到远程分支
git checkout -b <local_branch_name>
# 有时候只写git checkout <local_branch_name>未必能关联到正确的远程分支
# 需要具体指明
git checkout -b <local_branch_name> origin/<remote_branch_name>```
删除分支
# 删除本地分支
git branch -D <local_branch_name>
# 删除远程分支
git push origin --delete <remote_branch_name>
8. git config
git的config有三级(优先级依次降低):local, global, system
查看config
git config --local -l
git config --global -l
git config --system -l
设置文件换行格式
git config --global core.autocrlf true # push时自动地把行结束符CRLF转换成LF,pull时把LF转换成CRLF。Windows上常用。
git config --global core.autocrlf input # push时把CRLF转换成LF,pull时不转换
git config --global core.autocrlf false # 无论pull还是push都不转换
git会默认忽略检查文件名的大小写是否变化,这时候就需要设置config里的ignorecase
参数
git config core.ignorecase # 查看是否忽略了文件名大小写
git config core.ignorecase false # 设置是否忽略了文件名大小写
git submodule
git submodule可以将一个仓库引用到另一个仓库中
添加子模块
git submodule add <submodule_url> <relative_path>
# 如git@127.0.0.1:myprojects/child.git app/child
此时项目仓库中会多出.gitmodules
文件和对应的仓库目录
添加后如果从远程clone父仓库,子仓库并不被一起被拉去,需要使用初始化和更新命令
git clone git@127.0.0.1:myprojects/parent.git
cd <parent_dir>
git submodule init
git submodule update
另一种方法为直接递归拉取
git clone git@127.0.0.1:myprojects/parent.git --recurse-submodules
还有一种
git clone git@127.0.0.1:myprojects/parent.git
git submodule update --init --recursive
如果将包含子仓库的branch merge到不包含子模块的branch,也需要重新git submodule init
和git submodule update
此时进入子仓库目录内,可以发现git版本信息等变成了子仓库的信息
修改子模块后,需要先在子仓库目录内推送至远程,然后再把这个依赖更新信息推送到父仓库
删除submodule时,需要清理几个地方:
- 删除
.gitmodules
中的相关信息 - 删除
.git/modules
中的相关目录 - 删除
.git/config
中的相关引用 - 执行`git rm –cached·将子模块所在的文件从git中删除
可以使用官方的
git submodule deinit <sub_module_name>
# 效果相当于删除了.git/config中的信息
git rm <sub_module_name>
# 效果相当于删除了.gitmodules中的信息
不过.git/modules并没有被清理
网友评论