pro git

网上git 的命令行操作的介绍很多,一搜一大把,但突然发现,东西太多不见得是一件好事,
太多 ≈ 没有。还是自己看progit自己总结一下来得实在,来的踏实。

Git基础

获取Git仓库

获取仓库包括两种:

  • 现有目录初始化 git init
  • clone

检查当前文件状态

文件状态分为两种:已跟踪(快照有记录)和未跟踪

1
git status

另外,加 -s 得到一种更为紧凑的格式输出

1
2
3
4
5
6
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt

新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A标记,修改过的文件前面有M标记。你可能注意到了 M 有两个可以出现的位置,出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区。例如,上面的状态报告显示:README文件在工作区被修改了,但是还没有将修改后的文件放入暂存区,lib/simplegit.rb 文件被修改了并将修改后的文件放入了暂存区。而Rakefile在工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改了的记录

跟踪新文件

跟踪README文件

1
git add README

add 之后,README文件就变成已暂存状态

忽略文件

通过创建。gitignore文件来实现

1
2
3
$ cat .gitignore
*.[oa]
*~

第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的。第二行告诉 Git忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。
此外,你可能还需要忽略 log,tmp 或者 pid 目录,以及自动生成的文档等等。要养成一开始就设置好.gitignore 文件的习惯,以免将来误提交这类无用的文件。

查看已暂存和未暂存的修改

git diff 命令比较的是工作目录中当前文件和暂存区域快照之间的差异(也就是显示尚未暂存的改动)
查看已暂存的将要添加到下次提交里的内容,可以用 git diff –cached 命令

提交更新

1
$ git commit

养成一个好习惯,每次准备提交前,先用 git status 看下,是不是都已暂存起来了,然后再运行提交命令 git commit

但某些情况,我们想跳过使用暂存区域,直接提交,可使用如下命令

1
$ git commit -a

Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤

移除文件

git rmrm相比,会增加移除这一操作的信息。
如果rm后,想增加移除这一操作的信息,可再执行git rm
如果rm过多文件,不适合一个个再git rm,可使用git commit -am “abc”

想让文件保留在磁盘,但是并不想让 Git 继续跟踪

1
$ git rm --cached README

移动文件

使用git mv代替mv,会记录该操作。
运行git mv等同于运行下面三条命令:

1
2
3
$ mv README.md README
$ git rm README.md
$ git add README

查看提交历史

使用git log,辅以-p,–stat等等。

撤销操作

合并提交

例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:

1
2
3
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

最终你只会有一个提交,第二次提交将代替第一次提交的结果。

取消暂存的文件

例如,你已经修改了两个文件并且想要将它们作为两次独立的修改提交,但是却意外地输入了
git add * 暂存了它们两个。如何只取消暂存两个中的一个呢?git status 命令提示了你:

1
2
3
4
5
6
7
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
modified: CONTRIBUTING.md

在 “Changes to be committed” 文字正下方,提示使用 git reset HEAD … 来取消暂存

撤销对文件的修改

幸运的是,git status 也告诉了你应该如何做。

1
2
3
4
5
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: CONTRIBUTING.md

你需要知道 git checkout – [file] 是一个危险的命令,这很重要。你对那个文件做的任何修改都会消失 - 你只是拷贝了另一个文件来覆盖它。除非你确实清楚不想要那个文件了,否则不要使用这个命令
如果你仍然想保留对那个文件做出的修改,但是现在仍然需要撤消,我们将会在 Git 分支 介绍保存进度与分支;
这些通常是更好的做法
记住,在 Git 中任何 已提交的 东西几乎总是可以恢复的。甚至那些被删除的分支中的提交或使用 –amend 选项
覆盖的提交也可以恢复(阅读 数据恢复 了解数据恢复)。然而,任何你未提交的东西丢失后很可能再也找不到
了。

远程仓库的使用

查看远程仓库

查看已配置的远程仓库服务器

1
$ git remote

加上-v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL

添加远程仓库

运行git remote add 添加一个新的远程 Git 仓库,
同时指定一个你可以轻松引用的简写

从远程仓库中抓取与拉取

这个命令会访问远程仓库,从中拉取所有你还没有的数据。执行完成后,你将会拥有那个远程仓库中所有分支的
引用,可以随时合并或查看.(它并不会自动合并或修改你当前的工作。当准备好时你必须手动将其合并入你的工
作。
)

1
$ git fetch [remote-name]

如果你有一个分支设置为跟踪一个远程分支(阅读下一节与 Git 分支 了解更多信息),可以使用 git pull命令来自动的抓取然后合并远程分支到当前分支。这对你来说可能是一个更简单或更舒服的工作流程;默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)。运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支

笔者注:也就是git pull相比git clone会增加合并操作

推送到远程仓库

当你想分享你的项目时,必须将其推送到上游。这个命令很简单:git push [remote-name] [branchname]。当你想要将master 分支推送到origin服务器时(再次说明,克隆时通常会自动帮你设置好那两个名字),那么运行这个命令就可以将你所做的备份到服务器

1
$ git push origin master

只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送

查看远程仓库

如果想要查看某一个远程仓库的更多信息,可以使用 git remote show [remote-name] 命令。

远程仓库的移除与重命名

重命名

1
$ git remote rename

移除

1
$ git remote rm

打标签

列出标签

1
$ git tag

附注标签

1
$ git tag -a v1.4 -m 'my version 1.4'

轻量标签

1
$ git tag v1.4-lw

查看标签信息

1
$ git show v1.4

后期打标签

1
$ git tag -a v1.2 9fceb02

9fceb02是校验和由$git log可得到。

共享标签

默认情况下,git push 命令并不会传送标签到远程仓库服务器上。在创建完标签后你必须显式地推送标签到共
享服务器上。这个过程就像共享远程分支一样 - 你可以运行 git push origin [tagname]。
单个

1
$ git push origin v1.5

多个未在远程仓库的

1
$ git push origin --tags

检出标签

1
$ git push origin v1.5

Git别名

eg:

1
2
3
4
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status

这意味着,当要输入 git commit时,只需要输入git ci。

Git分支

待续

服务器上的分支

待续