Git知识总结

Git安装

windows

  • 在git官网中下载安装程序,然后按默认选项安装即可

  • 安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

  • 安装完成后,还需要最后一步设置,在命令行输入:

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

创建版本库

  • 创建空目录

    $ cd d:/github
    $ mkdir test
    $ cd test
    $ pwd
    /d/github/test

    pwd用于显示当前目录

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

    $ git init
    Initialized empty Git repository in D:/github/test/.git/

添加或修改版本库中文件

  • 把文件添加到版本库

    1. 使用命令git add <file>,注意,可反复多次使用,添加多个文件;

      $ git add readme.txt
    2. 使用命令git commit -m <message>,完成。

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

      -m后面输入的是本次提交的说明

  • 修改版本库中的文件

    修改文件后可按照添加文件时的相同操作将文件添加到版本库中

    1. 要随时掌握工作区的状态,使用git status命令。

      1. 修改文件后未git add

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

        $ git status
        On branch master
        Changes to be committed:
        (use "git reset HEAD <file>..." to unstage) modified: readme.txt
      3. git commit

        $ git status
        On branch master
        nothing to commit, working tree clean
    2. 如果git status告诉你有文件被修改过,用git diff可以查看修改内容

版本回退

  • git log命令查看历史提交记录

    可以加上--pretty=oneline参数显示关键信息

    $ git log --pretty=oneline
    1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
    e475afc93c209a690c39c13a46716e8fa000c366 add distributed
    eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
  • 版本回退

    $ git reset --hard HEAD^
    HEAD is now at e475afc add distributed

    HEAD表示当前版本,HEAD^ 表示上一版本,HEAD^^表示上上一版本

    上100个版本表示成HEAD~100

  • git reflog用来记录你的每一次命令,可以通过git reflog 找到你所想要回退的版本对应的commit id 然后进行回退

    $ git reset --hard 1094a

    这里 commit id可以不用写全,写前几位能够唯一对应即可

  • 一般git log 用于回退到历史版本,git reflog用于回到先前或者未来版本

工作区与暂存区

  • 工作区

    电脑里能看到的目录,例如之前创建的test

  • 版本库

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

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

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

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

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

撤销修改

  • git checkout -- file可以丢弃工作区的修改

    $ git checkout -- readme.txt

    命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,让这个文件回到最近一次git commitgit add时的状态

  • 命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区

    $ git reset HEAD readme.txt
    Unstaged changes after reset:
    M readme.txt
  • 已经提交了不合适的修改到版本库时,想要撤销本次提交,根据之前版本回退的知识,将版本回退到对应版本

删除文件

  • 首先将文件通过文件管理器或者rm命令删除

    $ rm test.txt
  • 此时可以进行两种操作:

    1. 一种是确实要从版本库中删除该文件,先用命令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
    2. 令一种情况是删错了,可以通过版本库把误删的文件恢复到最新版本

      $ git checkout -- test.txt

远程仓库

  • 前置操作

    1. 创建SSH Key

      打开Shell(Windows下打开Git Bash),创建SSH Key

      $ ssh-keygen -t rsa -C "youremail@example.com"

      如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人

    2. 登陆GitHub,添加SSH Key

      点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容

  • 添加远程库

    1. 登录Github创建新仓库

    2. 将该仓库与本地仓库相关联

      git remote add origin git@server-name:path/repo-name.git

      $ git remote add origin https://github.com/NoahQue/test.git

      origin 是远程库

  • 把本地库的内容推送到远程库上

    • 第一次推送时

      $ git push -u origin master

      加上-u Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令

    • 之后推送时

      $ git push origin master
  • 删除远程库

    • git remote rm <name>命令删除远程库,可先用git remote -v 查看远程库信息

      $ git remote -v
      origin git@github.com:michaelliao/learn-git.git (fetch)
      origin git@github.com:michaelliao/learn-git.git (push)
    • 根据名字删除,比如删除origin

      $ git remote rm origin
  • 从远程库克隆

    假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆

    在github将新仓库创建好后,用命令git clone克隆一个本地库

    $ git clone git@github.com:michaelliao/gitskills.git

