程序员必备基础:Git 命令全方位学习

来源 | 捡田螺的小男孩前端

封图 | CSDN 下载自视觉中国
java

掌握Git命令是每位程序员必备的基础,以前一直是用smartGit工具,直到看到大佬们都是在用Git命令操做的,回想一下,发现有些Git命令我都忘记了,因而写了这篇博文,复习一下~nginx

https://github.com/whx123/JavaHomegit

01程序员

Git是什么github

在回忆Git是什么的话,咱们先来复习这几个概念。缓存

1.什么是版本控制?

百度百科定义是酱紫的~服务器

版本控制是指对软件开发过程当中各类程序代码、配置文件及说明文档等文件变动的管理,是软件配置管理的核心思想之一。分布式

那些年,咱们的毕业论文,其实就是版本变动的真实写照...脑洞一下,版本控制就是这些论文变动的管理~2.什么是集中化的版本控制系统?ide

那么,集中化的版本控制系统又是什么呢,说白了,就是有一个集中管理的中央服务器,保存着全部文件的修改历史版本,而协同开发者经过客户端链接到这台服务器,从服务器上同步更新或上传本身的修改。

3.什么是分布式版本控制系统?

分布式版本控制系统,就是远程仓库同步全部版本信息到本地的每一个用户。嘻嘻,这里分三点阐述吧:

  • 用户在本地就能够查看全部的历史版本信息,可是偶尔要从远程更新一下,由于可能别的用户有文件修改提交到远程哦。

  • 用户即便离线也能够本地提交,push推送到远程服务器才须要联网。

  • 每一个用户都保存了历史版本,因此只要有一个用户设备没问题,就能够恢复数据啦~

4.什么是Git?

Git是免费、开源的分布式版本控制系统,能够有效、高速地处理从很小到很是大的项目版本管理。

02

Git 的相关理论基础

  • Git的四大工做区域

  • Git的工做流程

  • Git文件的四种状态

  • 一张图解释Git的工做原理

1.Git的四大工做区域

先复习Git的几个工做区域哈:

  • Workspace:你电脑本地看到的文件和目录,在Git的版本控制下,构成了工做区。

  • Index/Stage:暂存区,通常存放在 .git目录下,即.git/index,它又叫待提交更新区,用于临时存放你未提交的改动。好比,你执行git add,这些改动就添加到这个区域啦。

  • Repository:本地仓库,你执行git clone 地址,就是把远程仓库克隆到本地仓库。它是一个存放在本地的版本库,其中HEAD指向最新放入仓库的版本。当你执行git commit,文件改动就到本地仓库来了~

  • Remote:远程仓库,就是相似github,码云等网站所提供的仓库,能够理解为远程数据交换的仓库~

2.Git的工做流程

上一小节介绍完Git的四大工做区域,这一小节呢,介绍Git的工做流程咯,把git的操做命令和几个工做区域结合起来,我的以为更容易理解一些。

git 的正向工做流程通常就这样:

  • 从远程仓库拉取文件代码回来;

  • 在工做目录,增删改查文件;

  • 把改动的文件放入暂存区;

  • 将暂存区的文件提交本地仓库;

  • 将本地仓库的文件推送到远程仓库;

3.Git文件的四种状态

根据一个文件是否已加入版本控制,能够把文件状态分为:Tracked(已跟踪)和Untracked(未跟踪),而tracked(已跟踪)又包括三种工做状态:Unmodified,Modified,Staged

  • Untracked: 文件尚未加入到git库,还没参与版本控制,即未跟踪状态。这时候的文件,经过git add 状态,能够变为Staged状态

  • Unmodified:文件已经加入git库, 可是呢,还没修改, 就是说版本库中的文件快照内容与文件夹中还彻底一致。Unmodified的文件若是被修改, 就会变为Modified. 若是使用git remove移出版本库, 则成为Untracked文件。

  • Modified:文件被修改了,就进入modified状态啦,文件这个状态经过stage命令能够进入staged状态

  • staged:暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodified状态.

5.一张图解释Git的工做原理

03

平常开发中,Git 的基本经常使用命令

  • git clone

  • git checkout -b dev

  • git add

  • git commit

  • git log

  • git diff

  • git status

  • git pull/git fetch

  • git push

这个图只是模拟一下git基本命令使用的大概流程哈~

1.git clone

当咱们要进行开发,第一步就是克隆远程版本库到本地呢

git clone url  克隆远程版本库

2.git checkout -b dev

克隆完以后呢,开发新需求的话,咱们须要新建一个开发分支,好比新建开发分支dev

建立分支:

git checkout -b dev   建立开发分支dev,并切换到该分支下

3.git add

git add的使用格式:

git add .添加当前目录的全部文件到暂存区
git add [dir]添加指定目录到暂存区,包括子目录
git add [file1]添加指定文件到暂存区

