身为技术人员,都知道Git是干嘛的。从服务端角度它是代码仓库,可以多人协作、版本控制、高效处理大型或小型项目所有内容;从客户端讲,它能够方便管理本地分支、且与服务端代码的同步,从拉取、合并、提交等等管理分支都靠它!

Git轻量、易于学习,如果不用搭建和维护代码仓库的话(运维职责),只要掌握几个git常用命令即可在工作中轻松应对。

下面简单介绍几个概念,同时列出工作中常用命令:

主要概念

快速入门,弄明白以下几个概念即可:

  • 工作区(Working Directory):就是你在电脑里能看到的目录,或克隆(clone)下来的目录;
  • 版本库(Repository):工作区里面有一个隐藏目录.git,这个不是工作区,而是Git的版本库;
  • 暂存区(stage):版本库中有一个叫stage的暂存区,git add可以把要提交的内容放到暂存区;
  • 主分支(master):版本库还有一个叫master的主分支,git commit把暂存区所有内容提交到当前分支;

主要用法

工作中,一般我们提交代码只要四步:

  • 第一步,git pull 拉取代码,提交代码前确保和服务端仓库一致,避免冲突;
  • 第二步,git add ./your_file.txt 把文件添加进去,实际就是从工作区提交到暂存区;
  • 第三步,git commit -m 'first commit'提交更改,再把暂存区所有内容提交到当前分支(默认master);
  • 第四步,git push [remoteName]推送到远程仓库,也就是推到服务端,这样别人就能拉取pull你的代码;

常见问题

平时工作也就用到上面四个步骤,当然了凡事有例外,下面说几个例外的处理办法:

一、checkout切换分支

git checkout <branch>:切换到你需要的分支(dev、hotfix)

git checkout -b <branch>: 如果没有分支,加上-b参数表示创建并切换;

参考链接:https://git-scm.com/docs/git-checkout

二、git提交后撤销问题

撤销得分三种情况:

  • 第一,已经修改文件但未执行git add的撤销方法;

    我故意在.gitignore文件修改之后且没有git add,直接通过git checkout -- <file>撤销;

    但是此命令不会撤销新建的文件,因为新建文件还没加入到Git管理系统中,

    所以git是未知的,自己手动删除就好了。
λ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean D:\learning\git\work (master -> origin)
λ git status
On branch master
Your branch is up-to-date with 'origin/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: .gitignore no changes added to commit (use "git add" and/or "git commit -a") D:\learning\git\work (master -> origin)
λ git checkout -- .gitignore D:\learning\git\work (master -> origin)
λ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean

扩展:

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

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

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

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

参考链接:https://www.liaoxuefeng.com/wiki/896043488029600/897889638509536

  • 第二,已经修改文件且git add的撤销方法

    需要先执行git reset .gitignore撤销到未git add状态,再执行第一步即可。
λ git add .gitignore

D:\learning\git\work (master -> origin)
λ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage) modified: .gitignore D:\learning\git\work (master -> origin)
λ git reset .gitignore
Unstaged changes after reset:
M .gitignore D:\learning\git\work (master -> origin)
λ git status
On branch master
Your branch is up-to-date with 'origin/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: .gitignore no changes added to commit (use "git add" and/or "git commit -a") D:\learning\git\work (master -> origin)
λ git checkout -- .gitignore D:\learning\git\work (master -> origin)
λ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
  • 第三,Git已经commit如何撤销:

    通过git reset --hard commitid直接回到未修改状态。
λ git add .gitignore
λ git commit -m "test"
#(省略无用部分)
λ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean D:\learning\git\work (master -> origin)
λ git log
commit b7de9378f39834dbc8304d4a8d30f39a4003c673 (HEAD -> master)
Author: test <test@163.com>
Date: Mon Sep 14 02:59:02 2020 +0800 test commit b3ed1078e543cdb26b984dac584df9db7553d506 (origin/master, origin/HEAD)
Author: test <test@163.com>
Date: Mon Sep 14 02:39:54 2020 +0800 09142020
D:\learning\git\work (master -> origin)
λ git reset --hard b3ed1078e543cdb26b984dac584df9db7553d506
HEAD is now at b3ed107 09142020 D:\learning\git\work (master -> origin)
λ git log
commit b3ed1078e543cdb26b984dac584df9db7553d506 (HEAD -> master, origin/master, origin/HEAD)
Author: test <test@163.com>
Date: Mon Sep 14 02:39:54 2020 +0800 09142020 D:\learning\git\work (master -> origin)
λ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean

