打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
我的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 
Date:   Mon Jun 11 19:09:18 2018 +0800
    Add a line
commit d217683121237715e1f96f177c0cc11f01857b6a
Author: zwbao 
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 changed1 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 ...' to update what will be committed)
  (use 'git checkout -- ...' 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 changed0 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 ...' 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 changed1 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 ...' 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 ...' to update what will be committed)
# (use 'git checkout -- ...' 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


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Git 基础 - 记录每次更新到仓库
git中怎样忽略文件和目录
笔记《版本控制之道--使用Git》
git简明教程
开源项目中如何同时支持Git@OSC和Github
git命令总结
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服