美文网首页
【工具篇3】Git工具一篇教你入门

【工具篇3】Git工具一篇教你入门

作者: 农民工Alan | 来源:发表于2021-06-07 17:12 被阅读0次

    写在前面的话:

    使用Git工具有好几年了,一直使用的图形工具,总觉得工作很忙,就没有去了解Git命令,导致使用起来颇有不便。近来越来越觉得因为忙,导致自己忘记了成长,遂决定拾起份内之事,以下为自己学习Git工具的心得,这里需要指明的是,学习Git工具最重要的是:1、执行每个命令要有工作区、暂存区、本地仓库、远程仓库的概念,有了这一点就可以心中有数了。2、出现问题时,不要放弃,继续尝试直到解决问题为止。

    1、Git 介绍

    1、概述

    Git是一个开源的分布式版本控制系统,Git的内容存储使用的是SHA-1哈希算法。

    分布式与集中式的区别

    分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。

    Git使用官方教程

    https://git-scm.com/book/zh/v2

    2、补充介绍

    这里介绍一个有趣的学习git的网站:https://learngitbranching.js.org/?locale=zh_CN,可以通过玩游戏的方式学习Git

    2、Git工作流程

    1、Git 工作流程
    1. 克隆 Git 资源作为工作目录。
    2. 在克隆的资源上添加或修改文件。
    3. 如果其他人修改了,你可以更新资源。
    4. 在提交前查看修改。
    5. 提交修改。
    6. 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
    2、Git工作区、暂存区、版本库
    1. 工作区:电脑里能看到的目录
    2. 暂存区:英文叫stage或index。一般存放在.git目录下的index文件(.git/index)中。
    3. 版本库:工作区有一个隐藏的目录.git,这个属于Git的版本库。
      详细工作流程可以查看下方链接图示
      https://www.runoob.com/git/git-workspace-index-repo.html
    3、基本流程

    !!!当对工作区修改的文件执行git add命令时,暂存区的目录树更新。
    !!!当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
    !!!当执行 git rm --cached <file> 命令时,会直接从暂存区删除文件,工作区则不做出改变。
    !!!当执行 git checkout . 或者 git checkout -- <file> 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
    !!!当执行 git checkout HEAD . 或者 git checkout HEAD <file> 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

    4、Git 基本操作映射关系

    workspace:工作区
    staging area:暂存区/缓存区
    local repository: 本地仓库
    remote repository: 远程仓库

    1. git pull = remote repository =>workspace
    2. git add = workspace => staging area
    3. git commit = staging => local repository
    4. git push = local repository => remote repository
    5. git checkout = local repository =>workspace
    6. git fetch/clone = remote repository => local repository
    7. git diff = 比较暂存区和工作区的差异
    8. git blame <file> 以列表形式查看指定文件的历史修改记录
    9. git branch -vv 查看当前详细分支信息(可看到当前分支与对应的远程追踪分支):
    10. git remote -vv 查看当前远程仓库信息
    5、Git 分支管理

    当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。

    当你以此方式在上次提交更新之后创建了新分支,如果后来又有更新提交, 然后又切换到了 testing 分支,Git 将还原你的工作目录到你创建分支时候的样子。

    6、基本配置

    6.1 配置默认编辑器
    git config --global core.editor notepad++
    git config --list (查看所有配置项)
    git config --list --show-origin(查看配置的路径)
    git help config(查看git config命令的帮助文档)

    3、Git常用操作命令

    1、下载代码
    不指定分支:git clone <remote_repo>
    指定分支:git clone -b <branch> <remote_repo>

    2、创建一个分支,并关联到远程分支
    git checkout -b master origin/master

    3、切换分支,更新代码
    git checkout 选择远程(remote)需要切换的分支,拉下来时选择全部覆盖(全选)
    git pull 将当前分支代码更新到最新
    git pull = git fetch + git merge

    4、查看状态
    git status

    5、提交到暂存区, 或者从暂存区回滚文件
    git add src/com res/ 此处目录或文件皆可
    git add -A (将new files、modified files、deleted files都放到暂存区)
    git add . (Git 1.x版本不会将deleted files 文件放在暂存区)
    git add -u (new files文件不会放到暂存区)
    git reset 文件 将文件从stage到unstage

    git diff 工作区和暂存区比较
    git diff --cached 暂存区和HEAD比较
    git diff HEAD 工作区和HEAD比较

    6、提交到本地仓库
    git commit -s -m "描述语言"

    7、推送到远程仓库
    git push origin master(简化命令)
    git push origin refs/heads/master:refs/heads/master(完整命令)

    Gerrit提交:
    git push -f origin HEAD:refs/for/rom/stable/cloudsync_contact
    git push -f origin master:refs/for/master (refs/for/空间)
    ALM提交:git push -f origin dev master
    git push origin beta-R:feature_beta-R --force
    git push -f origin beta-R:feature_beta-R_1125

    8、重置引用
    git reset [--soft|--mixed|--hard] [<commit>]
    git reset --hard (用本地仓库commit覆盖本地仓库、暂存区、工作区)
    git reset (用本地仓库commit覆盖本地仓库、暂存区,工作区不覆盖)
    git reset --soft(用本地仓库commit覆盖本地仓库,暂存区、工作区不覆盖)

    回退到某笔代码(某个hash值)
    回退不清掉代码:git reset --soft hash值
    回退清掉代码:git reset --hard hash值

    9、补充提交
    git commit --amend

    10、Git 查看历史记录
    gitk
    git log --author=Linus --oneline -5
    git log --graph
    git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges
    git log --oneline decorate

    11、分支合并
    git merge 分支名 (将分支名合并到当前分支)

    12、删除标签
    git log --decorate
    git tag -d beta-R

    13、rebase前三项(变基)
    git rebase -i head~3
    git rebase [--onto <newbase>][<upstream>][<branch>]
    git rebase -i topicA~5 如果需要删除哪项,就将pick 中对应的哪项删除

    14、其他分支cherry-pick某笔到当前分支
    git cherry-pick hash值

    15、出现冲突、修改冲突文件
    vim 文件,然后解决冲突,执行git add
    git cherry-pick --continue
    git 解决冲突的最佳方式,回退到某一笔的方式

    16、比较差异
    git diff的比较是从右向左。
    git diff 比较暂存区与工作区文件的区别。
    git diff --cached 比较仓库与暂存区文件的区别。
    git log origin/rom/feature/v8.21..origin/rom/feature/v8.22 --pretty=tformat:--numstat > code.txt 比较分支之间代码修改差异
    git log origin/rom/feature/v8.22..origin/rom/feature/v8.23 --pretty=tformat: --numstat > code.txt

    17、查看设置的所有跟踪分支
    git branch -vv

    写在此小节最后的话
    文件的流转方向是由工作区创建,add进入暂存区,commit进入仓库,执行命令的时候弄清楚文件的走向即可。

    4、Git 遇到的问题

    1、error:src refspec beta-R matches more than one

    【解决方法】
    1、git tag查看是不是多了一个beta-R的tag
    2、git tag -d beta-R 删除多的tag

    2、fatal: bad object
    $ git cherry-pick ec688198cf46bbbc910273a3e8fcd828e35ccc9d
    fatal: bad object ec688198cf46bbbc910273a3e8fcd828e35ccc9d
    

    【解决方法】
    原因:git cherry-pick是本地特性,本地要有这个commit id才可以被git cherry-pick,如果没有,就会报上述错误。
    1、git fetch
    2、git cherry-pick ec688198cf46bbbc910273a3e8fcd828e35ccc9d

    3、git cherry-pick could not apply

    【原因】cherry-pick 出现了冲突,需要解决冲突
    【解决方法】AndroidStudio: VCS——Git——Resolve Conflicts,解决完冲突选择apply即可

    4、cannot do a soft reset in the middle of a merge

    【原因】本地仓库有一笔修改未同步
    【解决方法】
    1、git commit 提交到本地仓库

    5、Git下载Google源码无法下载提示:

    参考以下网站:https://android.googlesource.com/platform/packages/apps/Contacts/

    【操作及错误提示】
    $ git clone https://android.googlesource.com/platform/packages/apps/Contacts
    Cloning into 'Contacts'...
    fatal: unable to access 'https://android.googlesource.com/platform/packages/apps/Contacts/': SSL certificate problem: unable to get local issuer certificate

    【分析】
    系统判断这个行为会造成不良影响,所以进行阻止,只要设置跳过SSL证书验证就可以了
    【解决方法】
    git config --global http.sslVerify false
    【验证】
    $ git clone https://android.googlesource.com/platform/packages/apps/Contacts
    Cloning into 'Contacts'...
    remote: Sending approximately 37.12 MiB ...
    remote: Counting objects: 985, done
    remote: Total 168498 (delta 89372), reused 168498 (delta 89372)
    Receiving objects: 100% (168498/168498), 37.12 MiB | 5.87 MiB/s, done.
    Resolving deltas: 100% (89372/89372), done.

    6、Git rebase --continue 无法进行下一步

    【操作及错误提示】
    $git rebase --continue
    ***** Bad Address Cannot read HEAD
    【解决方法】更新git windows版本,之前版本是2.17.0更新到2.30.0之后就可以了。

    7、每次都弹框提示要求输入ALM的账号和密码

    【解决方法】git不想每次输入用户名和密码

    git config --global credential.helper store
    

    执行一次git pull输入username和password后,下次就不用了

    8、如果新创建的分支,切换时提示:fatal 'origin/branch_4.4.20_fix" is not a commit and a branch "4.4.20_fix" cannot be created from it

    【解决】此时需要通过git fetch来进行更新

    9、丢弃掉本地新增的文件

    【解决】
    1、先使用git reset 从暂存区回退到工作区
    2、然后使用git clean -df fileName 删除文件
    补充说明:git reset 删除的是已跟踪的文件;git clean删除的是未跟踪的文件

    10、提示Permission denied(publickey). fatal: COund not read from remote repository.
    11、remote: HTTP Basic: Access denied

    【问题】更新火眼插件后,下载代码异常
    $ git clone http://gitlab.os.adc.com///.git
    Cloning into '
    '...
    remote: HTTP Basic: Access denied
    fatal: Authentication failed for 'http://gitlab.os.adc.com///***.git'
    【解决】
    1、C:\Program Files\CodeReview\codereview\config\httpKey 检查上述目录下的密码是否正确,这里遇到过更新火眼插件后,上述目录下的httpKey中特殊字符@变成了%,导致密码不正确,如果密码不正确,记得取gitlab上更改http克隆密码。
    2、检查“控制面板---所有控制面板项----凭据管理器” 中“Windows凭据---普通凭据”下密码是否正确,将密码更改为gitlab上更改后的密码。
    3、gitlab上更改密码后,就可以不用再动了。

    5、其他

    Github教程
    https://www.runoob.com/w3cnote/git-guide.html

    相关文章

      网友评论

          本文标题:【工具篇3】Git工具一篇教你入门

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