三、git stash保存和恢复工作区内容

git stash可以将你已经修改,但不想提交(git push)的代码临时保存到堆栈中,也就是回归到你git pull时的状态。然后就能随意切换分支救火,完成后切换回来再git push pop即可恢复之前的修改内容。stash不仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上(可跨分支)。

  • git stash

    保存当前工作进度,会把暂存区和工作区的改动保存起来。

    执行完之后再git status,会发现当前是一个干净的工作区,没有任何改动。

    使用git stash save 'message...'可以添加一些注释
  • git stash list

    显示保存进度的列表。也就意味着,git stash命令可以多次执行。

  • git stash pop

    恢复最新的进度到工作区。git默认会把工作区和暂存区的改动都恢复到工作区。

  • git stash pop stash@{stash_id}

    恢复指定的进度到工作区。stash_id通过git stash list命令得到的

    通过git stash pop命令恢复进度后,会删除当前进度。

  • git stash drop stash@{stash_id}

    可以使用git stash drop命令,后面可以跟stash_id

    或使用git stash clear命令,删除所有缓存的stash

  • git stash show

    查看堆栈中最新保存的stash和当前目录的差异

举个例子

  1. 修改.gitignore文件,新建test.txt文件。再执行stash发现新增文件不会被存储;
  2. git add之后再stash发现工作区是干净的;
  3. 说明没有在git版本控制(git add)中的文件,不能被git stash 保存;
  4. 最后通过git stash pop恢复。
λ git status
On branch master
Your branch is up to date with 'origin/master'. Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: .gitignore Untracked files:
(use "git add <file>..." to include in what will be committed)
test.txt no changes added to commit (use "git add" and/or "git commit -a")
D:\learning\git\timed_tasks (master -> origin)
λ git stash
Saved working directory and index state WIP on master: 542a055 create .gitignore D:\learning\git\timed_tasks (master -> origin)
λ git status
On branch master
Your branch is up to date with 'origin/master'. Untracked files:
(use "git add <file>..." to include in what will be committed)
test.txt nothing added to commit but untracked files present (use "git add" to track) D:\learning\git\timed_tasks (master -> origin)
λ git add test.txt D:\learning\git\timed_tasks (master -> origin)
λ git stash
Saved working directory and index state WIP on master: 542a055 create .gitignore D:\learning\git\timed_tasks (master -> origin)
λ git stash list
stash@{0}: WIP on master: 542a055 create .gitignore
stash@{1}: WIP on master: 542a055 create .gitignore
stash@{2}: WIP on (no branch): 542a055 create .gitignore D:\learning\git\timed_tasks (master -> origin)
λ git status
On branch master
Your branch is up to date with 'origin/master'. nothing to commit, working tree clean
D:\learning\git\timed_tasks (master -> origin)
λ git stash show
test.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-) D:\learning\git\timed_tasks (master -> origin)
λ git stash pop
On branch master
Your branch is up to date with 'origin/master'. Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: test.txt Dropped refs/stash@{0} (b69da2894d5e7f511be18277c5a0cd4582fbf453) D:\learning\git\timed_tasks (master -> origin)
λ git status
On branch master
Your branch is up to date with 'origin/master'. Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: test.txt

Tip:如果你修改的所有文件都不想要了怎么办?可通过git stash清空,懂吧?

λ git status
On branch master
Your branch is up to date with 'origin/master'. Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: test.txt D:\learning\git\timed_tasks (master -> origin)
λ git stash
Saved working directory and index state WIP on master: 542a055 create .gitignore D:\learning\git\timed_tasks (master -> origin)
λ git stash clear D:\learning\git\timed_tasks (master -> origin)
λ git status
On branch master
Your branch is up to date with 'origin/master'. nothing to commit, working tree clean

----by 钢铁 648403020@qq.com

参考资料:

Git官方文档:https://git-scm.com/docs

廖雪峰Git教程:https://www.liaoxuefeng.com/wiki/896043488029600

