Uninote
Uninote
用户根目录
每日点滴
 git basic
git basic

基本概念

working directory/working tree/工作空间

working-dir就是平时我们操作的地方,在这里我们进行添加、删除、修改文件等各种操作,以及merge/rebase/cherry-pick,都是在working-dir上进行的。所以在做这些操作之前,git都要求你working-dir没有任何修改。否则会报类似的错误:
一点小提示:git的报错是非常准确的,耐心的研究它的报错,对你逐渐理解git大有帮助。而且一般读懂了它的报错,不用任何帮助都能自己解决问题。
另外,git在做任何操作时都会非常谨慎。也就是说,任何有可能造成你的文件丢失、修改被覆盖等等操作,git都会拒绝,除非你显示的加上诸如--force等参数。
lv1= lv2= type=

repository 仓库

代码仓库,后面简称repo(仓库)。每个git管理的项目,在根目录下都有一个.git(隐藏)文件夹,里面存储了所有的commit、branch、tag、index等信息。进入.git,可以看到它的目录结构如下:
再看看它对应的server端的目录结构,基本是一样的:
不光是这个测试项目,所有的git仓库的目录结构都是一致的;除了目录结构,最关键的数据的存储结构也是一样的。这也是git和svn类的版本管理软件最大的区别,git把所有的信息,在本地都存储了一份,服务器上有的,他都有(只要你成功的执行了pull/fetch操作)!

index/stage area

使用命令行,index的掌握是关键。每次commit,都是commit index的内容,而非working-dir的内容!!上节已经讲过,所有的index信息,都是存在.git本地仓库中的。
将某个a.txt添加到index:
git add path/to/a.txt
也可以添加某一类:
git add *.txt
或者添加全部:
git add *
从index撤销a.txt:
git reset -- path/to/a.txt
撤销所有:
git reset
另外,很多时候我们需要撤销working-dir里某个文件的修改(将其还原到上次提交之后的状态,比如一些临时修改需要丢弃),可以用:
git checkout -- path/to/file
如果本地所有修改你都要丢弃(注意,这条目录丢弃所有的本地修改,用它前请确认你是否需要这样做!!):
git reset --hard

local & remote

基础练习 中,我们将git命令分为本地操作、远端(remote)操作两种。你执行一条命令,一定要清楚自己在干什么,很多人连是在操作本地仓库还是远端仓库都分不清楚。比如commit、push的区别,你清楚吗?因为中文的语境关系,有时可能会说你将修改提交以下,我看看,这里的提交,其实是指commit + push。但commit翻译成中文就是提交。。
另外需要注意的是,在解决冲突时,有的第三方工具,比如beyond comparer 会自动生成三个文件,BASE、LOCAL、REMOTE,这里的local/remote是另外的意思,不要误以为是在和remote(服务器)上的代码进行合并!
local操作操作的对象是working-dir & .git。也就是说,commit、merge、rebase等等这些操作,都只是在操作本地的git仓库的,和remote上的仓库没有半毛钱关系。本地操作不需要、也不可能有任何的权限控制 
所以几乎所有的操作,我们都是在操作本地仓库。除了clone/pull/fetch/push这几个命令之外(一些很不常用的,如ls-remote不讨论)。remote操作相对来说就很简单了,无非就是拉取(pull、fetch)和推送(push)。只不过因为涉及到多人同时操作,需要有一定的机制来保证不会产生相互间把对方的工作给覆盖掉了。其实思路有很简单,比如A、B两人先后往server上push同一个分支,当B再推送时,如果B的commits里面不包含A的commits,server就会拒绝这次推送。当然也可以强制覆盖,具体可参见git push的--force/--force-with-lease参数。可以push的情况,在git中叫做fast-forward(快进)。
这种设计有很多优势:
1、几乎所有的操作我们都是在操作本地仓库,对于本地仓库,我们拥有至高无上的权限,没有任何约束,你甚至可以完全删除working-dir和.git目录(当然,后果自负)。你可以保存任意多的临时代码、分支、tag,而且不用担心网络中断或者网速过慢导致无法工作!
2、working-dir与本地仓库间关注的是代码管理问题;本地仓库与remote仓库只关注数据传输问题,并不会涉及到任何的代码合并等问题。这是一种非常好的解耦设计。
3、本地仓库和remote仓库地位完全是对等的。体现在:
 a) 目录结构、数据存储格式是一致的(repository 仓库 
 b) 一个仓库,即可以做server,也可以做client。比如我们可以直接clone一个本地仓库:
做完修改还可以push:
但是如果你要推送到master分支会报错(因为u1的当前分支是master):
 c) 仓库间仅存在数据传送的关系,是及其松耦合的。从serverA上clone的commits,可以push到serverB上;反之亦然。也就是说,一个本地仓库可以对应对个远端仓库,并可与任意一个仓库进行数据交互。即使这些remote仓库对应的是完全不相关的项目!
具体可以参见git remote命令的官方文档

git rebase

rebase/merge分别什么时候使用:同一个分支的代码在归并时使用rebase,其他情况使用merge。
比如,你当前在master分支,做了修改并commit,之后拉取了server,发现server的master分支有更新,此时就要用rebase。
lv1= lv2= type=

权限控制

为了避免服务器上的仓库被人有意无意的破坏,或者仓库的内容是私密的,不想让其他不相关的人看见,一般情况下管理员会给需要访问的人员一个RSA的私钥文件,拿到以后放到用户主目录下的.ssh文件夹下,并重命名为id_rsa。如果你用的是乌龟,需要将其转换为ppk格式。可以参考这里

tortoisegit 乌龟

乌龟在进行一些复杂操作时还是很有优势的。学习乌龟,首先要能看懂乌龟的历史图。

git

learn

点赞(0) 阅读(318) 举报
目录
标题