git

1、结构

git是分布式的, 可以各自独立,没有中心, 而cvs svn等是集中式的,因为是分布式的,可以在安装了git的任何机器上创建版本库(没有服务器),但通常拿一个远程库大家共同推送到这个上面(相当于服务器)

远程仓库  -- 即另外一个电脑上的仓库

工作区和暂存区

工作区有一个隐藏目录.git,这个不算工作区的,而是Git的版本库。
Git的版本库里存了很多东西:
1)其中最重要的就是称为stage(或者叫index)的暂存区,
2)还有Git为我们自动创建的第一个分支master,
3)以及指向master的一个指针叫HEAD。
把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到本地仓库的当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

分支及作用

作用:假设你准备开发一个新功能,需要10天才能完成,第一天你写了10%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。 如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

 

Git跟踪并管理的是修改,而非文件 

同一个文件, 第一次修改后 add 到暂存区, 然后再修改, 
那么commit时,只会把暂存区的内容提交到版本库, 之后修改的因为没有add到暂存区, 所以不会被提交

2、命令

创建本地仓库:

进入一个目录, 然后git init  (或者从远端 git clone 比如 git clone git@111.222.33.188:/git/android.git/

 

通过git init命令把这个目录变成Git可以管理的仓库:

当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的

 

添加远程主机:

如果是用 git init先创建本地仓库,需要使用git remote add命令用于添加远程主机,然后才能把本地的推送到远程仓库。
$ git remote add <主机名> <网址>

如果是用 git clone从远程仓库克隆的,那么会自动添加该远程主机。

可以使用 git remote -v  来查看

 

把文件添加到本地仓库:

第一步,用命令git add告诉Git,把文件添加到仓库

$ git add readme.txt

执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。

第二步,用命令git commit告诉Git,把文件提交到仓库:

$ git commit -m "wrote a readme file"

-m 本次提交的说明

 

查看状态:

$ git status

git status命令可以让我们时刻掌握仓库当前的状态

 

 

查看修改内容:

$ git diff readme.txt 

 

git操作日志

$ git log --pretty=oneline

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

 

返回上一个版本

$ git reset --hard HEAD^

返回指定版本时,只需HEAD^替换成版本号的前几位,git会自动查找。

 

rm命令删除文件:

$ rm test.txt

这个时候,Git会知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:

现在你有两个选择:

一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:

$ git rm test.txt

rm 'test.txt'

$ git commit -m "remove test.txt"

现在,文件就从版本库中被删除了。 

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

$ git checkout -- test.txt

 

丢弃工作区的修改

$git checkout -- readme.txt    (注:命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令)
用本地仓库里的内容覆盖掉工作区的内容,这里有两种情况:

一种是readme.txt修改后还没有被放到暂存区,现在撤销修改,就是用本地仓库里的内容覆盖掉工作区的内容;
一种是readme.txt已经添加到暂存区后,现在撤销修改, 就是用本地仓库里的内容覆盖掉工作区的内容,但暂存区里的修改不会改变

$ git reset HEAD readme.txt
可以把暂存区的修改撤销掉,重新放回工作区

小结
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交使用:
git reset --hard 3628164

 

拉取远程仓库里的更新取到本地:

比如,取回origin主机的master分支。

Git fetch origin master
所取回的更新,会存储在本地主机上。

git branch -a 查看存储在本地的所有分支。
$ git branch -a
* master                               --这是本地仓库的master分支
  remotes/origin/master     --这是远程仓库的master分支

git fetch:相当于是从远程获取最新版本到本地,不会自动merge合并
Git fetch origin master                     --从远程的origin的master主分支下载最新的版本到origin/master分支上
git log -p master..origin/master      --比较本地仓库的master和远程master的区别
git merge origin/master                   --合并到当前分支

git pull:相当于是从远程获取最新版本并merge到本地
git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
$ git pull <远程主机名> <远程分支名>:<本地分支名>
比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。
$ git pull origin next:master
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
$ git pull origin next

 

将本地仓库推送到远程

git push命令用于将本地分支的更新,推送到远程主机 
$ git push <远程主机名> <本地分支名>:<远程分支名>
比如:
$ git push origin master
上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。

如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
$ git push origin :master
# 等同于
$ git push origin --delete master
上面命令表示删除origin主机的master分支。

如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
$ git push origin
上面命令表示,将当前分支推送到origin主机的对应分支。

如果当前分支只有一个追踪分支,那么主机名都可以省略。
$ git push

如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。

这时,如果你一定要推送,可以使用--force选项。

 

分支

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/qjoanven/p/7641181.html