Git分布式版本控制系统:
一、简介
- 随时掌握工作区的状态,使用
git status命令。 - 如果
git status告诉你有文件被修改过,可以用git diff查看修改内容。 - 在
git中进行修改后可以保存一个快照,称为commit,如果文件被删除,可以通过最近一个commit恢复。 - 使用
git log命令来查看历史记录。--pretty=oneline参数简要输出相关信息。
- 回退到上一个版本:
- 在
git中,HEAD表示当前版本,上一个版本就是HEAD^,上上个版本就是HEAD^^。(上100个版本HEAD~100。 - 把当前版本回退分层上一个版本,使用
git reset --hard <HEAD^>命令。 - 回到未来的版本,使用
git reset --hard <commit ID>(前提是命令行窗口未关闭,版本号可以写前几位即可) git reflog可以记录操作的每一条命令。
- 在
二、工作区和暂存区
- 工作区(working directory)
创建的文件夹就是一个工作区。 - 版本库(Repository):
工作区中隐藏的目录.git是Git的版本库。
版本库中存有(隐藏目录):- stage(index)暂存区
- Git自动创建的第一个分支:
master. - 指向
master的一个指针HEAD。 - 在往Git版本库中添加文件时,分两步执行:
- 1、用
git add把文件加进去,实际上就是把文件修改添加到暂存区; - 2、用
git commit提交更改,实际上就是把暂存处的所有内容提交到当前分支master。
- 1、用
需要提交的文件修改后通通放到暂存区,然后,一次性提交暂存区的所有修改。
三、管理修改
Git跟踪并管理的是修改,而非文件。
每次修改文件过后,如果不用git add将文件提交到暂存区,同样的文件也不会加入到commit中。1、撤销更改
在
git add之前发现文件修改有错,可以使用git checkout -- [filename]丢弃工作区的修改。
命令git checkout -- readme.txt有两种情况:
1、文件readme.txt自修改后还没有被放到暂存区,撤销修改就回到和版本库一模一样的状态。(还未使用git add)
2、文件已经被添加到暂存区后,又做了修改,撤销修改就回到添加到暂存区后的状态。(已经使用了git add后对文件进行了修改)
也就是让文件回到最近一次git commit或git add状态
如果git checkout -- file命令没有使用--,就会变成“切换到另一个分支”的命令。在修改文件并使用了
git add将文件放到了暂存区后,可以使用git reset HEAD <file>命令可以把暂存区的修改撤销掉(unstage),重新将文件放回工作区。
四、删除文件
当需要删除已给文件时,在工作区将文件删除后,需要从版本库删除文件git rm <file>。然后使用git commit -m ""进行提交,这样工作区和版本库都将该文件删除了。
如果在工作区中删错了文件,可以使用git checkout -- <file>将误删的文件恢复到最新版本实际上该命令是用版本库里的版本替换工作区的版本。
五、远程仓库
- 关联
github:
- 创建SSH Key:使用
ssh-keygen -t rsa -C "youremail@example.com"创建秘钥。 - 进入
.shh文件夹复制id_rsa.pub公钥中的内容到Github中的Add SSH Key中。
如果有多台电脑,则可以在每一台电脑中生成一个新的Key并添加到github中。
- 添加远程库:
- 在github上新建一个仓库后,同本地已有的仓库关联,然后把本地仓库推送到Github库:使用
git remote add origin https://github.com/soufal/my_git.git,这样添加后的远程库的名字就为origin,是git的默认叫法。
- 在github上新建一个仓库后,同本地已有的仓库关联,然后把本地仓库推送到Github库:使用
- 推送:
- 使用
git push -u origin master把本地库的所有内容推送到远程库。
这里使用加-u的命令是因为第一次推送master分支时,Git不但会吧本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或拉取时就可以简化命令了。
- 使用
- 从远程库克隆
1、创建于合并分支:
在Git中,每一次的提交,Git都会把这些提交串成一条时间线,这条时间线就是一个分支。一直在使用的默认分支叫做主分支。即master分支。HEAD严格来说是指向master的,master才是指向提交的。所以可以说:HEAD指向的就是当前分支。
一开始,master分支就是一条线,Git用master指向最新的提交,再用HEAD指向master,就可以确定当前分支以及当前分支的提交点:
当创建新的分支时dev时,git新建一个指针叫做dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
因此可以看出git创建一个分支很快,只需要增加一个指标dev,并修改HEAD的指向即可。修改过后,对工作区的修改和提交就只是针对dev分支了,而master指针不变:
如果在dev上的工作完成了,就可以将dev合并回master上。可以直接将master指向dev的当前提交(正如最开始创建分支一样),就完成了合并:
合并同样也很快,也只需要改指针。
合并完成后,可以删除dev分支,也就是把dev指针删除,删除后就值剩下一个master分支。
2、相关命令:
- 创建
dev:git checkout -b devgit checkout命令加上-b参数表示创建并切换。相当于:
1 | git branch dev |
- 可以使用
git branch查看当前分支。会列出所有的分支,当前分支前有一个*
当完成工作提交后,通过git checkout master命令返回master分支。
然后使用git merge dev把dev上的工作合并到master上。
该指令用于合并指定分支到当前分支。 - 合并完成后使用
git branch -d dev删除dev分支。 - 使用
git log可以查看分支合并情况。 - 使用
git log --graph乐意查看分支合并图。
3、分支管理策略
- 合并分支时,Git会用
Fast forward模式,在这种模式下,删除分支后,会丢掉分支信息。 - 使用
--no-ff方式的git merge会强制禁用Fast forward,这样git会在merge时生成一个新的commit,这样可以从分支历史上看出分支信息。 (创建新的commit可以用过加上-m参数实现)
在实际开发中,管理分支的几种原则:
master分支应该是稳定的,也是仅仅用来发布新版本,平时不在其上进行工作。- 工作都在
dev分支上,因为dev是不稳定的。 - 可以在
dev上再创建新的分支,和别人协同工作,最后再合并到dev上。如下图所示:
- Bug分支:
Git提供了一个stash功能,可以把当前工作现场“储存”起来,等当前临时工作做完后再恢复现场继续工作:git stash。- 确定bug需要在哪个分支上修复,就在那个分支上创建新的临时分支。
- 恢复工作区:使用
git stash list查看之前隐藏的工作区。恢复方法有两种:- 使用
git stash apply恢复,但是恢复后,stash的内容并不删除,需要再使用git stash pop来删除。 - 使用
git stash pop,恢复的同时会把stash的内容也删了。 - 可以多次
stash,使用git stash list查看,然后恢复指定的stash。
使用git stash apply stash@ {id}。
- 使用