一些你必须要熟练掌握的git命令

前言

因为结合了开发中可能遇到的场景,篇幅较长,不过我觉得很有助于你理解 git 的运作机制,而不是死记硬背命令。

HEAD指针 始终指向的是当前分支的最新版本号,HEAD^, HEAD^^, ^ 的个数 n 或 HEAD~n,n 代表前 n 个版本号。

在项目中直接使用 linux rm 只会删除工作区的文件,git rm 同在删除工作区文件的同时删除 stage 中的,或使用 git rm --cached 只删除 stage 中的。

一些基本的操作

#全局配置
git config --global user.name "your username"
git config --global user.email youremail@email.com
git config --global color.ui true

#
mkdir git_proj & cd git_proj
git init
echo "# readme.md" >> README.md
git add README.md
git commit -m "readme commit"
# 添加远程仓库 并给它取个别名 origin
git remote add origin git@github.com:username/repositoryName.git
# 将本地仓库推送至 origin 的 master 分支并与此分支关联(-u 的作用,后期不必在使用)
git push -u origin master

# 从远程仓库 origin 的 master 分支获取最新源码并下载到 tmp 分支
git fetch origin master:tmp
# 比对 tmp 分支于 master 分支做了哪些改动
git diff master tmp
# 合并 tmp 分支到 master 分支
git merge tmp

# clone copy 一个完整的远端仓库到本地
git clone git@github.com:username/repositoryName.git

# pull 获取 origin 的 master 分支并直接和当前分支合并
# 所以可能会发生冲突
git pull origin master

checkout

checkout 命令有两个主要作用:切换分支 和 回滚文件到当前的 stage 版本 或 repository 版本

1、切换分支

# 切换到 new_branch 分支
git checkout new_branch
# 创建并切换到 new_branch 分支
git checkout -b new_branch

2、回滚工作区的文件到最新 stage 版本 或 repository 版本,即从 stage 或 repository 中检出最新版本

# -- 是文件标示符 表名后面的参数为文件 避免产生切换 branch 的歧义
git checkout -- <filename>

回滚时会先检查 stage 中是否有对应的文件,如果没有才会使用 repository 中最新的版本。而当对某文件进行了多次修改和 add 操作后,使用 checkout 我们只能将文件回滚到最新一次的 add 的版本。

但在某些场景下我们可能想回滚到 repository 中的最新版本,怎么做呢?配合 reset 命令的可以很容易做到。
先给出命令:

git reset HEAD <filename> & git checkout -- <filename>

这样就可以将工作区的 filename 回滚到 repository 中的最新版本了。具体原理我们将在实例中详细的讲解。

reset

git 的 reset 命令比较绕,需要耐心的理解。简单来说,reset 有三种重置级别,我们需要准确理解每个级别的作用。

soft:回退版本号。作用于 repository

mixed:回退版本号,重置 stage。作用于 repository 和 stage

hard :回退版本号,重置 stage,重置工作区源码。作用于 repository,stage 和 workspace

我们简单展示下 repository 的版本号,我们以此为 demo 分别尝试三个级别的 reset

git log

version D (HEAD) <-- HEAD指针
version C (HEAD^)
version B (HEAD^^)
version A (HEAD~3)

命令格式:

git reset [--soft|--mixed|--hard] version_no <filename>

--soft:只是单纯的移动 repository 的 HEAD指针 到制定版本号。stage 和工作区没有任何变化。

# 将 HEAD 指针回滚至上一版本 使用 git log 你会发现提交日志退回到了上一版本号
git reset --soft HEAD^
#版本号现状
version C <-- HEAD指针
version B
version A

--mixed:默认选项,移动 repository 的 HEAD指针 到指定版本号,同时用此版本重置 stage 区,所以可能会让工作区的某些文件处于 unstage 状态(当工作区的文件与 repository 中的版本不一致时)。注意,这里是可以指定文件的。soft 本身和文件无关,hard 则是不能单独指定文件,只能全部重置。

# HEAD指针 还是指向 HEAD
git reset HEAD^2 <filename>
#版本号现状
version B <-- HEAD指针
version A

HEAD指针 指向 version B,并且 stage 已经被 version B 的文件重置,工作区则不受影响。

这里有个很实用的小技巧:

git reset version_no <filename> & git checkout -- <filename>