有了开发分支dev以后,咱们就能够开始开发啦,假设咱们开发完HelloWorld.java,能够把它加到暂存区,命令以下

git add Hello.java  把HelloWorld.java文件添加到暂存区去

4.git commit

git commit的使用格式:

git commit -m [message] 提交暂存区到仓库区,message为说明信息
git commit [file1] -m [message] 提交暂存区的指定文件到本地仓库
git commit --amend -m [message] 使用一次新的commit,替代上一次提交

把HelloWorld.java文件加到暂存区后,咱们接着能够提交到本地仓库啦~

git commit -m 'helloworld开发'

5.git status

git status,表示查看工做区状态,使用命令格式:

git status  查看当前工做区暂存区变更
git status -s  查看当前工做区暂存区变更,概要信息
git status  --show-stash 查询工做区中是否有stash(暂存的文件)

当你忘记是否已把代码文件添加到暂存区或者是否提交到本地仓库,均可以用git status看看哦~

6.git log

git log,这个命令用得应该比较多,表示查看提交历史/提交日志~

git log  查看提交历史
git log --oneline 以精简模式显示查看提交历史
git log -p <file> 查看指定文件的提交历史
git blame <file> 一列表方式查看指定文件的提交历史

嘻嘻,看看dev分支上的提交历史吧~要回滚代码就常常用它喵喵提交历史~

7.git diff

git diff 显示暂存区和工做区的差别
git diff filepath   filepath路径文件中,工做区与暂存区的比较差别
git diff HEAD filepath 工做区与HEAD ( 当前工做分支)的比较差别
git diff branchName filepath 当前分支的文件与branchName分支的文件的比较差别
git diff commitId filepath 与某一次提交的比较差别

若是你想对比一下你改了哪些内容,能够用git diff对比一下文件修改差别哦

8.git pull/git fetch

git pull  拉取远程仓库全部分支更新并合并到本地分支。
git pull origin master 将远程master分支合并到当前本地分支
git pull origin master:master 将远程master分支合并到当前本地master分支,冒号后面表示本地分支


git fetch --all  拉取全部远端的最新代码
git fetch origin master 拉取远程最新master分支代码

咱们通常都会用git pull拉取最新代码看看的,解决一下冲突,再推送代码到远程仓库的。

有些伙伴可能对使用git pull仍是git fetch有点疑惑,其实 git pull = git fetch+ git merge。pull的话,拉取远程分支并与本地分支合并,fetch只是拉远程分支,怎么合并,能够本身再作选择。

9.git push

git push 能够推送本地分支、标签到远程仓库,也能够删除远程分支哦。

git push origin master 将本地分支的更新所有推送到远程仓库master分支。
git push origin -d <branchname>   删除远程branchname分支
git push --tags 推送全部标签

若是咱们在dev开发完,或者就想把文件推送到远程仓库,给别的伙伴看看,就可使用git push origin dev~

04

Git 进阶之分支处理

Git通常都是存在多个分支的,开发分支,回归测试分支以及主干分支等,因此Git分支处理的命令也须要很熟悉的呀~

  • git branch

  • git checkout

  • git merge

1.git branch

git branch用处多多呢,好比新建分支、查看分支、删除分支等等

新建分支:

git checkout -b dev2  新建一个分支,而且切换到新的分支dev2
git branch dev2 新建一个分支,可是仍停留在原来分支

查看分支:

git branch    查看本地全部的分支
git branch -r  查看全部远程的分支
git branch -a  查看全部远程分支和本地分支

删除分支:

git branch -D <branchname>  删除本地branchname分支

2.git checkout

切换分支:

git checkout master 切换到master分支

3.git merge

咱们在开发分支dev开发、测试完成在发布以前,咱们通常须要把开发分支dev代码合并到master,因此git merge也是程序员必备的一个命令。

git merge master  在当前分支上合并master分支过来
git merge --no-ff origin/dev  在当前分支上合并远程分支dev
git merge --abort 终止本次merge,并回到merge前的状态

好比,你开发完需求后,发版须要把代码合到主干master分支,以下:

05

Git 进阶之处理冲突

Git版本控制,是多我的一块儿搞的,多个分支并存的,这就不免会有冲突出现~

1.Git合并分支,冲突出现

同一个文件,在合并分支的时候,若是同一行被多个分支或者不一样人都修改了,合并的时候就会出现冲突。

举个粟子吧,咱们如今在dev分支,修改HelloWorld.java文件,假设修改了第三行,而且commit提交到本地仓库,修改内容以下:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello,捡田螺的小男孩!");
    }
}

咱们切回到master分支,也修改HelloWorld.java同一位置内容,以下:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello,jay!!");
    }
}

再而后呢,咱们提交一下master分支的这个改动,并把dev分支合并过下,就出现冲突啦,如图所示:

2.Git解决冲突

Git 解决冲突步骤以下:

  • 查看冲突文件内容

  • 肯定冲突内容保留哪些部分,修改文件

  • 从新提交,done

