Bioinformatics-Data-Skills》之GIT基本操作(2)
前面我们学习了使用Git进行文件track,stage与commit的基本操作,今天学习剩余的基本操作,分别是git diff
, git log
, git mv & rm
, .gitignore
, 和git reset
。
git diff
git diff
用来查看当前版本的文件与已经staged文件的区别(若没有staged文件则展示与上一个版本文件的区别),例如我们在readme文件中加入日期:
echo "Project start $(date +%F)" >> readme.md
git diff
# diff --git a/readme.md b/readme.md
# index a4b8a1b..738a817 100644
# --- a/readme.md
# +++ b/readme.md
# @@ -35,3 +35,4 @@ Recommended trimming programs:
#
# - Trimmomatic
# - Scythe
# +Project start 2021-06-05
可以看到修改后的文件与旧文件在哪一行发生了改变,如果将readme文件进行stage就没有区别了(因为当前文件与stage文件是一致的):
git add readme.md
git diff
git log
使用git log
命令可以查看commit历史,commit历史是一个有向无环图(fig.1)。
git log
# commit 31f39cc98be60b1b4131cf0593083116c89ae6f3 (HEAD -> master)
# Author: Liuwei <pseudoway@163.com>
# Date: Sat Jun 5 16:19:55 2021 +0800
#
# 初始化
commit 后面的一串字符根据新版文件与旧版文件区别生成的唯一hash值,这里只有一次commit历史(可以自己试着多commit几次看一下历史)。
git mv & git rm
使用git进行版本管理后如果我们继续采用mv
或者rm
命令移动或删除文件的话会让git困惑,更应该采用git mv
等命令。例如我们将readme.md
文件重命名为README.md
:
git mv readme.md README.md
git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: readme.md -> README.md
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# data/seqs/
git commit -m "重命名文件"
可以看到文件名修改已经被追踪并且直接stage(注意:这与文件的内容改变后需要手动stage不同)。
.gitignore
使用git status
的时候会展示出所有untracked文件,随着分析的进行存在大量的文件的时候,继续显示大量非追踪文件是一种负担。我们可以创建.gitignore
文件来忽视文件的track。例如我们想要忽视size特别大的fastq文件:
echo "data/seqs/*.fastq" >> .gitignore
git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: readme.md -> README.md
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# .gitignore
可以将.gitignore
文件也加入track的。
我们可以选择性地忽略以下几种类型的文件:
-
原始数据,这些数据size特别大,进行clone的时候会非常缓慢,推荐采用别的方式共享;
-
部分中间结果,某些中间结果数据量也非常大而某些重新生成非常容易,这些文件建议忽略;
-
编辑器生成的临时文件,例如vim和emac编辑器的临时文件
example.txt~
和#example.txt#
; -
程序生成的临时文件。
针对某些无论如何都应该忽略的文件(后两种文件,通过通配符来匹配),我们可以在home目录下设定一个全局的忽视文件~/.gitignore_global
,所有工程的git配置都可以通过以下命令共享:
git config --global core.excludefile ~/.gitignore_global
git reset
为了实现版本控制的组织性与纪律性,git的每一次commit的版本和版本描述最好是有阶段性意义的。如果我们无意中将一份修改一半的文件进行了stage,可以采用git reset
命令来unstage。
echo "TODO: something to do blabla" >> README.md
git add README.md
git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README.md
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# .gitignore
git reset HEAD README.md
# Unstaged changes after reset:
# M README.md
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.md
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# .gitignore
#
# no changes added to commit (use "git add" and/or "git commit -a")
git reset
是根据索引来重新stage的,HEAD
参数指的是最近一次staged文件。
网友评论