这两个命令组合在一起可以让工作区的指定文件回滚到 repository 中对应的 version_no 版本。
如果 version_no 是 HEAD 的话那就可以回滚文件到最新一次的提交。

--hard:谨慎使用!!!移动 repository 的 HEAD指针 到指定版本号,同时用此版本重置 stage 区 和 工作区源码。这里要特别注意,工作区的源码也会被覆盖重置掉,你的修改会全部丢失。简单来说就是将代码彻底恢复到指定版本。hard 是没办法指定文件的,要么回滚,要么全回滚。

# HEAD指针 还是指向 HEAD
git reset --hard HEAD^3
#版本号现状
version A <-- HEAD指针

此时,HEAD指针 指向 version A,并且 stage 和 工作区的文件已经被 version A 的文件重置。整个项目的状态完全回到提交 version A 时按下回车键的那一刻。

rm

git rm 不同于直接使用 rm,git rm 会删除工作区 和 stage 区的内容。注意:这里你没办法再使用 git checkout -- <filename> 来回滚操作了,因为工作区也没有 filename 文件了,没办法与 repository 做关联,只能使用 git reset HEAD <filename> 来重置 stage 中的此文件,然后 git checkout -- <filename>

git rm [--cached] [-r] [-f] <filename>

这里就提示一点,只想把 stage 中的文件删除掉让文件脱离 git 的管理,可以使用

git rm --cached <filename>

此时工作区的 filename 并不会被删除,但状态会被改为 untracked,同时 stage 会记录下 filename 的状态为删除,提交的话版本库将新增一个 filename 被删除掉的版本。

删除 stage 中的文件和使用 reset命令 重置 stage 中的文件是有区别的,删除会让文件状态更改为 untracked,而重置会让文件状态更改为 unstage(如果工作区和 stage 文件内容不一致)。

小实例场景:

1、回滚工作区某文件到指定的 repository 版本

工作中,我们可能会针对某文件做多次修改和 add 到 stage 的操作,而后发现思路完全错了,需要重新设计开发。

比如文件 foo 的 A版 我提交了一次后,又进行了 B版 和 C版 的两次修改并 add 到了 stage 区。第三次修改后 D版 我发现一开始思路就错了,需要重新设计。那此时直接使用 git checkout -- foo 是拿不到最初的 A版 的,因为 stage 区还存放着 foo 的 C版。此时我们便可以使用 git reset HEAD foo 命令,repository 最新版本号中存放着 foo 的 A版,命令会在不移动 HEAD 的前提下,使用 foo A版 去重置 stage 区。命令执行后 stage 区的 foo 文件已经是 A版 了。我们再使用 git checkout -- foo 便可以将工作区的 foo D版 回滚至 A 版。即:

git reset HEAD foo & git checkout -- foo

HEAD 代表当前版本,所以 HEAD指针 不会移动。同时 stage 区会被 repository 的当前版本的 filename 重置,也就说 stage 区 存放的 filename 与 repository 中相同了。此时我们再使用 git checkout -- <filename> 便可以回滚工作区的 filename 到 repository 的当前版本。其实就是利用 reset --mixed 会重置 stage 区,然后 checkout 会将 stage 区的文件检出到工作目录。当然,reset 很灵活,可以回滚任意指定的版本。

其实如果只是回滚至当前版本的话,还有个命令能实现相同的功能

git rm --cached <filename> & git checkout -- <filename>

git rm --cached <filename> 会将 stage 中的此文件删除,文件状态会变为 untracked,然后 checkout 时发现 stage 中木有此文件,故会去 repository 的当前版本中检出此文件。

