Skip to content

Latest commit

 

History

History
224 lines (161 loc) · 7.77 KB

我的Git笔记(二).md

File metadata and controls

224 lines (161 loc) · 7.77 KB

我的Git笔记(二)

使用git diff查看文件之间的不同

现在,我们可以用Git将文件上传到暂存区并且进行commit,也可以用git status命令来查看哪些文件被跟踪,哪些文件有更改,哪些文件正在进行下一次提交。除此之外,另一个命令在这个过程中也非常有用,就是git diff。如果没有任何参数,git diff将比较工作区与暂存区。例如,如果我们新添加一行到README.md并运行git diff

$  echo "Project started 2018-06-11" >> README.md
$ git diff
diff --git a/README.md b/README.md
index 97440ca..f95be81 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,3 @@
 Git is a version control system.
 Git is free software.Git is free software distributed under the GPL.
+Project started 2018-06-11
--- a/README.md
+++ b/README.md

这两行表示了现在是ab两个文件在进行比较;---表示我们最近一次提交的版本,+++则表示已经发生改变的版本

 Git is a version control system.
 Git is free software.Git is free software distributed under the GPL.
+Project started 2018-06-11

以空格开头的行表示没有被改变的内容,以+开头的是被添加的行,-开头的是被删除的行(这里我们只添加了一行所以没有这个符号)。

当我们将改变过的文件git add后再运行git diff就不会有任何输出了,因为git diff只是比较工作区与暂存区。

$ git add README.md
$ git diff # shows nothing

要是我们想比较暂存区的文件和最近一次提交的文件,可以使用 git diff --staged

$  git diff --staged
diff --git a/README.md b/README.md
index 97440ca..f95be81 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,3 @@
 Git is a version control system.
 Git is free software.Git is free software distributed under the GPL.
+Project started 2018-06-11

使用git log查看你的commit记录

Git中的commit就是在某个时间点的快照,并且每个提交(除第一个之外)指向其父提交; 这个提交链就是一组连接的快照,展示了你的库是如何演变的。

commit

我们可以使用git log来可视化commit记录:

$ git log
commit 630fbbb693aaeb46a980a3a7d983cf6dafe2adaf (HEAD -> master)
Author: zwbao <shinningbzw@foxmail.com>
Date:   Mon Jun 11 19:09:18 2018 +0800

    Add a line

commit d217683121237715e1f96f177c0cc11f01857b6a
Author: zwbao <shinningbzw@foxmail.com>
Date:   Mon Jun 11 17:39:05 2018 +0800

    Add README

随着我们的提交,这条命令的输出也会随之变长。如果你想要看看一个很长的git log输出不妨看看我们之前克隆的seqtk,在那个文件夹试试这条命令。

使用git rm删除文件

我们先添加一个新文件test.txt到Git并且提交:

$ git add test.txt
$ git commit -m "add test.txt"
[master 043a28d] add test.txt
 2 files changed, 1 insertion(+)
 create mode 100644 test.txt

一般情况下,当你不需要test.txt时,可以直接删除它或者使用rm命令:

$ rm test.txt

这时,Git也会发现你删除了这个文件,输入git status

$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    test.txt

no changes added to commit (use "git add" and/or "git commit -a")

当你确实要删除这个文件时,就用git rm删掉,并进行git commit

$ git rm test.txt
rm 'test.txt'

$ git commit -m "remove test.txt"
[master 13770d8] remove test.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 test.txt

现在,这个文件就已经完全从版本库中删除了。

使用.gitignore告诉Git哪些文件需要忽略

你也许已经发现git status会列出当前还没有被跟踪的文件,随着文件数目的增多,这个列表也会越来越长。但这些文件中,有些我们确实不想跟踪比如一些测序数据,因为他们太大了(当你提交这些大文件后,当别人克隆你的仓库时就不得不也下载如此大的数据了,之后我们会讲解如何管理这些数据,现在就先把他们忽略吧)。

如果我们希望忽略data/seqs/文件夹下的所有FATSQ文件,那么就下创建并编辑一个.gitignore文件,输入:

data/seqs/*.fastq

现在,输入git status看看:

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .gitignore

nothing added to commit but untracked files present (use "git add" to track)

接着,我们继续添加和提交这个文件:

$ git add .gitignore

$ git commit -m "added .gitignore"
[master 77eae85] added .gitignore
 1 file changed, 1 insertion(+)
 create mode 100644 .gitignore

那么哪些文件是我们应该告诉.gitignore将他们忽略的呢?

  • 大文件 这些文件应该被忽略,并通过其他方式进行管理。 大文件会减慢创建,推送和提交的速度。当别人克隆你的仓库时,这可能会导致相当大的麻烦。

  • 中间文件 生物信息学项目往往充满了中间文件。 例如,你将read回帖到基因组上时,则会创建SAMBAM文件。 即使这些不是大文件,这些也应该被忽略。因为如果一个数据文件可以通过重新运行命令(或脚本)轻松地重新生成,我们通常只需存储它的创建方式。

  • 文本编辑器的临时文件 Emacs和Vim等文本编辑器有时会在你的目录中创建一些临时文件。这些可能是像textfle.txt〜#textfle.txt#。在Git中跟踪这些内容也是没有意义的,所以,这些文件应该添加到.gitignore中。幸运的是,.gitignore也支持通配符,所以这些文件可以用*〜\#* \#来忽略。

  • 临时的代码文件 一些编程语言的编译器(例如Python)通常也会产生一些临时文件(例如overlap.pyc),需要将他们忽略。

使用git reset撤销暂存区的修改

如果你不小心把一个错误的修改git add到暂存区了,你可以使用git reset来取消它。 例如:

$ echo "TODO: ask sequencing center about adapters" >> README.md
$ git add README.md
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
# #
new file: README.md
#

git status查看后,我们可以发现我们对于README.md的改变已经包含在下一次的提交中,为了撤销这次修改,根据git status的提示输入git reset HEAD README.md

$ git reset HEAD 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
#

Git中,我们用HEAD来表示当前版本,也就是最新的提交,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

现在我们虽然已经撤回了这次的git add,但是README.md文件中已经添加了TODO: ask sequencing center about adapters这一行,倘若我们要丢弃工作区的修改呢?

使用git checkout丢弃工作区的修改

git checkout -- file命令可以丢弃工作区的修改:

$ git checkout -- README.md
$ git status
On branch master
nothing to commit, working tree clean

本文主要参考了《Bioinformatics Data Skills》第五章以及廖雪峰Git教程