菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
0
0

Git使用指南

原创
05/13 14:22
阅读数 2657

图解git四大分区
图片.png

图解git四大分区
图片.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并没有被清理

发表评论

0/200
0 点赞
0 评论
收藏