Git基础

Posted 123why

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git基础相关的知识,希望对你有一定的参考价值。

Git
Git是一个代码管理仓库
1.使团队协作开发变得简单
2.方便进行版本控制

这些是各种场合常见的 Git 命令:

开始一个工作区(参见:git help tutorial)
   创建一个空文件夹并进入 mkdir       cd 
   创建一个空的 Git 仓库或重新初始化一个已存在的仓库  git init
   将文件放入git仓库
       在本地创建的仓库有三个区   工作区、暂存区、master
       在工作区创建一个文件  vim filename
       通过 git add filename  添加文件内容至索引,将文件放入暂存区
       通过 git commit -m "说明" 将文件放入master分支
   
在当前变更上工作(参见:git help everyday)
   mv         移动或重命名一个文件、目录或符号链接
   reset      重置当前 HEAD 到指定状态   
       git reset --hard HEAD^     一个^ 代表回退一个,HEAD~100回退到指定个版本,也可以使用版本id回退
   rm         从工作区和索引中删除文件
       在工作区中使用rm删除一个文件,如果文件没有add到暂存区或commit到仓库,将无法恢复
       如果已经add到暂存区或commit到仓库,可以使用git checkout -- filename 将文件在工作区恢复
       如果你确实想删除一个文件,可以使用git rm 文件在这三个区中都被删除,无法恢复

检查历史和状态(参见:git help revisions)
   bisect    通过二分查找定位引入 bug 的提交
   grep        输出和模式匹配的行
   log          显示提交日志    # 使用--pretty=oneline 将每次提交显示一行
        7833bf1 (HEAD -> master) HEAD@{0}: reset: moving to 7833bf
        d19026a HEAD@{1}: reset: moving to HEAD^
        7833bf1 (HEAD -> master) HEAD@{2}: commit: third change
        d19026a HEAD@{3}: commit: second change
        9d0aa2d HEAD@{4}: commit (initial): first commit
   reflog    查看每次的操作   # 回退版本但是后悔后,可以用来找到被回退的版本号
   show       显示各种类型的对象
   status     显示工作区状态     
        无修改时   
            [root@why_centos7 my_git_test]# git status
            # 位于分支 master
            无文件要提交,干净的工作区
        文件被修改,但是没有提交
            [root@why_centos7 my_git_test]# git status
            # 位于分支 master
            # 尚未暂存以备提交的变更:
            #   (使用 "git add <file>..." 更新要提交的内容)
            #   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
            #
            #    修改:      hello.py
            #
            修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

扩展、标记和调校您的历史记录
   branch     列出、创建或删除分支
   checkout   切换分支或恢复工作区文件   
       你脑子很乱,在几千行代码的不知道多少个地方写了一些乱七八糟的东西,你想删除他们,很遗憾找不到他们了,
       这时候就使用git checkout HEAD -- filename可以恢复这次的修改(前提是要恢复的文件没有被add/rm),
     ‘--’必须添加,不加的话是切换分支
       你脑子一团乱麻,把它放入了暂存区,这时候需要添加一步git reset HEAD -- filename,再checkout
               [root@why_centos7 git_test]# git reset HEAD -- README.md
                重置后撤出暂存区的变更:
                M    README.md
        你脑子一团浆糊,把它commit到了版本库,可以使用版本回退
        你脑子进水了,把它推到了远程仓库,你完了
   commit     记录变更到仓库
   diff       显示提交之间、提交和工作区之间等的差异  # 查看被修改的内容
        [root@why_centos7 my_git_test]# git diff
        diff --git a/hello.py b/hello.py
        index f8034f9..f2cf805 100644
        --- a/hello.py
        +++ b/hello.py
        @@ -1,2 +1,4 @@
         hello("hello world")
        +first change
        +我进行了第一次修改
        
        git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别
   merge      合并两个或更多开发历史
   rebase     在另一个分支上重新应用提交
   tag        创建、列出、删除或校验一个 GPG 签名的标签对象

