【246期】Git 常用命令,每条都很重要!
点击上方“Java精选”,选择“设为星标”
别问别人为什么,多问自己凭什么!
下方有惊喜,留言必回,有问必答!
每天 08:15 更新文章,每天进步一点点...
这篇文章系统性的总结下 git 常见命令的使用方法。
1. 背景需求
今年以来帮助实验室的博士生做了两篇论文的实验。做paper的实验有一个特点:需求会经常变动,经常是这种方法效果不行,那就需要换另外一种方法进行试验。导致的结果就是代码会经常变动,并且这次改动之后以后还有可能需要改动回来,因为一直没有用上git,所以就显得代码非常混乱。
最后非常尴尬的局面就是:今天需要尝试下这个方法能不能work,需要将整个项目的代码过一遍,保证当前的代码、当前需要执行的程序、当前的参数是和这个需求符合的;明天可能又换了一种方法;后来又需要重新切换会第一天的方法,又得整个把代码给过一遍,将一些注释给重新注释回来,反正就是非常非常麻烦,人工一遍一遍进行代码控制非常累。
但是在实验过程中间又不想去使用新的技术,即使使用git是一件非常直觉的事情,知道 deadline 也没有用git来管理项目代码……
paper投出去之后,就觉得将git使用熟练真的太太太重要了。
2. 常见命令使用方法
创建一个 git 仓库
手下,我们可以在github上面找到任意一个repository,在本地git clone下来(注意,不是下载github上面的.zip压缩包),那么这个项目对应的文件夹本身就是一个git repository。
如果我们从零开始创建git仓库,也很简单,先新建一个文件夹,进入文件夹,然后:
git init
就会在当前文件夹下面生成.git
文件夹,默认是不可见的。这个.git
就是用来存储我们对目录文件的所有操作历史的。另外,公众号Java精选,回复java面试,获取最新面试题资料,支持在线随时随地刷题。
git add
& git commit
这里首先需要解释下 git 的工作原理,如下图所示:
当我们使用git add xxx.txt
命令时,当前对xxx.txt
的修改将会被提交到staging area
;接着当我们继续使用git commit -m "message"
时,这个修改才会被提交到 repository。
add 单个文件:
git add xxx.txt # xxx.txt 是文件名
add 多个文件
git add * # or git add .
git commit 时必须要带入提交信息(commit message):
git commit -m "your message about this commit"
git status
& git diff
要查看当前 repository 的状态:
git status
如果要查看某个文件前后两次修改的差异:
git diff xxx.txt
git log
& git reflog
查看我们 commit 的历史,可以:
git log
因为 git log 输出的信息很多,如果只想要简洁的输出,可以:
git log --pretty=oneline
假设我们现在有这样一串提交历史:
a1 -> a2 -> a3 -> a4 -> a5
我们从a5
回退到a3
,这时候使用git log
将只能查看到a1
a2
a3
这3次的提交历史,a4
a5
的提交历史是查看不到的。这时候,如果我们改变主意,又想从a3
回到a5
该怎么办呢,就可以使用:
git reflog
可以查看所有的提交历史记录。我们只需要知道我们在a5
时的commit message
然后找到对应commit id
,就可以回退到a5
。
下面具体讲怎么进行版本回退或者版本切换。
git reset
和之前一样,假如我们有下面这一串commit的历史,我们希望从a5
回退到a3
。
a1 -> a2 -> a3 -> a4 -> a5
首先在a5
我们输入git log
查看a3
对应的commit id
,是一段很长的字母数字序列,假设前 4 位是ab42
,并且在所有的commit id里面是唯一的(方便我们做简写)。
接着执行:
git reset --hard ab42 # commit id 不用写全,写明能够标识该 commit id 的前几位即可
我们还有更方便的方法,可以不用知道commit id
:
git reset --hard HEAD^^
其中HEAD^^
标识我们切换会上上一个版本。如果指向切换为上一个版本,也就是a4
,那可以:
git reset --hard HEAD^
作者:Juntao Tan
https://tanjuntao.github.io/
3000+ 道面试题在线刷,最新、最全 Java 面试题!
【238期】Java 8 中 Lambda 实现原理及源码剖析!
【239期】面试官问:你觉得 ThreadLocalRandom 这玩意安全吗?
【240期】面试官问:说说基于 Redis 实现延时队列服务?
【241期】面试官问:有了 for 循环 为什么还要 forEach?
最近有很多人问,有没有读者&异性交流群,你懂的!想知道如何加入。加入方式很简单,有兴趣的同学,只需要点击下方卡片,回复“加群”,即可免费加入交流群!