diff

  • git diff -- <filename> 工作区 比较 暂存区
  • git diff --cached -- <filename> 暂存区 比较 本地库当前版本
  • git diff HEAD~N -- <filename> 工作区 比较 本地库第N个版本
  • git diff HEAD HEAD^ -- <filename> HEAD 比较 HEAD^
  • git diff master tmp -- <filename> master 比较 tmp
  • git diff SHA1 SHA2 -- <filename> 比较两个历史版本之间的差异

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • git 使用及常用命令

    git在团队项目中的使用流程 1.首先从一个git远程仓库中clone项目到本地 git clone 仓库地址 2.创建开发分支 一般我们写代码不会在master分支上面写,而是新建一个分支 git checkout -b test 3.在test分支上面进行代码修改,比如完成某一项功能的开发 4.修改完之后提交代码到test分支 git add . git commit -m "your comment" 5.review代码(非必需) 在test分支上面开发完某一个功能之后,建议自

  • Git中需要熟记的命令小结

    提交流程相关 查看文件改动以及新增的文件 git status 添加新增文件 git add your_file_path // 添加全部文件 git add * // 添加某类型文件 git add dir/*.js 简单的提交文件 git commit -m "Commit message" 提交你所有的修改文件以及添加的文件 git commit -am 'your message' 撤销修改某个文件 git checkout -- <filename> 放弃本地所有

  • github版本库使用详细图文教程(命令行及图形界面版)

    Git是一个分布式的版本控制系统,作为开源代码库以及版本控制系统,Github目前拥有140多万开发者用户.随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选方法. > Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中.目前,包括 Rubinius和Merb在内的很多知名项目都使用了Git.Git同样可以被诸如Capistrano和

  • Git 常用命令速查表(图文+表格)

    一. Git 常用命令速查 git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支 git branch -r 查看远程所有分支 git commit -am "init" 提交并且加注释 git remote add origin git@192.168.1.119:ndshow git push origin master 将文件给推到服务器上 git remote show origin

  • Git 命令使用技巧提供工作效率

    与其他技术相比,Git应该拯救了更多开发人员的饭碗.只要你经常使用Git保存自己的工作,你就一直有机会可以将代码退回到之前的状态,因此就可以挽回那些你深夜里迷迷糊糊犯下的错误. 尽管这么说,Git的命令行界面可是出了名的难掌握.接下来,就给大家介绍7个小技巧,最大限度发挥Git的作用. 通常,大部分时间我们都只会用到add.commit.branch和push/pull这些命令.大部分人熟悉这套只往一个方向运转的工作流.你们有没有想过,如果自己往仓库中添加了错误的文件,或是将代码提交到了错误的分

  • Git代码提交流程及git命令汇总(基础篇)

    基本了解 git命令是一些命令行工具的集合,它可以用来跟踪,记录文件的变动.比如你可以进行保存,比对,分析,合并等等.这个过程被称之为版本控制.已经有一系列的版本控制系统,比如SVN, Mercurial, Perforce, CVS, Bitkeepe等等. Git是分布式的,这意味着它并不依赖于中心服务器,任何一台机器都可以有一个本地版本的控制系统,我们称之为仓库.如果是多人协作的话,你需要还需要一个线上仓库,用来同步信息.这就是GitHub, BitBucket的工作. 自己用Git有一段

  • Git 命令详解及常用命令整理

    Git 命令详解及常用命令 Git作为常用的版本控制工具,多了解一些命令,将能省去很多时间,下面这张图是比较好的一张,贴出了看一下: 关于git,首先需要了解几个名词,如下: Workspace //工作区 Index / Stage //暂存区 Repository //仓库区(或本地仓库) Remote //远程仓 一.新建代码库 // 在当前目录新建一个Git代码库 $ git init // 新建一个目录,将其初始化为Git代码库 $ git init [project-name] //

  • Git 命令行教程及实例教程(附github注册)

    本篇博客主要讲解以下问题: Git 常用命令 创建新仓库 检出仓库 添加与提交 推送改动 分支 更新与合并 标签 替换本地改动 Git实例教程 操作小技巧 Git 常用命令常用命令 创建新仓库 创建新文件夹,打开,然后执行 git init 以创建新的 git 仓库. 检出仓库 执行如下命令以创建一个本地仓库的克隆版本: git clone /path/to/repository 如果是远端服务器上的仓库,你的命令会是这个样子: git clone username@host:/path/to/

  • 分享Git常用7大技巧和命令

    Git 是一个非常强大的工具,它包含丰富的工具用以维护项目.本文介绍了一些 Git 日常使用过程中的实用技巧和命令,希望这些内容能够对大家有所帮助. 一.Git diff比对命令 通常情况下,我们会在自己的独立分支中完成需求开发,此时就会有需求将自己的分支和其他分支进行对比.这个功能可以通过 git diff branch1 branch 命令来实现. 如果希望对比暂存区和当前的 HEAD,那么使用 git diff --cached 命令会非常方便.普通的git diff命令默认对比的是没有加

  • 解决因文件权限导致git fetch命令执行失败的问题

    前言 最近在一个基于 git 的发布系统中拉取代码,发现无法拉取最新的提交记录,通过调试和查看日志文件找到一行错误:error: cannot open .git/FETCH_HEAD: Permission denied,原因是文件权限问题导致. 问题原因 Permission denied,应该权限问题,到项目 .git 目录下查看文件的用户和组: 发现 FETCH_HEAD 的用户和组都是 root 权限,而发布系统的运行进程是 nobody 用户,所以没有权限执行这个 git 命令:gi

  • Linux中Git集中操作命令汇总

    SyntaxHighlighter git version # 查看版本 git config -l # 查看当前配置 git config --global user.name "Dean" # 设置用户名,邮箱 git config --global user.email g.xiangyu1990@gmail.com # 设置用户名,邮箱 git config --global alias.ci commit # 设置git命令的别名 git config --global al

  • Git 常用命令整理

    前言 这里就不介绍 git 了,表一看到命令行就怕怕,常用的命令也就这些,基本满足 99% 以上的项目需求,非常实用. 正文 一.常用 git 命令 1.1 git clone <url> [<directory>] 从远程库 clone 代码到本地,directory 用于指定一个新目录名 1.2 git status 检查本地状态,可以查看当前所在分支.新增或被修改的文件 1.3 git checkout <file> 还原某文件所作的修改,也可以 "gi

  • linux系统安装git及git常用命令

    1 安装GIT 复制代码 代码如下: $  sudo aptitude install git$  sudo aptitude install git-doc git-svn git-email git-gui gitk git软件包包含了大部分Git命令,是必装的软件包,第二行命令也是Git软件包,但是是单独发布的,可以选择安装. 2 下载远程项目的GIT库到本地[code]$  git clone git://远程Git库地址  filename[code] filename 是你本地的文件

  • github 常用命令总结大全

    github常用命令 最近开始研究github,mark下一些常用命令 git remote add upstream https://github.com/winterIce/testTitle.git(别人的repository)    // 新建分支用于存放别人的repository git clone https://github.com/winterIce/testTitle.git  克隆到本地 git fetch branch2//更新信息 git merge branch2/ma

  • Git使用基础篇(一些常用命令和原理)

    Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体验到原来一个版本控制工具可以对开发产生如此之多的影响,文章分为两部分,第一部分介绍Git的一些常用命令,其中穿插介绍Git的基本概念和原理,第二篇重点介绍 Git的使用技巧,最后会在Git Hub上创建一个开源项目开启你的Git实战之旅 1.Git是什么 Git在Wikipedia上的定义:它是一个免费的.分布式的版本控制工具,或是一个强调了速度快的源代码管理工具.Gi

  • Git基本常用命令

       mkdir:         XX (创建一个空目录 XX指目录名)    pwd:          显示当前目录的路径. git init          把当前的目录变成可以管理的git仓库,生成隐藏.git文件. git add XX       把xx文件添加到暂存区去.    git commit –m "XX"  提交文件 –m 后面的是注释.    git status        查看仓库状态 git diff  XX      查看XX文件修改了那些内容

  • Git pull命令与fetch命令的区别

    Git pull命令与fetch命令的区别 今天在公司碰到个问题,公司不使用master分支作为主分支,而使用release分支作为主分支,这就碰到了个问题,也就是当clone一个项目下来的时候,如果master跟release分支有冲突,就不能pull了,自己还要解决冲突. 刚下一个项目,也不懂冲突到底怎么回事,也就很难搞了. 这个时候,就不得不提Git的两个命令,git fetch和git pull Git中从远程的分支获取最新的版本到本地有这样2个命令: Git fetch git fet

  • 分享下自己总结的Git常用命令

    使用git也有一段时间了,把自己常用的命令用自己的描述记录起来,方便自己备忘也方便其他人参考. 目录: 最基本的命令: git clone 拷贝并跟踪远程的master分支.跟踪的好处是以后可以直接通过pull和push命令来提交或者获取远程最新的代码,而不需要指定远程分支名字. git submodule init git submodule update 参考示意图 HEAD 指向当前的commit 对象,同时也用来表明我们在哪个branch上工作.所以当我们使用HEAD来操作指针的时候,其

随机推荐