[关闭]
@llplmlyd 2018-10-11T19:56:27.000000Z 字数 4766 阅读 994

Git分布式版本控制系统

Git


用途:多人在线协作,记录文件中的每次改动的时间和内容。
Git的诞生:BitMover公司的BitKeeper为Linux的免费使用权的收回。使得Linus自己去开发了一个版本控制系统即Git。

版本控制系统类型

集中式:版本库是集中存放在中央服务器的,个人每次使用时,都必须从中央调用出来,然后改完后再放回中央。
缺点即需要联网。网速可能会影响协作效率。
而分布式:人人都有版本库。无需联网。这样对于同一份文件,每个人自己修改完之后,就可以存储在本地当中,随时可以修改,并且如果多人协作查看修改,则相互之间互推修改版本就可看到对方修改的内容。分布式也可以有一台充当“ 中央服务器 ”的电脑。这样方便“交换”大家的修改。修改的内容会覆盖上去。可以每个人负责不同的版块,然后拼接成一个完整的文件。然后还有所谓主次之分,即所有的修改需要经过主负责审核,才能通过与覆盖。
并且分布式相较于集中式安全,就是由于人人有版本库,就不担心其中一台电脑出事后,所有数据都丢失了。

安装Git

在Linux上安装Git

1.输入Git查看系统是否安装git:$ git
2.根据返回的信息协作,安装。
(Debian或Ubuntu Linux)键入下值即可安装。

  1. sudo apt-get install git
 如果是其他Linux版本,可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入: ./config,make,sudo make install 这几个命令安装就好了。

在Mac OS X上安装Git

两种安装方法:
1.安装homebrew(软件包管理器),通过它安装Git,具体方法请参考homebrew的文档:http://brew.sh/
2.AppStore安装Xcode。运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”。

在Windows上安装Git

Windows下要使用很多Linux/Unix的工具时,需要Cygwin这样的模拟环境,Git也一样。有高人已经把模拟环境和Git都打包好了,名叫msysgit,只需要下载一个单独的exe安装程序,从https://git-for-windows.github.io下载(国内镜像网站https://pan.baidu.com/s/1kU5OCOB#list/path=%2Fpub%2Fgit

版本库Repository,又名“仓库”

可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

  1. $ mkdir learngit # 创建目录
  2. $ cd learngit # 进入目录learngit
  3. $ pwd #显示目录路径
  4. /Users/michael/learngit
  1. $ git init #将目录初始化为git
  2. Initialized empty Git repository in /Users/michael/learngit/.git/
  3. $ ls # 可以查看当前列表是否已经建立版本库
  4. learngit
  5. $ ls -ah #查看隐藏目录
  6. . .bash_history .gitconfig
  7. .. .git learngit
  1. $ git add readme.txt #learngit目录下新建readme.txt,然后将新建的文件夹加入到缓存区stage(或index)
  1. $ git commit -m "wrote a readme file" #将文件提交到master区间
  2. [master (root-commit) cb926e7] wrote a readme file
  3. 1 file changed, 2 insertions(+)
  4. create mode 100644 readme.txt
  1. $ git log #查看修改的详细过程
  2. commit 3628164fb26d48395383f8f31179f24e0882e1e0
  3. Author: Michael Liao <askxuefeng@gmail.com>
  4. Date: Tue Aug 20 15:11:49 2013 +0800
  5. wrote a readme file

如果觉得git log命令太多可以使用下面的这个命令,这两个可以查看自己修改过的版本,然后利用commit id进行版本回退或者前进

  1. $ git log --pretty=oneline #省略不必要的信息
  2. 3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
  3. ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
  4. cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file

版本回退

在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

  1. $ git reset --hard HEAD^ #回到上一个版本
  2. HEAD is now at ea34578 add distributed
  1. $ cat readme.txt #使用cat可以查看是否回退到上一个版本

