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 dev
git 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}
。
- 使用