【Bash百宝箱】认识git

git是一款开源的分布式版本管理系统,由Linux之父Torvalds用C语言开发,他对git的解释是“the stupid content tracker”,自称为stupid,却是一个非常强大的tracker。

使用git管理项目时,文件流经三个工作区:工作目录、暂存区及本地仓库。先来感性地认识一下,当我们初始化或者克隆一个仓库时,在当前目录有一个名为“.git”的隐藏目录,里面保存了这个仓库的版本信息,当前目录及其子目录即工作目录,可以添加、修改、删除文件,当文件状态发生变化时,如果想保存到这个仓库,首先要将这些变化的文件添加到暂存区,当然也可以把它们撤出暂存区,最后提交到本地仓库。

1、在Linux上安装git

快速安装:在shell终端执行命令“sudo apt-get install git”。
源码安装:下载源码包并解压,在解压目录依次执行命令“./config”、“make”、“make install”。

查看git安装是否成功,可以在shell终端直接执行命令git,安装成功时会有git用法提示,如下:

$ git
usage: git [--version] [--help] [-C <path>] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone      Clone a repository into a new directory
   init       Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add        Add file contents to the index
   mv         Move or rename a file, a directory, or a symlink
   reset      Reset current HEAD to the specified state
   rm         Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect     Use binary search to find the commit that introduced a bug
   grep       Print lines matching a pattern
   log        Show commit logs
   show       Show various types of objects
   status     Show the working tree status

grow, mark and tweak your common history
   branch     List, create, or delete branches
   checkout   Switch branches or restore working tree files
   commit     Record changes to the repository
   diff       Show changes between commits, commit and working tree, etc
   merge      Join two or more development histories together
   rebase     Forward-port local commits to the updated upstream head
   tag        Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch      Download objects and refs from another repository
   pull       Fetch from and integrate with another repository or a local branch
   push       Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.

安装成功后还需要做一些配置工作,最简单的两条配置如下:

$ git config --global user.name "Your Name Comes Here"
$ git config --global user.email you@yourdomain.example.com

配置git使用config命令,其中“–global”表示影响范围为所有的git仓库,对应的只影响当前仓库的选项为“–local”,“user.name”用于设置用户名,“user.email”用于设置用户邮件。

查看、删除当前配置可使用如下命令:

$ git config --get <var>
$ git config --get-all <var>
$ git config --unset <var>
$ git config --unset-all <var>
$ git config -l

还有个用于设置别名的命令,如下例子(用“st”代替“status”):

$ git config --global alias.st status

2、第一个git仓库

创建一个空的仓库:

$ git init

克隆一个远程仓库,如github上的某个仓库:

$ git clone git@github.com:geminy/demon.git

3、查看工作目录状态

$ git status

“status”是一个使用频率较高的命令,用来查看工作区状态,工作目录下新添加的文件状态是未跟踪的untracked,已在仓库中的文件被修改或删除后状态是未暂存的not staged,这两种状态的文件都需要添加到暂存区以便提交到仓库,暂存区下的文件状态包括new、modified、deleted、renamed。

4、添加工作目录的文件到暂存区

使用“add”命令添加工作目录的文件到暂存区,包括未跟踪的文件和已跟踪但作了修改的文件,可以一次性添加一个文件、多个文件、一个目录或所有文件。

$ git add <file>
$ git add <file1> <file2>
$ git add <dir>
$ git add -A
$ git add -all

5、提交暂存区的文件到本地仓库

使用“commit”命令提交暂存区的文件到本地仓库,对应的会生成一个“commit id”,这个id是唯一的。一个非常有用的选项是“-m”,表示对本次提交的说明,“–amend”不会产生新的“commit id”,而是追加到上一次提交的“commit id”,“-a”自动暂存已跟踪的且被修改的文件,即不用“git add”。

$ git commit -m <msg>
$ git commit --amend -m <msg>
$ git commit -a -m <msg>

6、撤销工作目录的修改

已跟踪的文件被修改时,可使用“checkout”命令撤销修改。

$ git checkout <file>
$ git checkout <file1> <file2>
$ git checkout <dir>

7、撤销暂存区的修改

处于暂存区的文件,可使用“reset”命令把它们移出暂存区,有几种模式,包括“–soft”、“–mixed”、“–hard”、“–merge”、“–keep”,默认为“–mixed”,其中最暴力的是“–hard”,移出暂存区的同时撤销在工作目录的修改,恢复原始状态。如下例子中的“HEAD”是最近一次提交到仓库的“commit id”,前面几次依次为“HEAD^”“HEAD^^”……如果是前面n次呢,那就显得很不方面了,不过可以这样表示“HEAD~n”,n是一个具体的数字,这个数字是需要我们自己算出来的,还是有点麻烦,“HEAD”其实就是个“commit id”,直接使用某个具体的“commit id”就方便多了。

$ git reset [mode] HEAD <file>
$ git reset [mode] HEAD <file1> <file2>
$ git reset [mode] HEAD <dir>
$ git reset [mode] HEAD

8、查看工作目录的修改

已跟踪的文件被修改时,在保存到暂存区之前,可使用“diff”命令查看文件作了哪些变化。

$ git diff <file>
$ git diff <file1> <file2>
$ git diff <dir>
$ git diff
$ git diff <commit id> <file>

9、查看提交日志

