GIT+IDEA使用

基本事实

1、git 的clone和其他vcs的checkout有本质区别,clone时,获取的是整个仓库的几乎所有数据,远程仓库的每一个文件的每一个版本都会被拉取下来。命令格式:git clone [url] [mydir]。举例:    git    clone    https://github.com/libgit2/libgit2。这会在当前目录下创建一个名为    “libgit2”    的目录,并在这个目录下初始化一个    .git    文件夹,从远程仓库拉取下所有数据放入    .git    文件夹,然后从中读取最新版本的文件的拷贝。如果你进入到这个新建 的    libgit2    文件夹,你会发现所有的项目文件已经在里面了,准备就绪等待后续的开发和使用。

 

2、git add 这个命令是“添加内容到下一次提交中”而不是“将一个文件添加到项目中”,所以,当你修改了一个版本库里存在的文件时,也是需要运行git add的,这一步被很多工具默认做了,所以你没有察觉,但你必须知道这件事。举例:你修改了一个库里的文件,运行了git add,然后再次修改保存了,然后运行git status,你会发现,这个文件同时存在于暂存区和非暂存区,如果你直接git commit,那么第二次的修改不会被提交,因为commit只会提交暂存区的内容。同时,也说明了暂存区的含义,下次提交区域,和文件是否是首次加入仓库没有关系。

3、如果你使用clone命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以“origin”为简写。他是包含了一个添加远程仓库的动作的,这点你必须知道。手动添加远程仓库的命令是 git    remote    add    <shortname>    <url>。添加远程仓库并不会拉取数据下来,只是记录了远程仓库的地址等基本信息。如果你想拉取仓库内容下来,可以git    fetch    shortname。这个命令会访问远程仓库,从中拉取所有你还没有的数据。执行完成后,你将会拥有那个远程仓库中所有 分支的引用,可以随时合并或查看。也即你可以跟踪远程仓库的所有内容了。默认情况下, git    clone    命令会自动设置本地    master    分支跟踪克隆的远程仓库的    master 分支(或不管是什么名字的默认分支)。

4、Git 保存的不是文件的变化或者差异(SVN是),而是一系列不同时刻的文件快照。每次 你提交更新,或在    Git    中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。    为了高效,如果文件没有修改,Git    不再重新存储该文件,而是只保留一个链接指向之前存储的文件。Git对待数据更像是一个快照流。

5、git中,checkout是切换分支,切换分支,切换分支。当你切换分支的时候, Git 会重置你的工作目录, 使其看起来像回到了你在那个分支上最后一次提交的样子。 Git 会自动添加、 删除、 修改文件以确保此时你的工作目录和这个分支最后一次提交时的样子一模一样。由于 Git 的分支实质上仅是包含所指对象校验和( 长度为 40 的 SHA-1 值字符串) 的文件, 所以它的创建和销毁都异常高效。 创建一个新分支就像是往一个文件中写入 41 个字节( 40 个字符和 1 个换行符) 。

6、变基操作能将某一分支的修改移至另一分支,这样操作能起到merge同样的效果,并且能让提交链路由岔路变成直线。
 


 

 

 

 

说git是分布式的?

git没有服务端和客户端之分,大家统一安装git软件,这和svn有本质区别,svn服务端和客户端是不同的安装软件。分布式不代表没有服务器,在哪个机器上创建了master分支,那么那个机器就会是中心(远程服务器),大家会往他那里提交代码,由他来合并,也就是说,这个中心是依赖主观人为形成的,而不是靠客观技术手段约束形成的。虽然git是分布式的,但是我们多数情况下还是需要一个服务器,因为要多终端或者多人协作,这种情况必须有人充当服务端。也就是还是要有个中心,虽然人人可以当中心,但最终还是有一个中心。

git init // 会默认创建一个名字为master的分支

git add readme.txt

git commit -m "wrote a readme file"

如果你是在本机上创建的版本库,在本机上就不需要push了,push是个会发生网络通信的命令,会推送本地版本信息到指定的远程主机的版本库里。现在大家在公司的使用方式通常是公司搭建了服务端,所有员工都是客户端,项目经理在远程机器上初始化版本库(创建了master分支),然后创建开发分支x,让多个开发同事拉取分支x,然后多个同事同时在分支x上开发,pull,commit和push等,分支x发完版后,将分支x合并到master分支,然后从master上再创建分支y,继续类似分支x的操作。

常用命令

git checkout master // 切换到master分支

git checkout -b dev // 从当前分支创建新分支dev并切换到新分支dev

git checkout -b dev master // 从指定分支master创建新分支并切换到新分支

git branch dev // 从当前分支创建新分支dev

 

什么是分支?

分支是一个commit对象链,一条工作记录线,git每一次提交,都会在该次提交记录上存一个字段parent,记录的是上一个提交的版本号,这样就可以从一个提交的快照里拿到之前所有提交过的记录。每个分支都有一个名字。新建一个分支就是新建一个指向某个提交记录的指针。拉取的分支可以建立在任意分支基础上,不一定非要从master上拉取,但是一般都是从master上拉取,然后合并回master。

 

HEAD是什么?

用来指向分支的指针,指向当前分支的一个指针,用来快速定位当前操作目标分支。git会有多个分支,你可以随意切换,切换操作改变的是HEAD的指向,你的操作都是针对HEAD指向的分支进行的,所以操作前先确定自己的分支。

 

origin是什么?

远程仓库名字 “origin” 与分支名字 “master” 一样,在 Git 中并没有任何特别的含义一样。 同时“master”是当你运行git init时默认的起始分支名字,原因仅仅是它的广泛使用,“origin” 是当你运行 git clone 时默认的远程仓库名字。 如果你运行 git clone -o booyah,那么你默认的远程分支名字将会是 booyah/master。

但是origin 并不是指的远程的仓库,而是指得是远程仓库在本地副本的一个指针(这个指针有可能过时的)。当我们使用merge 的时候,我们进行合并的时候只是上一次fetch 从远程拿到的版本。不是远程仓库的最新版本。

 

idea右下角显示分支不及时?

vcs -> git - fetch

 

 

 

 

 

 

发布了187 篇原创文章 · 获赞 27 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章