• 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目录下

  • 相关阅读:
    从零开始入门 K8s | 应用编排与管理
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    203. Remove Linked List Elements
    183. Customers Who Never Order
    182. Duplicate Emails
    181. Employees Earning More Than Their Managers
    1261. Find Elements in a Contaminated Binary Tree
    1260. Shift 2D Grid
  • 原文地址:https://www.cnblogs.com/hemou/p/12273120.html
Copyright © 2020-2023  润新知