zoukankan      html  css  js  c++  java
  • git学习笔记

    详细的git学习教程等在网上都有许多,如:

    1.https://git-scm.com/【git官网】

    2.https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000【廖雪峰老师的,讲的比较细,通俗易懂】

    然后在这个学习过程中遇到一些问题记录下来,方便以后回顾:

    1. git是目前最先进的分布式版本控制系统
    2. BitMover公司收回Linux社区对BitKeeper的免费使用权
    3. 导致Linus使用C编写了Git
    4. 集中式:版本库是集中存放在中央服务器的,先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。最大的缺点还是必须要联网才能使用。
    5. 分布式:分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,但通常也有一台充当“中央服务器”的电脑,这个服务器的作用仅仅是用来方便“交换”大家的修改,因为可以两两电脑之间进行操作,所以不用联网也能使用。
    6. 安装gitLinux:sudo apt_get install git
    7. 安装gitwindows】:地址:https://git-scm.com/downloads下载后默认安装即可,将git下的bin添加至环境变量中,或直接点击Bash.exe运行git
    8. 安装后的用户配置(表示你这台机器上所有的Git仓库都会使用这个配置) :

    git config --global user.name ”xiong@ying”

    git config --global user.email xiong@example.com

       9.安装后的用户配置(这是对某个的版本库配置,比如建了一个文件夹test之后,使用cmd进入到该文件夹,使用git init创建文件test为仓库,这时使用以下就是对该仓库test进行的用户配置):

    git config  user.name ”xiong@ying”

    git config  user.email xiong@example.com

    1、创建版本库(repository:版本库以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。进入cmd命令提示符,进入文件目录下,使用命令:git init   可创建版本库

    创建版本库后,默认会增加.git的一个文件,因为这个文件默认是隐藏的,所以我们无法看到。

     

    另外为了能正确的使用和管理,文件名称不要为中文字符

    2、工作区与版本库:

     

    工作区:就是电脑里我们能看到的目录,比如刚才建立的TestGit文件目录

    版本库:就是工作区中隐藏的.git目录

    git add 将文件从工作区添加到暂存区中

    git commit将文件从版本库中提交到分支,(因为使用git init创建版本库时,默认就创建了master分支,所以这里也是默认提交到master分支):【使用git commit命令会把暂存区的所有文件提交至分支】

    git commit -m “first commit”

    git commit -m “second commit”

     git log :用于查看提交(commit)历史

    打圈的就是提交信息时的commit信息

    使用一行来展示提交(commit)的log:

    git log --pretty=oneline(注意等号左右不能有空格)。

     

    git reflog :查看命令历史,以便确定要回到未来的哪个版本

     版本回退:当我们已经从暂存区将文件提交到分支之后,通过git reset命令可以进行版本的回退

    当前版本HEAD,上一个版本HEAD^ ,上上一个版本HEAD^^,往上100个版本HEAD~100

    git reset --hard HEAD^ 回退到上一个版本

    git reset --hard HEAD^^

    git reset --hard HEAD~3

    git reset --hard 109....   (版本号)

    撤销修改:git checkout -- filename.txt:【“--”非常重要,如果没有就变成了“切换到另一个分支”的命令】【就是将分支中的文件放入到工作区或暂存区中】

    有两种:

    1.文件修改只在工作区中,即未做git add操作

    2.文件修改并已经放在了暂存区中,即做了git add 操作,但未做git commit操作

    用命令git reset HEAD filename.txt可以把暂存区的修改撤销掉(unstage),重新放回工作区,

    git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本,因为最新版相当于是在分支上的,所以使用HEAD就是撤回】

    如果已经提交到了分支,即使用了git commit命令,那么就要用git reset 命令来回退了。

    删除文件,可以手动到文件管理中删除,也可以使用命令操作:

    rm filename.txt

    这时工作区与版本库中的就不一样了,使用git status查看

    git rm 命令表示版本库中也删除该文件

    git rm filename.txt

    如果在工作区是误删,可以使用git checkout -- filename.txt来将版本库中的撤销到工作区中

    git checkout -- filename.txt

    现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。

    以下为一个具体的实例:

    首先我在本地建议一个目录,名字为git,然后使用git init将目录变为版本库,然后再在git目录下建两个文件index.txt、test.txt

    然后先到github.com中建立一个respository,名字为git

    在GitHub上的这个git仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库,现在我们就将本地的git仓库的内容推送到GitHub中的git远程仓库中。

     要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;【git remote add origin git@github.com:fireporsche/git.git

    关联后,使用命令git push -u origin master第一次推送master分支的所有内容,这样推送时发现如下错误:

    C:UsersxiongDesktopgit>git remote add origin git@github.com:fireporsche/git.git
    
    C:UsersxiongDesktopgit>git push -u origin master
    error: src refspec master does not match any.
    error: failed to push some refs to 'git@github.com:fireporsche/git.git'

    通过上网查资料才发现【https://www.cnblogs.com/jeremylee/p/5715289.html】,这是因为我的版本库中文件为空,即没有将工作目录中的文件提交到版本库中,所以需要git add    git commit命令进行提交,如下:

    C:UsersxiongDesktopgit>git add .
    
    C:UsersxiongDesktopgit>git commit -m 'first commit'
    error: pathspec 'commit'' did not match any file(s) known to git.

    又出现错误,大概意思就是说没有文件可commit,通过查询才明白【https://blog.csdn.net/huahua78/article/details/52330792】,原来windows中要使用双引号,使用单引号无效,所以更改为git commit -m "first commit"就可以成功提交。然后继续git push -u origin master,有发现如下错误:

    大概意思就是推送时,认证失败,通过查询【https://blog.csdn.net/huahua78/article/details/52330792】,才发现是需要ssh key的,下面进行ssh key的创建:

    使用ssh-keygen -t rsa -C "1161137899@qq.com"生成ssh key

    C:UsersxiongDesktopgit>ssh-keygen -t rsa -C "1161137899@qq.com"
    Generating public/private rsa key pair.
    Enter file in which to save the key (C:Usersxiong/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in C:Usersxiong/.ssh/id_rsa.
    Your public key has been saved in C:Usersxiong/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:h3oYUyuWol138R/GCt7aeGIn03Jvv523aSBlwtCXjp0 1161137899@qq.com
    The key's randomart image is:
    +---[RSA 2048]----+
    |          .   .  |
    |         . . o   |
    |        . + = .  |
    |       o o * E   |
    |    . B S + = +  |
    |   o + B + + = . |
    |  . . o . ..+ o  |
    |       .  *+= ..=|
    |         .oO.oo**|
    +----[SHA256]-----+

    会在本地C:Users你的用户名.ssh生成文件夹,里面有id_rsa和id_rsa.pub两个文件 


    然后复制id_rsa.pub文件里面的内容,到https://github.com/settings/keys新建一个后如下图所示:

    这时再使用git push -u origin master就能成功推送了:

    C:UsersxiongDesktopgit>git push -u origin master
    Warning: Permanently added the RSA host key for IP address '52.74.223.119' to the list of known hosts.
    Enter passphrase for key '/c/Users/xiong/.ssh/id_rsa':
    Enter passphrase for key '/c/Users/xiong/.ssh/id_rsa':
    Counting objects: 4, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (4/4), done.
    Writing objects: 100% (4/4), 351 bytes | 0 bytes/s, done.
    Total 4 (delta 0), reused 0 (delta 0)
    To git@github.com:fireporsche/git.git
     * [new branch]      master -> master
    Branch master set up to track remote branch master from origin.

    由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令【git pull origin master     git push origin master】。

    此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改。

    如上是先有本地库,后有远程库的时候,如何关联远程库,现在先创建远程库,然后,从远程库克隆

    进入到要克隆文件的目录:

    C:Usersxiong>cd C:UsersxiongDesktop
    
    #地址的第一种方式
    C:UsersxiongDesktop>git clone git@github.com:fireporsche/learngit.git
    Cloning into 'learngit'...
    Enter passphrase for key '/c/Users/xiong/.ssh/id_rsa':
    warning: You appear to have cloned an empty repository.
    Checking connectivity... done.
    
    #地址的第二种方式
    C:UsersxiongDesktop>git clone https://github.com/fireporsche/learngit.git
    Cloning into 'learngit'...
    warning: You appear to have cloned an empty repository.
    Checking connectivity... done.

    然后在桌面就能看到learngit文件夹了

    分支管理

    创建分支:git branch dev

    切换分支:git checkout dev

    合起来:git checkout -b dev

    场景:

    切换到dev分支:git checkout dev

    做更改后提交:git add test.txt   git commit -m “first commit” 这时是提交到的dev分支

    切换至master分支:git checkout master

    dev分支合并到master分支:git merge dev 将指定的分支合并到当前分支

    合并完后删除分支:git branch -d dev

    合并分支时,如果可能,git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息.

    如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

    git merge --no-ff -m "merge with no-ff" dev

    这样当我们删除了分支后,使用git log还能看到提交的版本号了

    实践过程中遇到的一个问题:

    我本地有master和yingcai分支,远程有master,develop,yingcai分支,然后我在本地先拉取master或develop的代码git pull origin develop后进行修改,然后进行代码的push即git push origin develop,但是会报以下错误:

    通过同事的帮助,才发现本地每个分支必须与远程端一一对应,我本地的master分支是没有和远程的develop分支对应的,所以无法push到对应的develop分支:

    git checkout -b develop origin/develop   【先在本地创建远程的develop到本地,并且切换到本地的develop分支】

    git pull origin develop   【把远程develop的代码拉取下来】

    git add .      git commit -m "commit"    【进行代码的更改后进行提交】

    git push origin develop    【把代码push到远程的develop分支】

    bug分支:当我们接到BUG时,可以建立一个BUG分支进行BUG的修复,但是可能自己手上真正的工作还没有完成,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

    git stash  这样使用git status查看工作区就是干净的,然后确定自己想要在哪个分支(比如master)下建立bug分支,按以上操作后提交bug的修复后删掉bug分支。

    具体的操作:

    本地工作的方式,当前分支为dev
    Git stash   【隐藏工作】
    Git checkout master  【切换到master分支】
    git checkout -b issue01   【创建并切换到bug分支】
    Git add .   【对bug进行修复后进行代码提交】
    Git commit -m “issue01” 【对bug进行修复后提交】
    Git checkout master  【切换至master分支】
    Git  merge --no-ff -m "merged bug fix 01" issue01  【将bug分支与master分支合并】
    Git checkout dev   【切换到dev分支继续进行工作】
    Git stash list    【查看之前隐藏的内容是否存在】
    Git stash apply    【恢复所有隐藏的内容】
    Git stash apply stash@{0} 【恢复指定的stash内容,后面的stash@{0}是通过git stash list得到的】
    Git stash drop     【删除stash的内容】
    Git stash pop      【git stash apply+git stash drop】

    feature分支:

    添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支

    git checkout -b feature1
    git add .
    git commit -m "commit"
    git checkout master
    #如果接到通知说不需要此功能了,直接删除该分支
    git branche -d feature1
    error: The branch 'feature1' is not fully merged.
    If you are sure you want to delete it, run 'git branch -D feature1'.
    #所以使用-D进行强制的删除
    git branche -D feature1

    多人协作:

    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin

    git checkout -b develop origin/develop#先在本地创建远程的develop到本地,并且切换到本地的develop分支
    git pull origin develop #把远程develop的代码拉取下来
    git add .      
    git commit -m ‘commit’
    git push origin develop#把代码push到远程的develop分支
    • 查看远程库信息,使用git remote -v

    • 本地新建的分支如果不推送到远程,对其他人就是不可见的;

    • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

    • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

    • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name

    • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突

  • 相关阅读:
    阿里云CentOS 7无外网IP的ECS访问外网(配置网关服务器)
    CentOS 7配置成网关服务器
    Mac/Ubuntu下的数据建模工具PDMan,替代PowerDesigner
    Docker卸载高版本重装低版本后启动提示:driver not supported
    Redis连接出现Error: Connection reset by peer的问题是由于使用Redis的安全模式
    Mac流量监控/硬盘监控小工具
    CentOS 7创建自定义KVM模板(现有KVM迁移到另外一台机)
    vi显示行号
    阿里云与微软云的对照表
    CentOS下安装Jenkins(Docker/war/tomcat/java -jar)
  • 原文地址:https://www.cnblogs.com/fireporsche/p/6288650.html
Copyright © 2011-2022 走看看