“git init”:把一个目录变成Git可以管理的仓库
“git add a.txt b.txt” :将一个或多个文件的修改从工作区放到暂存区,多次执行该命令的话,相当于把多次修改放到暂存区
“git commit -m ” 将暂存区的多次修改,一次性提交到本地仓库的分支
“git status”:查看操作结果,告诉你有文件被修改过。查看暂存区(staged)和工作区的修改。
“git diff”:可以查看文件的修改内容
“git log ”:查看从最近到最远的提交日志,后面加上“–pretty=oneline”可将同一个版本的信息放到一行。
“git reset”:既可以回退版本,又可以将暂存区的修改回退到工作区。
"git reset -hard HEAD":将版本库中的当前分支的版本重置到上一个版本。HEAD-当前版本,HEAD-上一个版本,HEAD^^上上个版本。“git reset --hard commit-id”之前重置到某一次提交的版本。
“git reset HEAD ” :将暂存区的修改撤销掉,重新放回到工作区。
"git reflog”:打印出你的每一次命令,方便查看所有的版本及命令操作。
“git checkout – file”:可以丢弃工作区的修改。把file在工作区的修改全部撤销。也是用版本库里的版本替换工作区的版本,一键还原。
“git checkout ”:切换到另一个分支
“git checkout -b dev”:创建一个分支dev并切换,相当于“git branch dev”和“git checkout dev”
“git branch ”:创建一个分支
“git branch”:查看当前分支
“git branch -d dev” :删除dev分支
“git merge dev” :将dev分支上的工作成果合并到当前分支上
“git rm ”:从版本库中删除某个文件
“git remote add origin git@github.com:michaelliao/learngit.git” :将本地的某个仓库与远程仓库进行关联
“git push -u origin master”:把本地库推送到远程库上。第一次是推送master分支时,加上了-u参数,git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后推送或拉取中可以简化命令
git log -graph 命令可以看到分支合并图。
git stash :暂存工作区修改
git branch -D :强行删除一个没有被合并的分支
git remote : 查看远程库的信息 -v参数可以显示详细信息
分布式版本系统最大好处本地工作可以完全不用考虑远程库的存在,本地仓库可以记录每次修改和版本,当有网络时,再将本地提交推送一下就完成了同步。而svn如果不联网,本地不能看到历史版本及修改。
一、git和svn区别
git:为分布式版本控制系统。①、不用联网。没有“中央服务器”,每个人的电脑都可作为一个版本库,不同电脑之前可以互相推送。但是实际应用中,也有一台充当“中央服务器”的电脑,方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。②、强大的分支管理。
怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以克隆这个原始版本库,而且每台机器的版本库其实是一样的,灭有主次之分。
svn:为集中式版本控制系统。版本库集中存放到中央服务器,必须联网才能工作,
二、创建版本库:
1、创建一个空目录(可省略)
2、通过git init 命令把这个目录编程git可以管理的仓库。此时,创建的目录下回多一个.git的目录,这个目录是fit来跟踪管理版本库的。
3、把文件添加到版本库。
第一步、用“git add readme.txt”告诉git,把文件添加到仓库。该命令可反复多次使用,添加多个文件
第二步、用命令“git commit -m ”告诉git,把文件添加提交到仓库
$ git add readme.txt
$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
注:所有的版本控制系统,只能跟踪文本文件的改动。而图片、视频这些二进制文件,没法跟踪文件的变化
三、版本回退、工作区和暂存区、管理修改、撤销修改、删除文件等
1、工作区和暂存区:
工作区:电脑上能看到的目录
版本库:工作区中的.git目录
暂存区:暂时存放修改的文件。通过git add 将工作区中修改的文件添加到暂存区
分支:最终存放修改的文件。通过git commit将暂存区的文件提交到分支。是一次性提交暂存区的所有修改。git commit后暂存区的内容清空
2、版本回退:
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL
HEAD 指向的版本就是当前版本,因此,git允许我们在版本的历史之前穿梭,使用命令git reset --hard commit_id
穿梭前,通git log
可以查看提交历史,以便确定要回退到哪个版本
要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL
3、管理修改:
git比其他版本控制系统优秀的原因就是git跟踪并管理的是修改,而非文件。
用git diff HEAD --readme.txt命令可以查看工作区和版本库里面最新版本的区别
多次修改提交到分支上可以的操作:
第一次修改 -> git add -> 第二次修改 -> git add -> git commit
每次修改,如果不用git add到暂存区,那就不会加入到commit中
4、撤销修改:
场景一:当你乱改了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout --<file>
场景二:当你不但乱改了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了场景1,第二步按场景1操作
场景三:已经提交了不合适的修改到版本库时,想要撤销本次提交,用命令git reset --hard commit-id
,不过前提是没有推送到远程库
场景四:推送到远程库中的修改撤销,没有办法做到。
5、删除文件:
当删除一个本地文件时,
①、用命令git rm 可以删除版本库中的一个文件。
②、如果删错了,同时该文件已经提交到版本库了,此时可以用git checkout – 将版本库里的版本替换工作区的版本,可以还原工作区的修改或者删除。但是,会丢失最近一次提交后修改的内容。
四、远程仓库
远程仓库
分布式版本控制系统:怎么分布?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以克隆这个原始版本库,而且每台机器的版本库其实是一样的,灭有主次之分。即便是同一台电脑的不同目录下,也可以克隆多个版本库。
现实情况:一台电脑充当服务器的角色,每天24小时开机,其他每个人从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器来去别人的提交。
可以自己搭建一台运行Git的服务器,也可以使用github网站(提供git仓库托管服务,只要注册一个账号,就可以棉服获得git远程仓库)。
本地git和github之前传输通过ssh加密。需要设置:
第一步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步
$ ssh-keygen -t rsa -C "youremail@example.com"
之后,可以再用户主目录下,有私钥id_rsa(不能泄露)和公钥id_rsa.pub文件。
第二步:登录github,打开“account setting”、“SSH keys”页面–>“add ssh key” 填上任意title,在key文本框里黏贴id_rsa.pub文件的内容。
若多台电脑往github提交,可以再github中添加多个key
1、添加本地仓库内容到远程库
①、将本地的某个仓库与远程仓库进行关联:使用命令“git remote add origin git@github.com:michaelliao/learngit.git
”
②、把本地库推送到远程库上:用命令“git push -u origin master
”第一次推送master分支时(加上了-u参数,git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来),在以后推送或拉取中可以用命令“git push origin master
”推送最新修改。
2、从远程库克隆
从0开发时,首先,登录远程服务器,创建一个仓库gitskills(创建目录–>git init);然后,用命令“git clone”从远程仓库中克隆一个本地库到自己电脑上。
git支持的协议:ssh(git://)、https(https://github.com/michaelliao/gitskills.git 速度慢,每次推送都需要输入口令,必须公司网络开放https)等
五、分支管理
分支管理作用:创建自己的分支,可以提交自己每天的工作,等全部完成后,再合并到主分支上。这样提安全,又不会对别人工作造成影响。
svn等也有分支,但是太慢,基本用不了。
git的分支切换只是指针的移动,所以很快。
1、创建和合并分支
master分支是一条线。git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点。
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
当创建新的分支dev时,git新建了一个指针dev,指向master相同的提交,再把HEAD指向dev,标识当前分支在dev上
从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变
假如在dev上的工作完成了,要把dev合并到master上,合并的方法是:直接把master指向dev的当前提交,再把HEAD指向master
合并完后,若删除dev分支,就把dev指针删掉
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d
2、解决冲突
当git 无法自动合并分支的时候,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是将git合并失败的文件手动编辑成我们希望的内容,再提交。
用git log -graph
命令可以看到分支合并图。
3、分支管理策略
实际开发中,分支管理的几个原则:
master分支只用来发布新版本,平时不能在上面干活,是最稳定的。
平时干活都是dev分支上,dev不稳定,
你和小伙伴都是在dev分支上干活,每个人又都有自己的分支,时不时往dev分支上合并就可以了。
合并分支的时候,加上–no–ff 参数就可以使用普通模式合并,合并后的历史有分支,即便分支被删除了,也能再主分支上看出曾经做过合并,而fast-forward合并就看不出来曾经做过合并。
禁用fast-forward模式下,git就会在merge时生成一个新的commit,这样从分支历史上就能看出分支信息了
3、bug分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除。
当手头的工作没有完成时,先把工作现场git stash 一下,然后去修复bug,修复后,再gitstash pop 回到工作现场。
4、feacture分支
开发一个新feature,最好新建一个分支
如果丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除
5、多人协作
多人协作的工作模式是这样的;
①、首先,可以试图git push origin 推送自己的修改
②、如果推送失败,则因为远程分支比你的本地更新,需要先用git pull 试图合并
③、如果合并有冲突,则解决冲突,并在本地提交;
④、没有冲突或者解决掉冲突后,再用git push origin 推送就能成功
git checkout -b branch-name branch-name origin/branch-name
,在本地创建和远程分支对应的分支
如果git pull
提示 no tracking information
,则说明本地分支和远程分支的连接关系没有创建,用命令 git branch --set-upstream-to <branch-name> orgin/<branch-name>
6、rebase
rebase 可以把本地未push的分叉提交历史整理成直线
rebase目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比
六、标签管理
打标签就是为某个版本起一个有意义的名字,他跟某个commit绑在一起。标签对应一个版本,也对应某一次commit
取某个标签的版本,就是把那个打标签时刻的历史版本取出来。
1、创建标签
命令 git tag 用于创建一个标签,默认为HEAD,带上时,是在某个提交上打标签
命令 git tag -a -m "bla…"可以指定标签信息
命令 git tag 可以查看所有的标签
2、操作标签
可以删除本地的标签,也可以删除推送到远程的标签
命令 git push origin 可以推送一个本地标签
命令git push orgin --tags 可以推送全部未推送过的本地标签
命令git tag -d 可以删除一个本地标签
命令git push origin:refs/tag/可以删除一个远程标签