分支管理

  • 创建与合并分支

    • 创建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分支中的文件后再提交,然后切换回master分支

      $ git checkout master
      Switched to branch 'master'

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

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

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

      $ git branch -d dev
      Deleted branch dev (was b17d20e).
    • switch用法

      创建并切换到新的dev分支

      $ git switch -c dev

      直接切换到已有的master分支

      $ git switch master
    • 总结

  • 解决冲突

    如果不同分支对不同文件的修改不同,再git merge 合并时就有可能发生冲突,需要手动解决冲突后再提交。用git log --graph命令可以看到分支合并图

  • 分支管理策略

    使用-no-ff方式的git merge ,禁用Fast forward

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

    合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并

  • Bug分支

    Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作

    $ git stash
    Saved working directory and index state WIP on dev: f52c633 add merge

    Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:

    一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

    另一种方式是用git stash pop,恢复的同时把stash内容也删了:

    总结

    • 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
    • 在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
  • Feature分支

    开发一个新feature,最好新建一个分支;

    如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

  • 多人协作

    • 推送分支

      • master分支是主分支,因此要时刻与远程同步
      • dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步
      • bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug
      • feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开
    • 抓取分支

      先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送

      $ git pull
      There is no tracking information for the current branch.
      Please specify which branch you want to merge with.
      See git-pull(1) for details. git pull <remote> <branch> If you wish to set tracking information for this branch you can do so with: git branch --set-upstream-to=origin/<branch> dev

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

      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>

  • Rebase

    • rebase操作可以把本地未push的分叉提交历史整理成直线;
    • rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
    $ git rebase
    First, rewinding head to replay your work on top of it...
    Applying: add comment
    Using index info to reconstruct a base tree...
    M hello.py
    Falling back to patching base and 3-way merge...
    Auto-merging hello.py
    Applying: add author
    Using index info to reconstruct a base tree...
    M hello.py
    Falling back to patching base and 3-way merge...
    Auto-merging hello.py

标签管理

  • 创建标签

    首先,切换到需要打标签的分支上

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

    命令git tag <name>就可以打一个新标签

    $ git tag v1.0

    可以用命令git tag查看所有标签

    $ git tag
    v1.0

    默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?

    方法是找到历史提交的commit id,然后打上就可以了:

    $ git log --pretty=oneline --abbrev-commit
    $ git tag v0.9 f52c633

    可以用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
    ...

    还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字

    $ git tag -a v0.1 -m "version 0.1 released" 1094adb
    • 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
    • 命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
    • 命令git tag可以查看所有标签。
  • 操作标签

    • 命令git push origin <tagname>可以推送一个本地标签;
    • 命令git push origin --tags可以推送全部未推送过的本地标签;
    • 命令git tag -d <tagname>可以删除一个本地标签;
    • 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

