美文网首页
Git使用指南

Git使用指南

作者: Lyudmilalala | 来源:发表于2022-10-13 23:48 被阅读0次
    图解git四大分区1.png
    图解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 initgit submodule update

    此时进入子仓库目录内,可以发现git版本信息等变成了子仓库的信息
    修改子模块后,需要先在子仓库目录内推送至远程,然后再把这个依赖更新信息推送到父仓库

    删除submodule时,需要清理几个地方:

    1. 删除.gitmodules中的相关信息
    2. 删除.git/modules中的相关目录
    3. 删除.git/config中的相关引用
    4. 执行`git rm –cached·将子模块所在的文件从git中删除

    可以使用官方的

    git submodule deinit <sub_module_name>
    # 效果相当于删除了.git/config中的信息
    git rm <sub_module_name>
    # 效果相当于删除了.gitmodules中的信息
    

    不过.git/modules并没有被清理

    相关文章

      网友评论

          本文标题:Git使用指南

          本文链接:https://www.haomeiwen.com/subject/idlqzrtx.html