廖雪峰:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
流程图:
一、创建版本库
将所在目录变成git可以管理的仓库,
git init
二、添加文件到版本库
将readme.txt添加到暂存区里面去,
git add readme.txt
加:
将所在目录下的所有文件(包括隐藏文件)添加到缓存区里去,
git add .
更新文件内容后需要使用(-u会跟踪仓库包含文件的更新),
git add -u xx
将readme.txt(缓存区的所有内容)提交到仓库,
git commit -m 'readme.txt提交'
查看是否还有文件未提交,
git status
如果文件被修改,我们想知道到底改了什么内容,如何查看?
git diff readme.txt
三、 版本回退
当对readme.txt进行了多次修改并add和提交,如果想查看历史记录,
git log:显示按时间由近到远的显示日志
git log --pretty=online:简化信息的显示
HEAD代表版本,HEAD^代表上一个版本,HEAD^^代表上上个版本。
回退到上一个版本,
git reset --hard HEAD^
回退到上100个版本,
git reset --hard HEAD ~ 100
查看readme.txt的内容,
cat readme.txt
四、理解工作区和暂存区
工作区:即在电脑上看到的目录(.git隐藏目录版本库除外)
版本库:工作区的隐藏目录.git,这里存了很多重要的东西如,暂存区(stage)。
git为我们自动创建了一个分支master,和一个指向master的指针HEAD。
之前提到的添加文件至git,就是分为两步:
git add:即把文件添加到暂存区
git commit:即将暂存区的所有内容提交到当前分支
五、git撤销修改和删除文件的操作
1、撤销修改
(1)我们可以使用git reset -- hard HEAD^直接恢复到上一个版本
(2)使用撤销命令
git checkout -- readme.txt 即把工作区做的修改全部撤销。分为两种情况:
1)、readme.txt自动修改后,还没有add至暂存区,使用撤销命令就回到和之前版本库的内容状态
2)、已经放入暂存区,然后又再次修改,此时撤销命令使其回到刚刚暂存区后的状态。
2、删除文件
当我们直接在文件目录删除文件,或者使用rm命令删除后,此时使用git status命令查看后,发现报红。
原因是:文件没了,git认为还在,却找不到!
此时我们有两个选择,
选择1:直接commit,使git更新自己的记录
选择2:从版本库中恢复被删除的文件
即:git checkout -- xx.txt
删除本地仓库中的文件名,删除后需要commit,再push,
git rm -h 文件名
六、 远程仓库
1、先有本地库,如何关联github远程库
git remote add origin github仓库地址
git push -u origin 分支名 :将本地仓库分支上的内容传到 远程仓库的某个分支。
如:git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,git不但把本地的master分支内容推送到
远程新的master分支,还会把本地mater分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
推送成功后,可以立刻在github页面中看到远程库的内容已经和本地一摸一样了。
2、先有远程库,从远程库克隆
登陆github账号,创建新仓库
git clone https://github.com/xxxxx/xxxx
七、创建和合并分支
在版本回退里,每次提交,git都把它们串成一条时间线,这条时间线是一个分支。截至目前只有一条时间线,
在git里,这个分支叫主分支,即master分支。HEAD严格意义上不是指向提交,而是指向master,master才是
指向提交的,所以,HEAD指向的就是当前分支。
1、创建dev分支,然后切换到dev分支:
git checkout -b dev
注:git checkout 命令加上 -b参数表示创建并切换,相当于2条命令
git branch dev
git checkout dev
2、git branch查看分支,会列出所有的分支,当前分支会添加一个星号。
如果,先在dev分支上对readme.txt添加内容:66666。并add和commit提交
然后,此时切换到主分支master上,此时查看内容,会发现没有dev分支所添加的东西,why?
这是因为不是一个分支。。。。
我们可以把dev分支上的内容合并到master,在master上使用如下命令:
git merge dev
此时,master伤的内容就包含dev的了。。。
注:
上面的方式是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
合并后,就可以删除dev分支了,因为我们不用了嘛,如下:
git branch -d dev
总结分支的创建与合并:
查看分支:git branch
创建分支:git branch branch_name
切换分支:git checkoutbranch_name
创建+切换分支:git checkout -b branch_name
合并某分支到当前分支:git merge branch_name
删除分支:git branch -d branch_name
3、冲突问题
当在dev分支修改readme.txt ,如添加88888保存,然后又在master修改如添加99999保存。。此时如果在master分支上进行合并dev分支
时,就会出现冲突。。使用git status查看状态时,发现,原因在于修改了两处。
此时使用cat readme.txt查看时,会发现出现
<<<<<<< HEAD
88888
>>>>>>>dev
99999
二者分别表示主分支和dev分支修改的内容,此时只能把dev中所修改的内容与master保持一致。。
git log --graph:查看分支合并图
4、由于通常合并分支时,一般使用“fast forward”模式,在这种模式下,删除分支后,会丢掉分支信息。现在我们采用带参数
的方式来禁用“fast forward”模式。如:
git checkout -b dev
git add readme.txt
git commit -m "add merge"
git checkout master
git merge --no-ff -m "merge with no-ff" dev
git branch -d dev
git branch:可以看到,分支dev仍在
八、工作现场
工作中,每一个bug都可以通过一个临时bug修复,修复完成后,合并分支,然后将临时的分支删掉。
隐藏当前工作现场:
git stash
查看工作现场有哪些
git stash list
恢复工作现场:
(1)git stash apply恢复,恢复后,stash内容不删除,你需要使用git stash drop来删除
(2)git stash pop,恢复的同时直接把stash中的内容也删除
九、团队协作
当你从远程库克隆时,实际上git自动把本地的master分支和远程的master分支对应,并且远程库
默认名是origin。
(1)查看远程库的信息:git remote
(2)查看远程库的详细信息:git remote -v
1、推送分支
就是把该分支上所有本地内容提交到远程库中,推送时,要指定本地分支,这样git就会把
该分支推送到对应的远程分支上。
使用命令:git push origin master
一般,master是主分支,因此要时刻与远程同步。一些修复bug分支可以先合并到主分支,
然后由主分支master推送到远程。
二、抓取分支
创建远程origin的dev分支到本地来:
git checkout -b dev origin/dev
把现在dev分支推送至远程:
git push origin dev
设置本地dev分支与远程origin/dev分支的链接:
git branch --set-upstream dev origin/dev
pull代码:
git pull
团队协作一般是这样的:
首先,可以试图用git push origin branch-name推送自己的修改
如果推送失败,则因为远程分支比你本地更新的早,需要先git pull试图合并
如果合并有冲突,则需要解决冲突,并在本地提交。再用git push origin branch-name
参考链接:http://blog.csdn.net/free_wind22/article/details/50967723