Git
分布式版本控制系统
linux安装git
使用命令:==sudo apt-get git==
git创建仓库
mkdir learngit:创建一个learngit文件夹
cd learngit:移动到该文件夹下
pwd:可以显示该文件的路径
git init:把当前目录变成git可以管理的目录
所有需要git管理的文件都需要放到learngit目录文件下
git添加文件到仓库
将文件添加到仓库:==git add < file>==
提交文件到仓库:==git commit -m < message>==
-m后为本次提交
git版本回退
git log 查看历史记录
==gitlog== 命令显示从最近到最远的提交日志,最近提交为==append test==,上一次是==wrote a readme file==
commit后面字符串是++conmmit id++(版本号)
HEAD表示当前版本
HEAD^表示上一个版本
HEAD~100表示往上100个版本
git reset 版本回退
==git reset --hard < commit_id>==
git reflog 记录每一次命令
git 工作区和暂存区
电脑中能看到的目录,learngit就是一个工作区,工作区中隐藏的目录==.git==不算做工作区,而是git的版本库。我们把文件往git版本库中添加时分为两步:
==git add==将文件添加到暂存区;
==git commit==提交更改,将暂存区中的内容提交到当前分区
使用==git status==查看状态
管理修改
git只管理修改并不管理文件,使用==git add==命令之后,将工作区的修改放入暂存区中,==git commit==只负责吧暂存区的修改提交。
撤销修改
撤销修改分为3种情况:
工作区的文件已被修改,想要直接丢弃工作区的修改,使用命令:==git checkout -- file==
文件已修改并且添加到了暂存区,需要丢弃修改。第一步:使用==git reset HEAD < file>==,回到场景1,按照场景1操作。
文件已经被提交可以使用==git reset -hard < commit id>==版本回退撤销修改。
删除文件
在git中删除文件也是一种修改,使用==git add==添加文件,在文件管理器中使用==rm==命令删除文件,此时该文件在工作区和版本库中不一致,使用==git status==命令会告诉你哪些文件被删除
由上图可知test.txt文件被删除,此时有两种选择:
确实需要从版本库中删除该文件,使用==git rm==命令删除,并且使用==git commit==命令提交
误删了该文件,因为版本库中该文件仍然存在则可以恢复该文件==git checkout -- test.txt==
==git checkout==实质使用版本库中的版本替换工作区的版本
git 远程仓库
创建并连接远程仓库
git是分布式版本控制系统,同一个git仓库可以分布到不同机器上。最早只有一台机器有一个原始版本库,此后别的机器可以克隆这个原始版本库,而且每台机器的版本库没有主次之分,使用gitlab网站当做服务器。本地git仓库与gitlab仓库之间的传输是通过SSH加密的,所以需要先进行设置:
- 创建SSH Key。在用户主目录下,查看是否有.SSH目录,如果有,再看看这个目录下是否有id_rsa和id_rsa.pub,如果有则可以直接跳到下一步,如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:==ssh-keygen -t rsa -C "[email protected]"==需要把邮箱地址换成自己的邮箱地址,一路回车设置为默认值,密码设置为空
[图片上传中...(SSHkey.PNG-a831f0-1539505494951-0)]
穿件完毕后可以在用户主目录下找到.ssh目录,里面有==id_rsa==和==id_rsa.pub==两个文件,这两个就是SSH Key的秘钥对,==id_rsa==是私钥,==id_rsa.pub==是公钥。
-
登录==ynuosa.org==进入到其中的Gitlab并登录,在用户下点击==seeting==,找到左侧栏==SSH Key==,将公钥中的内容粘贴到==Key==中,==Title==部分任意即可,最后点击==Add Key==添加公钥。
添加远程库
本地仓库已经创建完毕,此时需要在GitLab上创建一个Git仓库,并且需要让两个仓库进行远程同步,这样GitLab上的仓库既可以用作本分又可以让其他人通过该仓库来协作。
- 登录并新建远程仓库
==https://gitlab.ynuosa.org/users/sign_in==新建一个project
- 关联本地仓库
创建好后LearnGit仓库仍然是一个空仓库,可以将已有的本地仓库与之关联,然后将本地仓库的内容添加到GitLab的仓库中,在本地==learngit==仓库运行下面命令:==git remote add origin [email protected]:Baolingyan/LearnGit.git==
其中==origin==是远程库的名字,这是Git的默认叫法,也可以换成其他名称。
- 将本地仓库中的所有内容推送到远程仓库上:==git push -u origin master==
将本地库的内容推送到远程,使用==git push==命令,实际是吧当前分时==master==推送到远程。由于远程库是空的,第一次推送是加上==-u==参数,Git不但会把本地的==mater==分支内容推送的远程新的==master==分支,还会把本地的==master==分支和远程的==master==分支关联起来,在以后的推送或拉去值就可以简化命令。推送成功后远程库的内容和本地库的内容一模一样:
从现在之后的每一次提交,就可以通过命令:==git push origin master==
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是没有联网都可以正常工作
从远程仓库克隆
先创建远程库。然后从远程库克隆。:
- 登录Gitlab,创建一个新的仓库,明教gitskills:
-
现在远程仓库已经准备好,使用==git clone==命令克隆远程仓库到本地库
分支管理
每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。到目前为止git中只有一条主分支,即==master==分支。开始时Git使用==master==指向最新的提交,再用==HEAD==指向==master==。就能确定当前分支,以及当前分支的提交点:
创建与合并分支
创建新分支:例如==dev==时,git新建一个叫做==dev==的指针,指向==master==相同的提交,再把==HEAD==指向==dev==,就表示当前分支在==dev==上。此时针对工作区的修改和提交就是针对==dev==分支了,比如新提交一次后,==dev==指针就往前移动一步,而==master==指针不变。
==git checkout -b < name>== 创建并切换分支;
==git branch== 查看当前分支
==git checkout < name>== 切换分支
当前分支为dev分支
合并分支:假如我们在==dev==上的工作完成了,就可以吧==dev==合并到==master==上。git直接把==master==指向==dev==当前的提交。
==git merge < name>==将name分区合并到当前分区上
删除分支:删除分支就是删除分支的指针。
==git branch -d < name>==删除name分区
冲突解决
当git无法自动合并分支时,必须先解决冲突再提交
使用命令==git checkout -b feature1==创建新分支:修改==readme.txt==文件的最后一行,改为:==
Creating a new branch is quick AND simple.再该分支上提交文件
切换到==master==分支,git会自动提示当前分支比远程分支超前1个提交,将==master==分支上的==readme.txt最后一行修改为==Creating a new branch is quick & simple.==提交文件
git会告诉我们readme.txt文件存在冲突,我们直接查看txt文件内容
Git用==<<<<<<<==,========,==>>>>>>>==标记出不同分支的内容。我们修改文件后再次提交并删除分支
分支管理策略
通常,合并分支时,Git有限使用==Fast forward==模式,但这种模式,删除分支后,会丢失分支信息。如果强制禁用==Fast forward==模式,Git就会在合并分支时生成一个新的commit,这样在分支历史上可以看出分支信息.使用命令==git merge --no-ff < name>==强制禁止Fast forward
可以看出不适用==Fast forward==模式merge时将会创建一个新提交。
bug分支
假设当前任务正在进行,但是必须先修改另一个任务的bug,这时需要新建一个分支修复bug,当前dev的工作不能提交。
git stash会把当前工作现场暂时存储,等恢复现场后继续工作。
修复工作场,使用==git stash apply==恢复,但是恢复后,stash内容并不删除,你需要用==git stash drop==来删除;另一种方式使用==git stash pop==,恢复同时删除stash内容。使用==git stash list==查看stash中的内容。
多人协作工作模式
试图使用==git push origin < branch-name>==推送自己的修改
如果推送失败,因为远程分支比你的本地更新更高,需要先用==git pull==试图合并
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用==git push origin < branch-name>推动就能成功
如果==git pull==提示==no tracking information==,则说明本地分支和远程分支的链接关系没有创建,用命令==git branch --set-upstream-to < branch-name> origin/< branch-name>==