1)查看冲突文件内容

git merge提示冲突后,咱们切换到对应文件,看看冲突内容哈,,以下:

2)肯定冲突内容保留哪些部分,修改文件

  • Git用<<<<<<<,=======,>>>>>>>标记出不一样分支的内容,

  • <<<<<<<HEAD是指主分支修改的内容,>>>>>>> dev是指dev分支上修改的内容

因此呢,咱们肯定到底保留哪一个分支内容,仍是两个分支内容都保留呢,而后再去修改文件冲突内容~

3)修改完冲突文件内容,咱们从新提交,冲突done

06

Git 进阶之撤销与回退

Git的撤销与回退,在平常工做中使用的比较频繁。好比咱们想将某个修改后的文件撤销到上一个版本,或者想撤销某次多余的提交,都要用到git的撤销和回退操做。

代码在Git的每一个工做区域都是用哪些命令撤销或者回退的呢,以下图所示:

有关于Git的撤销与回退,通常就如下几个核心命令

  • git checkout

  • git reset

  • git revert

1.git checkout

若是文件还在工做区,还没添加到暂存区,可使用git checkout撤销

git checkout [file]  丢弃某个文件file
git checkout .  丢弃全部文件

如下demo,使用git checkout -- test.txt 撤销了test.txt的修改

2.git reset

git reset的理解

git reset的做用是修改HEAD的位置,即将HEAD指向的位置改变为以前存在的某个版本.

为了更好地理解git reset,咱们来回顾一下,Git的版本管理及HEAD的理解

Git的全部提交,会连成一条时间轴线,这就是分支。若是当前分支是master,HEAD指针通常指向当前分支,以下:

假设执行git reset,回退到版本二以后,版本三不见了哦,以下:

git reset的使用

Git Reset的几种使用模式

git reset HEAD --file
回退暂存区里的某个文件,回退到当前版本工做区状态
git reset –-soft 目标版本号 能够把版本库上的提交回退到暂存区,修改记录保留
git reset –-mixed 目标版本号 能够把版本库上的提交回退到工做区,修改记录保留
git reset –-hard  能够把版本库上的提交完全回退,修改的记录所有revert。

先看一个粟子demo吧,代码git add到暂存区,并未commit提交,能够酱紫回退,以下:

git reset HEAD file 取消暂存
git checkout file 撤销修改

再看另一个粟子吧,代码已经git commit了,可是尚未push:

git log  获取到想要回退的commit_id
git reset --hard commit_id  想回到过去,回到过去的commit_id

若是代码已经push到远程仓库了呢,也可使用reset回滚哦(这里你们能够本身操做实践一下哦)~

git log
git reset --hard commit_id
git push origin HEAD --force

3.git revert

与git reset不一样的是,revert复制了那个想要回退到的历史版本,将它加在当前分支的最前端。

revert以前:revert 以后:

固然,若是代码已经推送到远程的话,还能够考虑revert回滚呢

git log  获得你须要回退一次提交的commit id
git revert -n <commit_id>  撤销指定的版本,撤销也会做为一次提交进行保存

07

Git 进阶之标签 tag

打tag就是对发布的版本标注一个版本号,若是版本发布有问题,就把该版本拉取出来,修复bug,再合回去。

git tag  列出全部tag
git tag [tag] 新建一个tag在当前commit
git tag [tag] [commit] 新建一个tag在指定commit
git tag -d [tag] 删除本地tag
git push origin [tag] 推送tag到远程
git show [tag] 查看tag
git checkout -b [branch] [tag] 新建一个分支,指向某个tag

08

Git 其余一些经典命令

1.git rebase

rebase又称为衍合,是合并的另一种选择。

假设有两个分支master和test

D---E test
      /
 A---B---C---F--- master

执行 git merge test获得的结果

D--------E
      /          \
 A---B---C---F----G---   test, master

执行git rebase test,获得的结果

A---B---D---E---C‘---F‘---   test, master

rebase好处是: 得到更优雅的提交树,能够线性的看到每一次提交,而且没有增长提交节点。因此不少时候,看到有些伙伴都是这个命令拉代码:git pull --rebase,就是由于想更优雅,哈哈

2.git stash

stash命令可用于临时保存和恢复修改

git stash  把当前的工做隐藏起来 等之后恢复现场后继续工做
git stash list 显示保存的工做进度列表
git stash pop stash@{num} 恢复工做进度到工做区
git stash show :显示作了哪些改动
git stash drop stash@{num} :删除一条保存的工做进度
git stash clear 删除全部缓存的stash。

3.git reflog

显示当前分支的最近几回提交

4.git blame filepath

git blame 记录了某个文件的更改历史和更改人,能够查看背锅人,哈哈

5.git remote

git remote   查看关联的远程仓库的名称
git remote add url   添加一个远程仓库
git remote show [remote] 显示某个远程仓库的信息

我知道你在看