• 关于git的学习


    Git是目前世界上最先进的分布式版本控制系统(没有之一)!
    由于现在用的还不多,还没有这种体会,但是前人的经验是值得借鉴的,所以我认真的学习了一些关于git的简单操作,现在在这分享一些心得,或者说是为团队及个人留一些笔记供后续使用进行参考。(主要讲的是windows下的操作,虽然听说windows是最烂的开发平台-

    git的安装

    • 前往 https://git-for-windows.github.io 下载模拟环境和git打包好的git版本,直接默认安装就行。
    • 安装完成之后在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
    • 安装完成后还需要最后一步设置,在命令行输入:
    $ git config --global user.name "Your Name"
    $ git config --global user.email "email@example.com" 
    

    创建版本库

    • 选择一个合适的地方,创建一个空目录:

      <font color=#ff0000 size=>请确保目录名(包括父目录)不包含中文

    • 通过git init命令把这个目录变成Git可以管理的仓库

    $ git init
    Initialized empty Git repository in /Users/***/***/.git/
    
    • 仓库建好后可以在该目录下或者该目录的子目录下创建文件,文件创建好以后:
      • git add ***.txt
      • git commit -m "add ***.txt"
    $ git add *.txt
    $ git commit -m "wrote a *** file"
    [master (root-commit) cb926e7] wrote a *** file
     1 file changed, 2 insertions(+)
     create mode 100644 ***.txt
    

    出现如上情况则说明已将文件提交到仓库!

    远程仓库

    1. 创建ssh key,在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Git Bash,创建SSH Key:
    $ ssh-keygen -t rsa -C "youremail@example.com"
    

    邮件地址写成自己的!!
    2. 登录coding.net,在账户那边添加公钥,公钥名称自定义,公钥内容则是.ssh 目录下的id_ras.pub的文件内容,复制上去即可。
    3. 新建一个项目,然后将该项目的ssh信息复制下来,在git下运行以下命令:

    $ git remote add origin **
    

    <font color=#ff0000 size=>** 表示你刚刚复制的ssh信息
    4. 把本地内容推送到远程仓库:

    $ git push -u origin master
    Enter passphrase for key '/c/Users/lenovo/.ssh/id_rsa':
    Counting objects: 2, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (1/1), done.
    Writing objects: 100% (2/2), 226 bytes | 0 bytes/s, done.
    Total 2 (delta 0), reused 0 (delta 0)
    To git@git.coding.net:liushibubingyihan/test1.git
       814c331..ba16318  master -> master
    Branch master set up to track remote branch master from origin.
    

    第一次推送才需要-u参数,之后就可省略不写
    5. 克隆远程库:一般我们都是先建远程库,之后再建本地目录从远程库克隆下来。首先建好远程库,然后执行:

    $ git clone **
    Cloning into 'gitskills'...
    remote: Counting objects: 3, done.
    remote: Total 3 (delta 0), reused 0 (delta 0)
    Receiving objects: 100% (3/3), done.
    

    **是远程库的ssh支持的git协议,复制粘贴即可

    “后悔药”

    1. 版本回退
      • 多次提交之后,我们可以通过git log可查看历史记录

        commit后面跟着的一串数字就是版本号
      • 我们要回退到之前的版本,只需要git reset --hard + 版本号(版本号可以只写前面的四位左右)就可以回到对应的版本
      • 现在我们再git log看看,发现在你回到的版本之后的版本号找不到了,你可以试试git reflog会发现版本号都在,这时候就可以松一口气了!可以继续使用git reset --hard + 版本号回到你想去的地方。
    2. 撤销修改
      • git checkout -- file可以撤销工作区的修改,分两种情况:

        • 还未提交到暂存区,所以回到跟版本库一样的状态

        • 提交到了暂存区,所以回到与暂存区一样的状态

      • 提交到了暂存库要回到工作区,可以用git reset HEAD file,可以把暂存区的修改撤销掉(unstage),重新放回工作区,接着就回到情形一一样的情况,同样git checkout -- file即可!

      • 暂存区内容提交到版本库,可以利用第一节的版本回退撤销本次的提交!

    3. 删除文件
      • 将一个文件提交到版本库,然后删除文件管理器的文件
    $ rm file
    

    使用git status可以马上查看哪些文件被删除了

    现在有两种情况:
    * 从版本库删除该文件,使用git rm file,并且git commit:
    * 从版本库恢复该文件,使用git checkout -- file:

    $ git checkout -- b.txt
    

    分支管理

    1. 创建和合并分支:
      • 创建dev分支并切换到该分支
    $ git checkout -b dev
    Switched to a new branch 'dev'
    

    git branch可查看分支,前面带*的为当前分支
    * 往该分支addcommit
    * 切换回master分支

    $ git checkout master
    
      * 将`dev`分支内容合并到`master`分支
    
    $ git merge dev
    Updating d17efd8..fec145a
    Fast-forward
     readme.txt |    1 +
     1 file changed, 1 insertion(+)
    
      * 删除`dev`分支
    
    $ git branch -d dev
    
    1. git merge branch的时候,删除分支以后就无法查看历史记录,所以我们可以改为git merge --no-ff -m "merge with --no-f" branch这样就会生成一个commit,之后可以用git log查看分支历史。
    $ git merge --no-ff -m "merge with no-ff" dev
    Merge made by the 'recursive' strategy.
     readme.txt |    1 +
     1 file changed, 1 insertion(+)
    
    1. git branch -D branch_name强行删除不需要的分支
    2. 多人协作:
      • git remote可以查看远程库
    $ git remote
    origin
    
      * 首先,可以试图用`git push origin branch-name`推送自己的修改;
    
      * 如果推送失败,则因为远程分支比你的本地更新,需要先用`git pull`试图合并;
    
      * 如果合并有冲突,则解决冲突,并在本地提交;
    
      * 没有冲突或者解决掉冲突后,再用`git push origin branch-name`推送就能成功!
    
      * 如果`git pull`提示`“no tracking information”`,则说明本地分支和远程分支的链接关系没有创建,用命令`git branch --set-upstream branch-name origin/branch-name`。
    

    对比git pullgit pull --rebase

    应助教的提问,找了许多资料,大体理解了这两者的联系与区别:
    
    • git pull = git fetch + git merge
      git pull --rebase = git fetch + git rebase
      所以说来,两者的区别就是git merge 与 git rebase 的区别

    • 创建完新分支时是这样的:

    • dev分支下完成提交,同时有其他人在origin做了修改和提交

      这时候E提交的话会产生冲突,有下面两种方式解决:

      • git merge
        用git pull命令把"origin"分支上的修改pull下来与本地提交合并(merge)成版本M
      • git rebase

      创建一个新的提交R,R的文件内容和上面M的一样,但我们将E提交废除,当它不存在。由于这种删除避免了菱形的产生,保持提交曲线为直线,让大家易于理解。

      说到这,应该清楚了两者的区别了,个人理解就是git merge 保留的分支记录,而git rebase则是像修改历史一样,没人知道之前分支的存在记录。到底该用哪个,还是要具体时候具体分析,各有各的特点。

    总结:

    • 本文是看过廖雪峰的官方网站的git教程后做的一些总结,主要是一些常用的操作,再加上自己的一些实验以及心得。
    • 当看到助教问的关于git pullgit pull --rebase的问题的时候有点懵,因为之前只听过git pull,倒是不曾听过什么git pull --rebase,查了许多其他大神的博客才略有理解。
    • 希望git 能为自己团队的后续开发有帮助吧!
  • 相关阅读:
    luogu_P1850 换教室
    luogu_P3224 [HNOI2012]永无乡
    luogu_P1064 金明的预算方案
    luogu_P2014 选课
    luogu_P3372 【模板】线段树 1(动态开点)
    luogu_P2852 [USACO06DEC]牛奶模式Milk Patterns
    luogu_P1941 飞扬的小鸟
    luogu_P2678 跳石头
    luogu_P1638 逛画展
    【Tyvj2046】掷骰子
  • 原文地址:https://www.cnblogs.com/linbingfeng/p/5989193.html
Copyright © 2020-2023  润新知