• Git使用记录



    • 创建版本库
      什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

    所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:

    $ mkdir learngit
    $ cd learngit
    $ pwd
    /Users/michael/learngit
    

    pwd命令用于显示当前目录。在我的Mac上,这个仓库位于/Users/michael/learngit。

    如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。

    第二步,通过git init命令把这个目录变成Git可以管理的仓库:

    $ git init
    Initialized empty Git repository in /Users/michael/learngit/.git/
    

    瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。

    如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。

    也不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的。不过,不建议你使用自己正在开发的公司项目来学习Git,否则造成的一切后果概不负责。

    初始化一个Git仓库,使用git init命令。
    
    添加文件到Git仓库,分两步:
    
    第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;
    
    第二步,使用命令git commit -m "message",完成。
    
    要随时掌握工作区的状态,使用git status命令。
    
    如果git status告诉你有文件被修改过,用git diff可以查看修改内容。
    
    HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
    
    穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
    
    要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
    
    每次修改,如果不add到暂存区,那就不会加入到commit中。
    
    git checkout -- filename 可以丢弃工作区的修改
    总之,就是让这个文件回到最近一次git commit或git add时的状态。
    
    git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。
    
    命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
    $ git rm test.txt
    文件就从版本库中被删除了。
    另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
    $ git checkout -- test.txt
    
    git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
    
    

    添加远程仓库

    要关联一个远程库,使用命令git remote add origin git@github.com:songdanzju/repo-name.git;
    
    关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
    
    此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
    

    创建远程库,克隆到本地

    $ git clone git@github.com:songdanzju/repo-name.git
    

    create a new repository on the command line

    echo "# Django-sample" >> README.md
    git init
    git add README.md
    git commit -m "first commit"
    git remote add origin https://github.com/songdanzju/Django-sample.git
    git push -u origin master
    

    push an existing repository from the command line

    git remote add origin https://github.com/songdanzju/Django-sample.git
    git push -u origin master
    

    git push报错error: failed to push some refs to 'git@github.com:

    $ git push -u origin master
    To git@github.com:xxx/xxx.git
    ! [rejected] master -> master (fetch first)
    error: failed to push some refs to 'git@github.com:xxx/xxx.git'
    hint: Updates were rejected because the remote contains work that you do
    hint: not have locally. This is usually caused by another repository pushing
    hint: to the same ref. You may want to first integrate the remote changes
    hint: (e.g., 'git pull ...') before pushing again.
    hint: See the 'Note about fast-forwards' in 'git push --help' for details.
    
    

    原因:
    GitHub远程仓库中的README.md文件不在本地仓库中。
    解决方案:

    $ git pull --rebase origin master
    $ git push -u origin master
    

    git关联github远程库

    #要关联一个远程库,这里repo-name是你在github中创建的repository的name,使用命令
    git remote add origin git@github.com:songdanzju/repo-name.git
    
    #关联后,第一次推送master分支的所有内容,使用命令
    git push -u origin master
    
    #此后,每次本地提交后,只要有必要,推送最新修改,就可以使用命令
    git push origin master
    
    

    从远程库克隆

    首先,登陆GitHub,创建一个新的仓库,名字叫gitskills:

    我们勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件:

    下一步是用命令git clone克隆一个本地库:

    $ git clone git@github.com:songdanzju/gitskills.git
    Cloning into 'gitskills'...
    remote: Counting objects: 3, done.
    remote: Total 3 (delta 0), reused 0 (delta 0)
    Receiving objects: 100% (3/3), done.
    
    $ cd gitskills
    $ ls
    README.md
    

    创建分支branch

    首先,我们创建dev分支,然后切换到dev分支:

    $ git checkout -b dev
    Switched to a new branch 'dev'
    

    git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

    $ git branch dev
    $ git checkout dev
    Switched to branch 'dev'
    

    然后,用git branch命令查看当前分支:

    $ git branch
    * dev
    master
    

    git branch命令会列出所有分支,当前分支前面会标一个*号。

    然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:

    Creating a new branch is quick.
    

    然后提交:

    $ git add readme.txt 
    $ git commit -m "branch test"
    [dev fec145a] branch test
    1 file changed, 1 insertion(+)
    

    现在,dev分支的工作完成,我们就可以切换回master分支:

    $ git checkout master
    Switched to branch 'master'
    

    切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

    现在,我们把dev分支的工作成果合并到master分支上:

    $ git merge dev
    Updating d17efd8..fec145a
    Fast-forward
    readme.txt | 1 +
    1 file changed, 1 insertion(+)
    

    git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

    注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

    当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

    合并完成后,就可以放心地删除dev分支了:

    $ git branch -d dev
    Deleted branch dev (was fec145a).
    

    删除后,查看branch,就只剩下master分支了:

    $ git branch
    * master
    

    因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

    小结

    Git鼓励大量使用分支:

    查看分支:git branch
    
    创建分支:git branch <name>
    
    切换分支:git checkout <name>
    
    创建+切换分支:git checkout -b <name>
    
    合并某分支到当前分支:git merge <name>
    
    删除分支:git branch -d <name>
    
  • 相关阅读:
    简单排序算法
    线程池第二篇:线程池相关类
    枚举的使用
    线程池第一篇:线程池相关接口
    mysql InnoDB引擎与MyISAM引擎区别及索引原理
    待重写
    mysql登录命令
    浅拷贝、深拷贝
    grpc:What is gRPC
    protocol buffer第一篇:语法介绍
  • 原文地址:https://www.cnblogs.com/songdanzju/p/7493385.html
Copyright © 2020-2023  润新知