Git的一些总结

版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 而对于Git这样的分布式版本控制系统 ,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份 。

1. 初次运行 Git 前的配置

Git 提供了一个叫做 git config的工具, 专门用来配置或读取相应的工作环境变量。这些变量可以存放在以下三个不同的地方:

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
  • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

1.1. 用户信息

每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录:

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

1.2. 在工作目录中初始化新仓库

要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录,执行:

$ git init

1.3. 添加版本控制文件

如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:

$ git add * //所有文件
$ git add README.txt
$ git commit -m 'initial project version'

1.4. 从现有仓库克隆

如果想对某个开源项目出一份力,可以先把该项目的 Git 仓库复制一份出来,这就需要用到 git clone命令。

$ git clone git://github.com/xxx/xx.git
$ git clone git://github.com/xxx/xx.git rename

这两者的唯一的差别就是,现在新建的目录成了rename

2. 记录每次更新到仓库

工作目录下面的所有文件都不外乎这两种状态:已跟踪未跟踪

  • 已跟踪文件:指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或者已放入暂存区。
  • 未跟踪文件:所有其他文件,它们既没有上次更新时的快照,也不在当前的暂存区域。

文件的状态变化周期

2.1. 检查当前文件状态

要确定哪些文件当前处于什么状态,可以用 git status 命令。

2.2. 查看已暂存和未暂存的更新

如果要查看具体修改了什么地方,可以用git diff 命令。

2.3. 提交更新

每次准备提交前,先用 git status 看下,是不是都已暂存起来了,然后再运行提交命令 git commit :

$ git commit

另外也可以用 -m 参数后跟提交说明的方式,在一行命令中提交更新:

$ git commit -m "details"

2.4. 移除文件

要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。

如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。

2.5. 移动文件

$ git mv file_from file_to

2.6. 查看提交历史

默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面。我们常用 -p 选项展开显示每次提交的内容差异,用 -2 则仅显示最近的两次更新。

更详细的介绍可以在这里看到。

3. 撤消操作

3.1. 修改最后一次提交

有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,可以使用 --amend 选项重新提交:

$ git commit --amend

如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 --amend 提交:

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。

4. 远程仓库的使用

远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有些可以写。同他人协作开发某个项目时,需要管理这些远程仓库,以便推送或拉取数据,分享各自的工作进展。

4.1. 查看当前的远程库

要查看当前配置有哪些远程仓库,可以用 git remote 命令,它会列出每个远程库的简短名字。

4.2. 添加远程仓库

要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行 git remote add [shortname][url]

git remote add pb git://github.com/paulboone/ticgit.git

4.3. 从远程仓库抓取数据

$ git fetch [remote-name]

此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。运行完成后,你就可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地,或者只是取出某个分支,一探究竟。

4.4. 推送数据到远程仓库

git push [remote-name] [branch-name]

如果要把本地的 master 分支推送到 origin 服务器上(再次说明下,克隆操作会自动使用默认的 master 和 origin 名字),可以运行下面的命令:

$ git push origin master

4.5. 推送本地分支

git push (远程仓库名) (分支名)

git push origin master

5. Git 分支

Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动。

由于 Git 中的分支实际上仅是一个包含所指对象校验和(40 个字符长度 SHA-1 字串)的文件,所以创建和销毁一个分支就变得非常廉价。说白了,新建一个分支就是向一个文件写入 41 个字节(外加一个换行符)那么简单,当然也就很快了。

分支其实就是从某个提交对象往回看的历史

5.1. 创建一个新的分支指针

比如新建一个 testing 分支,可以使用 git branch 命令:

$ git branch testing

这会在当前 commit 对象上新建一个分支指针。

插入后的示意图

5.2. 切换分支

要切换到其他分支,可以执行 git checkout 命令。

$ git checkout testing

5.3. 新建并切换分支

要新建并切换到该分支,运行 git checkout 并加上 -b 参数:

$ git checkout -b iss53
Switched to a new branch 'iss53'

5.4. 合并

git merge 命令来进行合并 :

$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
 README | 1 -
 1 file changed, 1 deletion(-)

合并时出现了“Fast forward”的提示。由于当前 master 分支所在的提交对象是要并入的 hotfix 分支的直接上游,Git 只需把 master 分支指针直接右移。换句话说,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,因为这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进(Fast forward)。

这里写图片描述

使用 git branch-d 选项执行删除操作:

$ git branch -d hotfix
Deleted branch hotfix (was 3a0874c).

更多更全的解释请看这里

对于冲突的合并,需要使用对比工具对比来比较两者的差异。需要人工检测。(ubuntu的bs4可以使用)

5.6. 分支管理

  1. git branch 命令不仅仅能创建和删除分支,如果不加任何参数,它会给出当前所有分支的清单 。
  2. 若要查看各个分支最后一个提交对象的信息,运行 git branch -v
  3. 要从该清单中筛选出你已经(或尚未)与当前分支合并的分支,可以用 --merged--no-merged 选项(Git 1.5.6 以上版本)。

5.7. 利用分支进行开发的工作流程

对于项目而言,可以建立长期分支特性分支(topic)。

这里写图片描述

  • 长期分支:许多使用 Git 的开发者都喜欢用这种方式来开展工作,比如仅在 master 分支中保留完全稳定的代码,即已经发布或即将发布的代码。与此同时,他们还有一个名为 developnext 的平行分支,专门用于后续的开发,或仅用于稳定性测试 — 当然并不是说一定要绝对稳定,不过一旦进入某种稳定状态,便可以把它合并到 master 里。
  • 特性分支:一个特性分支是指一个短期的,用来实现单一特性或与其相关工作的分支。

这里写图片描述

5.8. 删除远程分支

如果不再需要某个远程分支了,比如搞定了某个特性并把它合并进了远程的 master 分支(或任何其他存放稳定代码的分支),可以用这个非常无厘头的语法来删除它:git push [远程名] :[分支名]

$ git push origin :serverfix

一定要注意这条语句!

6. SSH

由于本地Git仓库和仓库之间的传输是通过SSH加密的,所以必须要让仓库认证你SSH key,在此之前,必须要生成SSH key。

6.1. 创建SSH Key

在windows下查看[c盘->用户->自己的用户名->.ssh]下是否有id_rsaid_rsa.pub文件,如果没有需要手动生成。
打开git bash,在控制台中输入以下命令:

$ ssh-keygen -t rsa -C "youremail@example.com"

密钥类型可以用 -t 选项指定。如果没有指定则默认生成用于SSH-2的RSA密钥。这里使用的是rsa。

参考

  1. Git Book
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值