Git知识总结的更多相关文章

  1. 【android Studio】零git知识、零脚本命令,即刻体验git版本管理魅力!

    git的优点就不去多说了.阻碍咱新手体验它的唯一问题就是门槛太高,脚本看着像天书, 本文主要阐述的,就是如何在android studio上,也能像tfs那样,非常简单的操作,就能使用git进行版本管 ...

  2. Git知识总览(二) git常用命令概览

    上篇博客我们从 git clone 和 git status 两个命令开始,引出了一系列的git操作命令, 请参见:<Git知识总览(一) 从 git clone 和 git status 谈起 ...

  3. Git知识总览(三) 分支的创建、删除、切换、合并以及冲突解决

    前两篇博客集中的聊了git的一些常用命令,具体请参见<Git知识总览(一) 从 git clone 和 git status 谈起>.<Git知识总览(二) git常用命令概览> ...

  4. Git知识总览(四) git分支管理之rebase 以及 cherry-pick相关操作

    上篇博客聊了<Git知识总览(三) 分支的创建.删除.切换.合并以及冲突解决>,本篇博客我们主要来看一下 rebase 变基相关的操作.rebase 操作和 merge 操作最终都可以达到 ...

  5. Git知识总览(一) 从 git clone 和 git status 谈起

    本篇博客是整理git相关知识的第一篇,因为之前一直是用SourceTree对Git的命令行操作用的不是特别熟,于是乎过了一遍ProGit(链接:https://git-scm.com/book/zh/ ...

  6. git知识总结-1.git基础之git reference

    1.前言 Git版本管理的内容,是一系列由40bytes SHA-1字符串所代表patch,而Git References,则是对这些字符串的引用(也可以理解为别名).为什么需要别名呢?因为这些字符串 ...

  7. 最近学到的Git知识,大厂的Git机制还是很方便的

    本文首发于微信公众号:程序员乔戈里 转载请注明:https://blog.csdn.net/WantFlyDaCheng/article/details/102538508 一.两次的 git com ...

  8. Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase

    上篇博客聊了<git分支管理之rebase 以及 cherry-pick相关操作>本篇博客我们就以Learning Git中的关卡进行展开.下方列举了LearningGit中的 merge ...

  9. Git知识总览(六) Git分支中的远程操作实践

    前几篇博客陆陆续续的讲了好多关于Git操作的内容,本篇博客仍然也不例外,不过本篇博客的主题是关于git的远程操作的.依照之前博客的风格,我们依然依托于LearningGitBranch中的相关内容来探 ...

随机推荐

  1. WPF进阶技巧和实战07--自定义元素02

    在01节中,研究了如何开发自定义控件,下节开始考虑更特殊的选择:派生自定义面板以及构建自定义绘图 创建自定义面板 创建自定义面板是一种比较常见的自定义控件开发子集,面板可以驻留一个或多个子元素,并且实 ...

  2. java 请求第三方接口 GET\POST 实现方法

    (1)GET方法 /** * 根据高德地图api获取位置信息 * @return * */ public static String getMapAddInfo(String httpurl) { H ...

  3. PC Register简介

    PC Regiter介绍: JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息,CPU只有把数据装载 ...

  4. 分片利器 AutoTable:为用户带来「管家式」分片配置体验

    在<DistSQL:像数据库一样使用 Apache ShardingSphere>一文中,Committer 孟浩然为大家介绍了 DistSQL 的设计初衷和语法体系,并通过实战操作展示了 ...

  5. keras框架下的深度学习(一)手写体识别

    这个系列文章主要记录使用keras框架来搭建深度学习模型的学习过程,其中有一些自己的想法和体会,主要学习的书籍是:Deep Learning with Python,使用的IDE是pycharm. 在 ...

  6. UE4蓝图AI角色制作(七)之追逐玩家

    15.追逐玩家 现在我们的AI无法做出任何决策,它总是执行相同的决策.我们先把感知系统中的相关信息提供给AI,让AI知道如何做出决策,然后我们会修改行为树.我们首先需要创建新的黑板键,这样我们就能在行 ...

  7. 【UE4 C++】Input 输入事件绑定

    轴映射与动作映射 编辑器设置input+代码实现具体动作 void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInp ...

  8. 【UE4】异步加载关卡 LoadingScreen ( 蓝图和C++ )

    一般先跳转到一个临时的关卡,然后异步加载目标关卡,同时展示Loading界面 对于含有流关卡的目标关卡,可以先载入子关卡 蓝图异步加载 无进度条 C++ 异步加载关卡 LoadPackageAsync ...

  9. 整理一下在 npmjs.com 上面发布资源包踩过的坑

    正常流程就不说了,网上有很多,比如写代码.打包.注册.登录.发布等. 邮箱要激活 在 npmjs.com 上面注册账号的时候需要填写邮箱,然后登录网址的时候并没有强制要求你去邮箱激活. 但是到了发布资 ...

  10. 92.反转链表II

    题目 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 . ...