协同(参见:git help workflows)
   fetch      从另外一个仓库下载对象和引用
   pull       获取并整合另外的仓库或一个本地分支
   push       更新远程引用和相关的对象

告诉git你是谁
  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"
  
删除文件
    rm filename 删除工作区的文件,add之后暂存区的文件被删除
    git rm 删除仓库的文件

连接远程库GitHub
    1.要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;  使用ssh连接,并用密钥验证身份,
         origin后的内容在打开远程库后可以复制
    2.关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
    3.此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
    上面的方式是先在本地创建版本库,之后推送到远程版本库,通常不使用这种方式
    1.先在github上创建一个版本库
    2.在本地clone这个版本库git clone git remote add origin git@server-name:path/repo-name.git
分支
    你写的未完成的代码想提交到远程,以防止本地丢失,但是又不能直接推到master上,因为代码未完成别人下载后会造成不便,
    这时可以开一个自己的分支(master也是一个分支,它是默认的主分支),此时提交到远程的代码以dev分支的形式在master上继续行进,
    dev分支完成后就合并到master上
    1.创建一个分支并切换到该分支上git checkout -b dev  /  git switch -c dev
    2.查看当前的分支 git branch,确认已在dev分支上,此时进行的所有push都是提交到dev上
    3.将dev分支的内容合并到主分支master上
        先切换到主分支 git checkout master / git switch master 
        合并dev分支的内容 git merge dev 
            合并失败,解决冲突:
                解决冲突之后重新提交
                用git log --graph命令可以看到分支合并图。
      4.删除分支 git branch -d dev 
            fastforward模式下,注意删除分支后分支信息不再存在,可强制关闭这个模式,以保留分支信息
            git merge --no-ff -m a no ff merge dev
            这样删除分支后使用git log --pretty=oneline 可以看到分支信息
      修复bug
            在你正在工作时,突然接到紧急修复bug的任务
            1.将手头工作另存 git stash
            2.创建修复bug的分支issue-101 git chenkout -b issue-101
            3.在分支issue-101 上修复bug,并提交
            4.切回master,合并issue-101分支的修改,push到远程
            5.删除分支issue-101  git branch -d issue-101  没有合并的分支,需要强制删除  git branch -D issue-101
            6.因为我们一般在分支dev上工作,所以修复master上的bug也应该修复dev上的bug
                       切换到dev上 git checkout dev
                       使用 给git cherry-pick {commit} 将修复bug的那次提交复制过来
            6.继续刚才未完成的工作  git stash list 查看被另存的手头工作
                                                    git stash pop 将其恢复的工作区,并在另存的空间删除  或者 git stash apply 再 git stash drop 删除
多人协作:
    你和A一起开发,A先将他的代码推到了dev,之后你再推会被拒绝,需要先更新本地库,使用git pull
    然后解决冲突,再推送      
标签:
    命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定 git tag <tagname> <commit id>;
    命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
    命令git tag -d <tagname>  可以删除标签;
    命令git tag可以查看所有标签。    
    命令git show <tagname>查看标签的信息
    命令git push origin <tagname>可以推送一个本地标签;
    命令git push origin --tags可以推送全部未推送过的本地标签;
    命令git tag -d <tagname>可以删除一个本地标签;
    命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
自定义给git:
    1.给git输出加点颜色$ git config --global color.ui true
    2.有些文件需要添加在本地库中但是又不能推送到远程,可以使用.gitignore文件忽略他们
            创建.gitignore,在其中加入要忽略的文件类型或文件名
            不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。
            所有配置文件可以直接在线浏览:https://github.com/github/gitignore
            忽略文件的原则是:
                忽略操作系统自动生成的文件,比如缩略图等;
                忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
                忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
    3.给记不住的命令改个别名
            git config --global alias.lg "log --color --graph --pretty=format:‘%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset‘ --abbrev-commit"
            

 

以上是关于Git基础的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段15——git命令操作一个完整流程

如何管理在每个 git 版本中添加私有代码片段?

使用 Git 来管理 Xcode 中的代码片段

markdown Git代码片段

GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段

GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段