git 快速入门及常用命令的更多相关文章

  1. Git快速入门和常用命令

    一.快速入门 本地初始化一个项目 首先,你需要执行下面两条命令,作为 git 的基础配置,作用是告诉 git 你是谁,你输入的信息将出现在你创建的提交中. git config --global us ...

  2. Docker(2):快速入门及常用命令

    什么是Docker? Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题.运维人员利用 Docker 可以在隔离容器中并行运行和管理 ...

  3. MySQL快速入门及常用命令

    数据库 笔记内容 SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,F ...

  4. ETCD快速入门-03 常用命令

    3. ETCD 常用命令     etcdctl是一个命令行的客户端,它提供了一些命令,可以方便我们在对服务进行测试或者手动修改数据库内容.etcdctl与kubectl和systemctl的命令原理 ...

  5. git基础入门之常用命令操作

    本内容参考:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 初学,有什么不对的地方 ...

  6. git快速入门 push/clone/reset/merge/切换分支全都有

    本文介绍git快速入门,从安装/创建init / 发布push/版本回退reset / branch分支切换/合并分支merge 这些基本的操作都有涉及,方便新人快速入手,有需要的朋友mark一下.首 ...

  7. Git 快速入门--Git 基础

    Git 快速入门 Git 基础 那么,简单地说,Git 究竟是怎样的一个系统呢? 请注意接下来的内容非常重要,若你理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余. 在开始学习 G ...

  8. Git快速入门进阶篇

    本文接着Git快速入门篇,继续探讨Git在管理项目中的一些应用. 远程仓库的使用 查看远程仓库 查看你已经配置的远程仓库服务器,可以运行 git remote 命令.指定选项 -v,会显示需要读写远程 ...

  9. Docker 入门指南——常用命令

    前面已经介绍了 Docker 的安装方式,本文总结一下使用 Docker 的基本概念和常用命令. 基本概念 镜像 Image 镜像是一些打包好的已有的环境,可以被用来启动和创建容器 容器 Contai ...

随机推荐

  1. Remix+Geth 实现智能合约部署和调用详解

    Remix编写智能合约 编写代码 在线调试 实现部署 调用接口 Geth实现私有链部署合约和调用接口 部署合约 调用合约 获得合约实例 通过实例调用合约接口 Remix编写智能合约 编写代码 Remi ...

  2. LeetCode 647. Palindromic Substrings的三种解法

    转载地址 https://www.cnblogs.com/AlvinZH/p/8527668.html#_label5 题目详情 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同 ...

  3. Jdk1.7下的HashMap源码分析

    本文主要讨论jdk1.7下hashMap的源码实现,其中主要是在扩容时容易出现死循环的问题,以及put元素的整个过程. 1.数组结构 数组+链表 示例图如下: 常量属性 /** * The defau ...

  4. 汇编 | x86汇编指令集大全(带注释)

    做mit-6.828的时候遇到了很多汇编知识,但是无奈学校还没学汇编,只能狠心啃啃硬骨头,在网上查到了很多的资料,归档!方便查看 ----------------------------------- ...

  5. 学长小清新题表之UOJ 14.DZY Loves Graph

    学长小清新题表之UOJ 14.DZY Loves Graph 题目描述 \(DZY\)开始有 \(n\) 个点,现在他对这 \(n\) 个点进行了 \(m\) 次操作,对于第 \(i\) 个操作(从 ...

  6. 你真的会做 2 Sum 吗?| 含双重好礼

    小预告:文末有两份福利,记得看到最后哦- 2 Sum 这题是 Leetcode 的第一题,相信大部分小伙伴都听过的吧. 作为一道标着 Easy 难度的题,它真的这么简单吗? 我在之前的刷题视频里说过, ...

  7. 边缘计算、区块链、5G,哪个能走的更远

    频繁出现的新词汇5G.区块链.边缘计算,这些都代表了什么,又能给我们的生活带来什么巨大的改变么?抉择之时已至,能够走向未来的真的只有一个吗? "没有什么能够阻挡,你对自由的向往....&qu ...

  8. Linux之lldptool工具

    1. 描述当我们想在操作系统里面查看网口和交换机连接的状态信息,我们可以使用lldptool这个工具2.LLDP协议LLDP是Link Layer Discovery Protocol 链路层发现协议 ...

  9. 玩转Spring——Spring AOP

    什么是AOP?AOP(Aspect Oriented Programming )被称为面向切面编程AOP利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共 ...

  10. Java算法——动态规划

    基本思想: 动态规划算法通常用于求解具有某种最优性质的问题(作用就是求最优解).在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.动态规划算法与分治法类似,其基本思 ...