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

    Git学习

    本文是学习廖雪峰的官方网站所记

    一、Git简介

    1、Git的诞生

    Git是什么?

    Git是目前世界上最先进的分布式版本控制系统(没有之一)。

    Git有什么特点?简单来说就是:高端大气上档次!

    2、Git的安装

    安装完git后,在桌面右击找到git bash here即可弹出git命令窗口

    接着开始进一步配置,在命令函中输入

    $ git config --global user.name "Your Name"
    $ git config --global user.email "email@example.com"
    

    如下图

    因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。

    注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

    二、创建版本库

    1、git init 创建版本库

    在想要的地方创建一个文件夹,打开文件夹后,右击鼠标git bash here,然后再命令行窗口输入git init,即可在当前文件夹创建一个版本库。如下

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

    所有的版本控制系统,只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统则没法知道。

    这时,当前文件夹就成为了一个仓库,此文件夹的所有内容的增删改都会被记录,但此文件夹之外的文件则不做处理。

    2、git add 将文件添加到仓库

    可以使用git add来告诉当前文件需要被添加到仓库,只有被添加的文件才能被提交到仓库,如下

    $ git add readme.txt
    

    上面的方法以此只能添加一个文件,有时想要一次添加库中所有被修改的文件,则可以使用如下命令

    $ git add .
    

    3、git commit 将文件提交到仓库

    使用git commit告诉git将添加到库中的文件的文件提交到仓库,只有被提交到仓库中的文件,仓库才能详细记录文件的更改信息。如下操作

    $ git commit -m "wrote a readme file"
    [master (root-commit) eaadf4e] wrote a readme file
     1 file changed, 2 insertions(+)
     create mode 100644 readme.txt
    

    -m后面跟着的是本次提交的说明,可以输入任何内容,但最好都是有意义的文本,便于以后查看。

    git commit后面必须要接-m参数,如果-m为空,那么本次提交就会被中断。

    对于add、commit这两步的解释:

    • git add 就是把工作区的修改,提交到暂存区
    • git commit 把暂存区的修改,保存至本地库
    • git push 把本地库的记录,推送至远程库

    三、版本管理

    1、git log 查看所有的提交记录

    git log可以查看所有的提交记录,如下

    git log命令显示从最近到最远的提交日志,因此我们能看到很长很长一个日志信息,如果觉得输出的信息太多。

    2、--pretty=oneline 精简日志信息

    使用上述命令可以让日志变成一行,更适于观看。如下

    上面7726那个一大串数字就是提交的版本号信息

    3、git reset --hard head^ 回退版本

    head代表当前版本,head^代表上一个版本,同理,head^^^就代表上3个版本,若^太多了,则可以写成这样,head~100代表上100个版本,因此想要回退到上一个版本则可以如下书写

    $ git reset --hard head^
    HEAD is now at edea4b0 整理Git笔记
    

    现在我们再输入git log查看提交日志

    则会发现之前的版本提交日志已近不在日志中了。

    假如回退后后悔了,那如何再返回到之前的版本呢,这个简单,只要知道版本号我们就可以任意穿梭,虽然日志上没有之前的版本号信息了,但是我们看之前控制台的日志命令就可以知道上一个版本号是以7706开头,那么如下就可以还原了

    $ git reset --hard 7726
    HEAD is now at 7726701 添加autohotkey笔记
    

    但是如果我是昨天晚上回退的版本,今天早上又想还原,那么之前的日志版本号信息又不存在于控制台中,这时我们就可以使用如下命令

    4、git reflog 查看命令记录

    git reflog可以查看所有的输入过的命令,如下

    通过命令记录我么可以看出,7726版本号是曾经的head,因此当我们知道版本号后,又可以还原版本了。

    5、工作区和版本库

    工作区(Working Directory)

    就是你在电脑里能看到的目录,比如我的LearningNotes文件夹就是一个工作区:

    版本库(Repository)

    工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

    Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

    前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

    第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

    第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

    因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

    6、git status 查看工作区提交状态

    7、git diff HEAD -- xxx 查看工作区与版本库最新版的区别

    8、git checkout -- xxx 撤销修改

    命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

    一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

    一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

    总之,就是让这个文件回到最近一次git commitgit add时的状态。

    9、git rm 将文件从版本库中删除

    在Git中,删除也是一个修改操作,先添加一个新文件test.txt到Git并且提交:

    $ git add test.txt
    
    $ git commit -m "add test.txt"
    [master b84166e] add test.txt
     1 file changed, 1 insertion(+)
     create mode 100644 test.txt
    

    一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:

    $ rm test.txt
    

    这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:

    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add/rm <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
    	deleted:    test.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    

    现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

    $ git rm test.txt
    rm 'test.txt'
    
    $ git commit -m "remove test.txt"
    [master d46f35e] remove test.txt
     1 file changed, 1 deletion(-)
     delete mode 100644 test.txt
    

    现在,文件就从版本库中被删除了。

    另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

    $ git checkout -- test.txt
    

    git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

    注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!

    四:远程仓库

    1、关联远程仓库

    git remote add origin git@url
    

    origin就是远程仓库的别名,可以起别的名字,origin是默认叫法,推荐使用,让人一看就知道是远程仓库。

    url就是你的远程仓库地址,举个例子,如下

    $ git remote add origin git@github.com:HeMOua/learning-notes.git
    

    .git别忘了

    2、查看本地仓库与远程仓库的关联详情

    $ git remote -v
    

    3、解除远程仓库关联

    $ git remote rm origin
    

    4、推送本地库内容至远程仓库

    git push -u origin master
    

    把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

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

    只要本地作了提交,就可以使用简化命令:

    $ git push origin master
    

    把本地master分支的最新修改推送至GitHub,现在,我们就拥有了真正的分布式版本库!

    5、关于报错

    在push时可能会出现如下错误

    $ git push -u origin master
    Connection reset by 192.30.253.112 port 22
    fatal: Could not read from remote repository.
    
    Please make sure you have the correct access rights
    and the repository exists.
    

    下面将根据网络上的资料,以及个人调试来解决这个问题

    5.1 获取git的身份,即名字和邮箱

    5.2 删除电脑中的.ssh文件夹

    通过everything搜索或者直接找,一般这个文件夹放在C:/Users/{currentUser}/.ssh

    5.3 git输入命令

    $ ssh-keygen -t rsa -C "user.email"
    

    如下图

    然后会出现,不管他,一直点回车就行

    Generating public/private rsa key pair.
    Enter file in which to save the key (/c/Users/fangq/.ssh/id_rsa):
    

    最后会变成这样

    这时会在.ssh文件夹自动生成id_rsaid_rsa.pub,用记事本打开id_rsa.pub复制里面的内容。

    5.4、登录github,进入ssh设置



    然后将复制的内容填写到key中,点击add ssh key,然后再重新push一遍,over

    5.5 其他解决办法

    如果在第一步中创建时已经初始化过项目,则这时会提醒

    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.

    因为远程库中已经存在readme文件了,所以需要先pull下来。命令如下:

     $ git pull origin master
    

    这时又会报错:

    branch master -> FETCH_HEAD fatal: refusing to merge unrelated histories

    说这两个库有不相干的历史记录而无法合并,这时我们可以加上一个参数 --allow-unrelated-histories 即可成功pull:

     $ git pull origin master --allow-unrelated-histories
    

    但是这时会可能会提示必须输入提交的信息,默认会打开vim编辑器,先按 i 切换到插入模式,写完后 Esc→:→wq 即可保存退出编辑器。如果不进入vim编辑器,则会自动生成一个合并代码的commit。然后再使用前面的命令push将本地提交推送到远程仓库。后面如果本地还有commit,就可以直接用 git push origin master 推送。

    6、克隆仓库

    登录GitHub,会发现里面有许多有趣的项目,或者我们自己在GitHub中上传的项目,当我们想把它下载到我们的电脑以做永久保存时,可以使用克隆命令git clone

    首先打开一个文件夹,我们将要把网上克隆下载的仓库放置这里,然后右击鼠标找到git base here,输入如下命令

    $ git clone git@github.com:HeMOua/learning-notes.git
    

    这样就可以克隆一个项目到文件夹中了。

    GitHub给出的地址不止一个,还可以用https://github.com/HeMOua/learning-notes.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。

    下面将具体展示使用方法。

    首先点击1然后复制2中的地址,然后再git命令窗口输入git clone,后面打上一个空格再紧跟着我们刚复制的地址。通过3可以切换使用https的方式还是ssh的方式。

    五、分支管理

    1、查看当前分支

    $ git branch
    

    git branch会列出所有的分支,并在当前的分支前面加一个*

    2、创建分支dev

    $ git branch dev
    

    3、切换分支至dev

    $ git checkout dev
    

    因为checkout命令与前面讲的撤销修改命令是同一个命令,容易让人迷惑,因此最新的git版本提供了新的命令git switch来切换分支,如下

    $ git switch master
    

    3.1 switch命令报错

    gitswitch命令是2.23版本发布的,通过如下命令查看git的版本

    $ git --version
    

    若是2.17.1之前的版本可以使用如下命令进行升级git

    $ git update
    

    若是2.17.1之后的版本可以使用如下命令进行升级git

    $ git update-git-for-windows
    

    4、创建并切换到dev分支

    $ git checkout -b dev
    

    git checkout命令加上-b参数表示创建并切换,或使用

    $ git switch -c dev
    

    5、合并当前分支到指定的分支

    $ git merge dev
    

    Fast-forward代表快进模式,就是将当前分支的指针指向指定的分支。

    6、删除分支dev

    $ git branch -d dev
    

    7、查看分支合并图

    $ git log --graph --pretty=oneline --abbrev-commit
    

    参数--graph用来查看分支合并图

    参数--pretty=oneline表示以单行风格显示

    参数--abbrev-commit表示简化提交版本号

    8、--no-ff合并

    有时fast-forward合并方式,会丢掉部分分支信息,我们可以禁用fast-forward合并方式,merge时就会生成一个新的commit可以看出分支信息。如下

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

    9、存储库

    当我们的工作做到一半时,突发紧急事件需要立即切换到其他分支,但是当前的工作只做到一半,还不能提交,这时我们就可以使用stash,将我们的当前状态保存起来,如下

    $ git stash
    

    然后我们就可以去其他分支,在其他分支上的事忙完了后,再切换到之前我们工作的分支,我们可以使用如下命令来查看我们之前的工作信息保存到哪里去了

    $ git stash list
    stash@{0}: WIP on dev: f52c633 add merge
    

    现在我们来恢复它

    $ git stash apply stash@{0}
    

    但是上面的命令在工作区恢复后,stash库并不会删除,要是我们想回复并删除的话,我们可以使用如下命令

    $ git stash pop
    

    10、择优挑选

    假如我们当前在dev分支中,dev是从master分出一个分支,在dev分支开发的同时,master分支也进行了更新,如果我们想把master中的某些提交修改复制到dev中,我们就可以使用择优挑选cherry-pick命令,如下

    $ git cherry-pick 4c805e2
    

    通过git cherry-pick后接提交版本号,我们可以将当前分支的父分支的之后的某次修改提交复制过来

    11、强行删除分支

    $ git branch -D <name>
    

    12、多人协作

    多人协作的工作模式通常是这样:

    1. 首先,可以试图用git push origin <branch-name>推送自己的修改;
    2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
    3. 如果合并有冲突,则解决冲突,并在本地提交;
    4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

    如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

    • 查看远程库信息,使用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,如果有冲突,要先处理冲突。

    13、变基

    $ git rebase
    

    看不懂,暂写个命令

    六、标签管理

    1、git tag <name> 创建标签

    首先切换到需要打上标签的分支,然后通过如下命令新建标签

    $ git switch master
    $ git tag v1.0
    

    2、git tag 查看所有标签

    $ git tag
    

    3、git tag <name> <commit id> 指定版本创建标签

    首先通过git log查看日志信息以获取版本号,如下

    $ git log
    ……
    $ git tag v0.0 f523c
    

    标签不是按时间顺序标出的,而是按字母顺序排序。

    4、git show <tagname> 查看指定标签信息

    $ git show v0.9
    commit f52c63349bc3c1593499807e5c8e972b82c8f286 (tag: v0.9)
    Author: Michael Liao <askxuefeng@gmail.com>
    Date:   Fri May 18 21:56:54 2018 +0800
    
        add merge
    
    diff --git a/readme.txt b/readme.txt
    ...
    

    5、 创建带说明的标签

    $ git tag -a v0.1 -m "version 0.1 released" 1094adb
    

    -a指定标签名,-m指定说明文字,最后再加上指定的版本号

    注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

    6、删除标签

    $ git tag -d v1.0
    

    7、推送标签至远程

    默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后必须显式地推送标签到共享服务器上。 这个过程就像共享远程分支一样——你可以运行如下代码 。具体说明

    $ git push origin v1.0
    

    或者一次性推送所有标签,如下

    $ git push origin --tags
    

    8、删除远程标签

    如下命令可以删除一个远程标签。

    $ git push origin :refs/tags/<tagname>
    

    七、自定义Git

    1、忽略特殊文件

    在工作区的根目录下创建一个名为.gitignore,在此文件内文件名,git就不会对其进行管理。

    1.1 强制添加文件

    $ git add -f App.class
    

    1.2 检查忽略文件的对应规则

    $ git check-ignore -v App.class
    .gitignore:3:*.class	App.class
    

    1.3 取消追踪

    若文件已经被追踪,就是已经add/commit,那么之后.gitignore即使配置了忽略也不会生效,可以使用如下命令取消追踪。

    $ git rm --cached <filename>
    

    2、配置别名

    git config --global alias.<aliasname> <realName>
    

    3、配置文件

    存放在.git/config目录下

  • 相关阅读:
    SpringCloud教程第10篇:高可用的服务注册中心(F版本)
    SpringCloud教程第9篇:Sleuth(F版本)
    requests.session保持会话
    Jmeter Constant Throughput Timer 使用
    Jmeter提取响应数据的结果保存到本地的一个文件
    练习2
    练习1
    一道简单的练习题
    Maven下org.junit.Test无法使用
    [转]解决pycharm无法导入本地包的问题(Unresolved reference 'tutorial')
  • 原文地址:https://www.cnblogs.com/hemou/p/12273120.html
Copyright © 2011-2022 走看看