再次利用git log可以查看历史版本,就会发现刚刚的版本不见了,如果又想回去回到“未来”的状态,那么:

  1. $ git reflog #这个命令记录了每一次命令的过程ID,查到后再用reset就可回到未来。
  2. ea34578 HEAD@{0}: reset: moving to HEAD^
  3. 3628164 HEAD@{1}: commit: append GPL
  4. ea34578 HEAD@{2}: commit: add distributed
  5. cb926e7 HEAD@{3}: commit (initial): wrote a readme file

而采用git status 可以查看状态(该图与上图无关联)

  1. $ git status #查看版本修改的确定态
  2. # On branch master
  3. nothing to commit (working directory clean)

为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。下面的例子可以说明对修改过程的控制:
对版本库中主分支的 readme.txt 进行.第一次修改后 git add -->添加到了暂存区,如果这个时候再对 readme.txt 进行二次修改 但却没有git add 到缓存区,那么进行 git commit-->提交到master中 是第一次修改后的内容,第二次的修改是无效的。
[x]第一次修改 -> git add -> 第二次修改 -> git add -> git commit
[]第一次修改 -> git add -> 第二次修改 -> git commit

  1. $ git diff HEAD -- readme.txt

使用这个命令可以查看工作区和版本库里最新版本的区别,以分辨提交的是第几次修改的内容

  1. $ cat readme.txt #使用cat命令可以查看txt文本的内容

后悔药

1.如果在工作区的文件输入错误但未添加到暂缓区域,可使用 git checkout -- file 丢弃修改。
[x]如果缓存区中原有该文件,则回退到缓存区的文件状态。
[x]如果没有,则是回退到版本库master中的文件状态。

  1. $ git checkout -- readme.txt

2.若错误内容已添加git add到了暂缓区域,但未 commit。可使用reset 命令回到到工作区。 git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。

  1. $ git reset HEAD readme.txt
  2. Unstaged changes after reset:
  3. M readme.txt

3.不仅 git add -->缓存区,而且还 git commit-->到版本库了...
还好还好,还没推到远程仓库。使用上面说过的 版本回退 就可以回到初始状态啦,不虚不虚

4.删除文件:git rm file,删错可使用于 git checkout -- 一键还原

远程仓库Github

(先在Github中配置所需要的步骤SSH keygen)
1.关联远程仓库。
远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。例如:

  1. $ git remote add origin git@github.com:Github账户名/learngit.git
  2. git remote add origin git@server-name:path/repo-name.git

2.把本地库的所有内容推送到远程库上
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

  1. $ git push -u origin master

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

  1. $ git push origin master

分支管理

Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>

解决冲突:
[]本地分支冲突, 解决完冲突再提交即可。
[]远程仓库,多人协作冲突。推送到远程库中出现冲突那么要使用下拉,先冲远程拉下文件,在本地解决完冲突再提交即可。但在下拉前要注意 如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
再使用 git pull ,后续与本地分支冲突处理方法类似。

标签管理Tag

tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。
1.给分支打标签:在分支所在目录下 运行 git tag 即可

  1. $ git tag #再用这个即可查看所有标签名

2.给 commit Id 打标签:如果commit id是6224937,则

  1. $ git tag v0.9 6224937

先用git tag 查看了所有标签后, 用 git show 可查看对应标签的详细信息。

  1. $ git show v0.9
  2. commit 622493706ab447b6bb37e4e2a2f276a20fed2ab4
  3. Author: Michael Liao <askxuefeng@gmail.com>
  4. Date: Thu Aug 22 11:22:08 2013 +0800
  5. add merge

3.标签打错了,也可以删除

  1. 命令git push origin <tagname>可以推送一个本地标签;
  2. 命令git push origin --tags可以推送全部未推送过的本地标签;
  3. 命令git tag -d <tagname>可以删除一个本地标签;
  4. 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

$ git tag -d 标签

配置别名

利用$ git config --global alias.别名 原命令名 ” 就可以给复杂的命令配置别名

  1. $ git config --global alias.st status

后面的就不写啦啦啦,详细的教程都在廖雪峰的网站上面有。
https://www.liaoxuefeng.com/

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注