查看仓库的提交日志使用“log”命令,其参数“–pretty=oneline”表示在一行显示提交的“commit id”和说明,“–abbrev-commit”表示通常很长的“commit id”只显示前七位,这七位其实就够用了,“–graph”表示以关联图表的形式显示提交记录,另外,还有个相关的命令“reflog”。

$ git log
$ git log --pretty=oneline
$ git log --abbrev-commit
$ git log --graph
$ git reflog

10、删除仓库中的文件

对于仓库中的文件,使用“rm”命令删除它们,默认不在工作区备份,选项“–cached”表示在工作目录备份,“-f”表示不在工作目录备份,“-r”用于目录。

$ git rm <file>
$ git rm <file1> <file2>
$ git rm --cached <file1>
$ git rm -f <file>
$ git rm -r <dir>

11、远程仓库

对于远程git仓库,一般使用ssh协议。首先,使用“ssh-keygen”命令在本地创建类型为rsa的ssh key,创建成功后,在用户主目录的“.ssh”目录下可以找到私钥“id_rsa”和公钥“id_rsa.pub”,命令如下:

$ ssh-keygen -t rsa

创建成功后,在用户主目录的“.ssh”目录下可以找到“id_rsa”私钥和“id_rsa.pub”公钥。例如现在流行的github,注册帐号登录后,在“Settings”选项里找到“SSHKeys”,根据页面提示添加公钥添加即可。

可以使用上面提到的“clone”命令克隆一个远程仓库到本地,或者使用下面的命令关联本地仓库与远程仓库。

$ git remote add origin git@github.com:naturEarth/hellogit.git

使用“remote add”命令添加远程仓库,“origin”是远程仓库的名字,默认这个名字,也可以是其它的名字,上面的命令关联的是github上名为naturEarch的hellogit仓库。

$ git push -u origin master

使用“push”命令推送本地仓库的内容到远程仓库,“master”表示分支,“-u”即“–set-upstream”,表示不仅会把本地的分支推送到远程的分支,还会把本地的分支和远程的分支关联起来,在以后的推送或者拉取时就可以简化命令。推送成功后,可以立刻在github页面上看到远程仓库的内容和本地一模一样,从现在起,只要本地作了提交,就可以继续使用上面的“push”命令更新到远程仓库,只不过不再需要使用“-u”选项。

12、多分支

git的一大特点是多分支管理,分支之间互不影响,可以独立使用,减少了代码的耦合、冗杂。

查看分支:

$ git branch

创建分支:

$ git branch <name>

切换分支:

$ git checkout <name>

创建并切换分支:

$ git checkout -b <name>

删除分支(如果在被删除的分支上提交了东西却没有merge到当前分支,用“-d”参数删除是会失败的,这时就要用到“-D”参数了,忽略被删除分支上的提交):

$ git branch -d <name>
$ git branch -D <name>

合并分支(在合并分支时,有可能会产生冲突,这是因为多个分支同时修改了某个文件导致的,这时候就要手动修改产生冲突的文件了):

$ git merge <branchname>

13、远程仓库及多分支

$git remote

查看远程仓库的名字。

$ git remote -v

参数“-v”即“–verbose”,查看远程仓库的名字及url。

$ git branch -r

查看远程仓库的分支。

$ git checkout -b <name> origin/<branch_name>

创建并切换分支,同时与远程仓库“origin”的“branch_name”分支关联起来,如果远程仓库“origin”没有“branch_name”分支的话,则会创建出来,这样做的目的是方便以后本地仓库和远程仓库的同步,如果不这样做的话,在后面的pull或push代码时会有问题,不过这也是有补救措施的,如下命令:

$ git branch --set-upstream <name> origin/<branch_name>

更新远程仓库到本地可使用如下命令(fetch与pull的区别是,fetch不进行自动merge):

$ git pull
$ git fetch

14、stash妙用

“stash”是一个有用的命令,目的是清理并保存当前工作现场,在需要的时候再拿出来使用。

$ git stash

清理并保存当前工作现场,会产生一个id,形如“stash@{n}”,n是一个具体的数字,从0开始。

$ git stash list
$ git stash clear

“list”查看stash状态,“clear”清空stash列表(慎用)。

$ git stash pop [id]
$ git stash apply [id]
$ git stash drop [id]
$ git stash show [id]

“id”是可选的,默认是“stash@{0}”,“pop”的意思是把stash列表中与id对应的东西移动到工作现场,“apply”表示复制,“drop”表示删除,“show”表示查看。

$ git stash save <message>

“save”提供本次stash的描述,方便以后查看。

15、查看文件修改记录

使用“blame”命令查看文件修改记录,可以查看每行海马的修改记录。

$ git blame <file>

16、几个高级命令

$ git cherry-pick <commit_id>

使用“cherry-pick”命令把本地一个分支的提交应用到另一个分支。

$ git rebase <branch_name>

在某个分支作了commit之后,发现不想要这些提交了,可以使用“rebase”命令把当前分支同步为某个上游分支的状态。

$ git revert <commit_id>

“revert”命令用于撤销某次提交,被撤销提交的前后提交会保留下来,而本次revert操作会作为一个新的提交。

17、忽略文件

有些文件我们并不想保存到git仓库,可以把它们写入到一个特殊文件“.gitignore”,位置同“.git”在一个目录,这些文件可以简单列出,也可以使用通配符,符号“#”表示注释。

18、git的图形用户工具

git管理基本都是在命令行完成的,不过也有许多图形用户工具可以使用,其中,“gitk”是一个好用的工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值