git操作
一.My
1.git merge --no-ff my_branch
2.git commit -am 'test'
3.发现不想使用当前提交,git log查看历史,选取一个较远的节点,commit id为版本号
4.git reset --hard 较远节点号
5.git pull得到当前远程的代码
6.git merge --no-ff my_branch,git commit,git push
二.简单提交流程
1.git status:查看工作区与暂存区的代码区别;用来随时查看工作区状态;有未提交的修改 用git diff fileName来查看做了哪些修改;
2.git add fileName:将当前工作区中fileName文件修改的代码添加到暂存区;
git add . :将当前目录修改的所有代码全部添加到暂存区;
3.git commit -m '注释':将暂存区内容添加到本地仓库;
4.git push:将本地版本推送到远程仓库,如果当前分支只存在一个远程分支;
git push orgin master:orgin是远程主机,master是本地服务器上的master分支,远程分支名与本地相同都是master,如果远程有master分支,则推到远程master;若远程没有master,则在远程创建master,再推。
5.git commit -am '注释':-a 与-m的综合写法
6.为什么分add与commit:因为add一次添加一个文件,commit一次可以提交一批文件
三.git三个区域
工作区:看到的区域,在工作区修改代码
暂存区:代码编辑完成后,用git add将工作区文件添加到暂存区
历史记录区:git commit提交文件到本地当前分支
相关指令:
1.git checkout --fileName或git checkout .:将文件从暂存区复制到工作区,即用来放弃工作区的修改,不改变暂存区。
(1)checkout之前没有commit,即暂存区什么都没有,则撤销修改就是撤销工作区的修改,文件回到和版本库一样的状态
(2)checkout之前commit过,即暂存区已经存过改动了,工作区又有了新修改,这时撤销会回到commit之后的状态,即暂存区的当前状态。
四.只有本地没有远程的情况
1.不涉及push,就是add与commit,commit就是提交到本地的仓库(版本库中),会生成一个commit id,git log会显示时间从远到近的提交历史。
2.git需要知道当前是哪个版本:git中用HEAD表示当前版本,即最新提交的commit id;上个版本为HEAD^,上上为HEAD^^,上100个版本为HEAD~100。
3.git想回退上一个版本,git reset --hard HEAD^,此时代码回到上个版本;此时git log发现, 最新版本已是回退到的版本了,原本最新的版本没有了;但是想要到刚刚的版本,只要命令行没关闭,没清空------只要还有上一次git log的记录,还能找到刚刚的版本号commit id,就可以用git reset --hard 1009adsa(具体的commit id)来指定回到未来的某个版本。
4.git的版本回退速度很快,因为内部有个指向当前版本的指针HEAD,回退时,git只需要把HEAD的内容改为要去的commit id,把HEAD指向要去的commit id即可。
5.如果关机了,找不到刚刚的commit id了,用git reflog来查询每一个操作,与当时生成的commit id。
6.总结:回退到之前的某个版本,git log看版本号;回退到将来某个版本,git reflog查看版本号。
commit将暂存区数据一并提到分支。
7.注意:第一次修改-->git add-->第二次修改-->git commit,只会提交第一次修改的内容,因为第二次修改没有放入暂存区,提交只是把暂存区的修改提交;
所以,第一次修改-->git add-->第二次修改-->git add-->git commit,即把两次修改合并一起到暂存区,一并提交。
8.撤销工作区的修改:git checkout --fileName可以丢弃工作区的修改,把暂存区的代码复制过来
(1)fileName修改后还没放到暂存区(没add),撤销修改后和版本库的代码一样
(2)已经add到暂存区,然后又做了修改,checkout后代码是add暂存去之后的状态
9.如果你写了一些错误代码,add了并没有commit,git status发现fileName.txt还没有提交,
git reset HEAD fileName.txt(文件名) 将暂存区的修改撤销掉,重新放回工作区 -----.>>>git reset既可以回退版本,还可以把暂存区修改回退到工作区。HEAD表示最新版本,即把暂存区的修改吐掉。此时暂存区干净,工作区是有修改的状态。如果接着,git checkout --fileName.txt,那么工作区也就没有修改了。
10.如果有些错误代码,add并且commit提交了,那么就reset回退版本就可以了。
五.远程仓库
git分布式,同一个git仓库可分布到不同机器上:最早一个版本库,其他机器可以克隆这个版本库到本地------>>>每个机器的版本库都一样,没有主次。
实际情况:一台机器充当服务器,24小时开机,每个人从这台机器克隆到自己本地,把各自的提交推到服务器,也从服务器拉去别人的代码。
本地git就是本地,github就是远程,之间传输ssh加密,在github进行设置。--------->>>好处:不用担心硬盘大小了。
1.远程库的名字叫 origin,git的默认叫法,一看就知道是远程库。
2.把本地分支内容推到远程,git push;如果远程库分支master是空的,第一次推时git push -u origin master----->>git本地master分支内容推到远程master,并建立本地master与远程master的关联,以后的推和拉取变得简单。以后每次尽量指定名字与分支:git push origin master。
3.如果本地库为空,从远程克隆,用git clone,克隆一个远程仓库到本地。
4.分支:有个两周的任务,写了一些没写完不想提交;但是等写完提交,每天都有丢失进度的风险。--------->>自己创建一个分支,在本地,别人看不见,别人在原来的分支干活,你在自己的分支干活,想提交就提交,知直到开发完,一次将自己的分支合并到原来的分支----->>既安全,有不影响别人。
5.之前都是一条时间线,进行回退,因为对应只有一个分支,这条分支叫主分支,即master分支,HEAD是指向当前分支的,master是指向提交的。
每次提交,master节点向前移动一步,不断提交,分支越来越长。当新建分支dev时,git checkout -b dev,-b表示v创建并切换到dev分支,相当于下面两条:
git branch dev;与git checkout dev
再用git branch查看当前分支,会列出所有分支,当前分支*
这时,会建一个dev指针,指向与master相同的提交,再把HEAD指向dev,表示当前分支在dev上。
结论:创建一个分支,只需加一个dev的指针,改变HEAD的指向,工作区文件完全不改变。
从现在开始,修改和提交都是针对dev分支,每提交一次,dev指针向前移动一个,master指针不改变:
在dev上做修改后,commit;切到master上,并没有改变,因为改变在dev分支上。如果dev的工作结束,把dev合并到master上,git直接把master指向dev当前的提交,先切到master,git checkout master,再git merge dev:合并指定分支到当前分支。合并后,master与dev的最新提交内容一样了。
结论:合并分支很快,改变指针,不改变工作区文件。
合并后可以删掉dev分支,只剩master,git branch -d dev
6.解决冲突
相安无事可以快速合并,如果要合并的两分支都有各自新的更新,git无法快速合并,会有冲突。
如master原始readmex.txt中是Creating a new branch is quick,新建feature1分支,并修改readme.txt,增加为
Creating a new branch is quick and simple,feature1上commit;切到master上改为
Creating a new branch is quick & simple,并commit;这时两个分支都有各自的新修改:
这时,无法快速合并,有冲突,要手动解决冲突。
>>>>>>>> <<<<<<<<<< =========标示不同分支的内容,手动改为c要用的内容,再add,commit即可,分支变为:
git log查看分支合并情况:git log --graph --pretty=oneline --abbrev-commit
git log --graph看合并图。